`

Friendfeed的MySQL key/value存储【转】

    博客分类:
  • java
 
阅读更多

http://timyang.net/data/friendfeed-mysql-schema-less/

 

 

这是一篇2009年初的资料How FriendFeed uses MySQL to store schema-less data,相信大部分人已经看过了。如Fenng的中文介绍FriendFeed 使用 MySQL 的经验。本文从不同的角度再补充下。作者几个月前也曾经在广州技术沙龙作过一次Key value store漫谈的演讲,许多参会人员对key value方向存在强烈的使用意愿,但同时也对完全抛弃MySQL存在疑虑,本文介绍的方案也可以给这些人员一些架构参考。

需求

250M entities, entities表共有2.5亿条记录,当然是分库的。

典型解决方案:RDBMS

问题:由于业务需要不定期更改表结构,但是在2.5亿记录的表上增删字段、修改索引需要锁表,最长需要1小时到1天以上。

Key value方案

评估Document类型数据库,如CouchDB
CouchDB问题: Performance? 广泛使用? 稳定性? 抗压性?

MySQL方案

MySQL相比Document store优点:

  • 不用担心丢数据或数据损坏
  • Replication
  • 非常熟悉它的特性及不足,知道如何解决

结论

综合取舍,使用MySQL来存储key/value(schema-less)数据,value中可以放:
Python dict
JSON object

实际friendfeed存放的是zlib压缩的Python dict数据,当然这种绑定一种语言的做法具有争议性。

表结构及Index设计模式

feed数据基本上都存在entities表中,它的结构为

mysql> desc entities;
+----------+------------+------+-----+-------------------+----------------+
| Field    | Type       | Null | Key | Default           | Extra          |
+----------+------------+------+-----+-------------------+----------------+
| added_id | int(11)    | NO   | PRI | NULL              | auto_increment |
| id       | binary(16) | NO   | UNI |                   |                |
| updated  | timestamp  | YES  | MUL | CURRENT_TIMESTAMP |                |
| body     | mediumblob | YES  |     | NULL              |                |
+----------+------------+------+-----+-------------------+----------------+

假如里面存的数据如下

{
"id": "71f0c4d2291844cca2df6f486e96e37c",
"user_id": "f48b0440ca0c4f66991c4d5f6a078eaf",
"feed_id": "f48b0440ca0c4f66991c4d5f6a078eaf",
"title": "We just launched a new backend system for FriendFeed!",
"link": "http://friendfeed.com/e/71f0c4d2-2918-44cc-a2df-6f486e96e37c",
"published": 1235697046,
"updated": 1235697046,
}

如果要对link字段进行索引,则用另外一个表来存储。

mysql> desc index_link;
+-----------+--------------+------+-----+---------+-------+
| Field     | Type         | Null | Key | Default | Extra |
+-----------+--------------+------+-----+---------+-------+
| link      | varchar(255) | NO   | PRI |         |       |
| entity_id | binary(16)   | NO   | PRI |         |       |
+-----------+--------------+------+-----+---------+-------+
2 rows in set (0.00 sec)

优点是

  • 增加索引时候只需要 1. CREATE TABLE,2.更新程序
  • 删除索引时候只需要 1. 程序停止写索引表(实际就是一个普通表),2. DROP TABLE 索引表

这种索引方式也是一种值得借鉴的设计模式,特别是key value类型的数据需要索引其中的内容时。

分享到:

相关推荐

    FriendFeed如何使用MySQL存储无Schema数据.pdf

    《FriendFeed如何使用MySQL存储无Schema数据》 在FriendFeed的实践中,他们面临的问题是如何在不断增长的用户基数和数据量下,支持新功能的添加,同时不改变数据库的基础架构和已有的海量数据。这个问题的核心在于...

    clio:Clio — 更好的 Friendfeed 备份工具

    俄语(在下面查找英语) 它是什么?...-k, --key Remote key для логина, берётся с http://friendfeed.com/remotekey -f, --feeds Фид(ы) для загрузки, списо

    frf-saver:另一个朋友提要,写给我个人使用

    -k="": remote key (see https://friendfeed.com/account/api) -d="./frf-save": directory to save data -f="": feed name to load (your username if not setted) -a=false: save 'username' and all his/her ...

    System Hardware Information Finder

    "Hardware\\Description\\System\\CentralProcessor\\0", 0, KEY_QUERY_VALUE, &hKey); // Check if the function has succeeded. if (result == ERROR_SUCCESS) { result = ::RegQueryValueEx (hKey, _T("~MHz...

    FriendFeed下载Blocker「FriendFeed Download Blocker」-crx插件

    FriendFeed下载Blocker 该扩展名防止friendfeed.com强制下载图像文件。 安装此扩展程序时,未下载在当前窗口(或新选项卡)中打开的图像。 支持语言:English (United States)

    friendfeed-and-co:为FriendFeed增加一点便利的Chrome插件

    为FriendFeed增加一点便利的浏览器扩展 能力: 用无聊的登录代替创意昵称。 但是,这会关闭。 用链接替换评论左侧的图标,点击链接将@login添加到评论中。 链接也可以作为评论的永久链接。 在浏览器中打开图片,...

    黄金视图Friendfeed图像缩放。「Golden View Friendfeed Image Zoom」-crx插件

    对于friendfeed.com -在一个新的浏览器选项卡中打开一个帖子图片(不是bookmarklet图像,只有本地图片上传)。 friendfeed.com的扩展名-在新的浏览器选项卡中以完整尺寸打开帖子图像(不是书签图像,只有本地图像上传...

    Flucso:FriendFeed 的开源 Android 客户端

    弗卢索FriendFeed 的开源 Android 客户端。 讨论: (意大利语) 要求: 改造, 毕加索, Gson, Jsoup, //jsoup.org Classifier4J, 批处理图标,

    FriendFeed Download Blocker-crx插件

    语言:English (United States) FriendFeed下载阻止程序 该扩展名防止friendfeed.com强制下载图像文件。 安装此扩展程序时,未下载在当前窗口(或新选项卡)中打开的图像。

    ferfer:从您的帐户开始遍历friendfeed.com 上的用户图,并将所有内容下载到相关文件中

    此应用程序从您的个人资料开始,通过 DFS 抓取 FriendFeed 上的公共或可访问提要。 内容存储在 .tsv 格式的 sql-ready 关系文件中。 上传的文件和媒体也存储在单独索引的文件夹中。 有关索引和关系的更多信息,您...

    friendfeed-grab:抓取整个朋友圈

    抢好友有关存档项目的更多信息可以在 ...没有战士的奔跑要在战士之外运行它,克隆这个存储库,cd 到它的目录并运行: pip install seesaw./get-wget-lua.sh然后开始下载: run-pipeline pipeline.py --concurrent 2 YO

    pepyatka:开源 FriendFeed 克隆

    Pepyatka 是一个开源的 FriendFeed 克隆。 基本上,这是一个社交实时提要聚合器,允许您分享可爱的小猫照片、协调即将发生的事件、在 Internet 上讨论任何其他很酷的东西或在您的公司中设置私人 Pepyatka 实例。 ...

    whisper-tornado 依赖

    Tornado 是一个 Python Web 框架和异步网络库,它源自 FriendFeed 团队的需求,后来被 Facebook 收购并开源。在 Tornado 中集成 whisper 提供了实时数据处理和分析的能力,尤其是在大数据量的流式处理场景下。 ...

    Friendfeed Timeago-crx插件

    语言:English 此扩展程序在Friendfeed时间轴上显示评论日期。 此扩展使添加注释时更容易看到。 该信息已经在FF上存在,但是隐藏在气泡后面,需要将鼠标悬停在上面。 现在,您可以轻松查看评论日期。

    Golden View Friendfeed Image Zoom-crx插件

    for friendfeed.com - 在全尺寸的新浏览器选项卡中打开一个帖子映像(不是Bookmarklet Images,只有本机映像上传)。 friendfeed.com的扩展 - 打开一篇文章 在全尺寸的新浏览器选项卡中的图像(不是Bookmarklet ...

    friendly:http

    友谊赛精简版这是关于 FriendFeed 如何使用 MySQL 的想法的实现。 您应该阅读那篇文章以了解所有详细信息。长版把 MySQL 变成一个文档 db! 为什么? 每个人都对 NoSQL 感到非常兴奋。 除了删除 SQL 使事情具有神奇...

Global site tag (gtag.js) - Google Analytics