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数据》 在FriendFeed的实践中,他们面临的问题是如何在不断增长的用户基数和数据量下,支持新功能的添加,同时不改变数据库的基础架构和已有的海量数据。这个问题的核心在于...
俄语(在下面查找英语) 它是什么?...-k, --key Remote key для логина, берётся с http://friendfeed.com/remotekey -f, --feeds Фид(ы) для загрузки, списо
-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 ...
"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.com强制下载图像文件。 安装此扩展程序时,未下载在当前窗口(或新选项卡)中打开的图像。 支持语言:English (United States)
为FriendFeed增加一点便利的浏览器扩展 能力: 用无聊的登录代替创意昵称。 但是,这会关闭。 用链接替换评论左侧的图标,点击链接将@login添加到评论中。 链接也可以作为评论的永久链接。 在浏览器中打开图片,...
对于friendfeed.com -在一个新的浏览器选项卡中打开一个帖子图片(不是bookmarklet图像,只有本地图片上传)。 friendfeed.com的扩展名-在新的浏览器选项卡中以完整尺寸打开帖子图像(不是书签图像,只有本地图像上传...
弗卢索FriendFeed 的开源 Android 客户端。 讨论: (意大利语) 要求: 改造, 毕加索, Gson, Jsoup, //jsoup.org Classifier4J, 批处理图标,
语言:English (United States) FriendFeed下载阻止程序 该扩展名防止friendfeed.com强制下载图像文件。 安装此扩展程序时,未下载在当前窗口(或新选项卡)中打开的图像。
此应用程序从您的个人资料开始,通过 DFS 抓取 FriendFeed 上的公共或可访问提要。 内容存储在 .tsv 格式的 sql-ready 关系文件中。 上传的文件和媒体也存储在单独索引的文件夹中。 有关索引和关系的更多信息,您...
抢好友有关存档项目的更多信息可以在 ...没有战士的奔跑要在战士之外运行它,克隆这个存储库,cd 到它的目录并运行: pip install seesaw./get-wget-lua.sh然后开始下载: run-pipeline pipeline.py --concurrent 2 YO
Pepyatka 是一个开源的 FriendFeed 克隆。 基本上,这是一个社交实时提要聚合器,允许您分享可爱的小猫照片、协调即将发生的事件、在 Internet 上讨论任何其他很酷的东西或在您的公司中设置私人 Pepyatka 实例。 ...
Tornado 是一个 Python Web 框架和异步网络库,它源自 FriendFeed 团队的需求,后来被 Facebook 收购并开源。在 Tornado 中集成 whisper 提供了实时数据处理和分析的能力,尤其是在大数据量的流式处理场景下。 ...
语言:English 此扩展程序在Friendfeed时间轴上显示评论日期。 此扩展使添加注释时更容易看到。 该信息已经在FF上存在,但是隐藏在气泡后面,需要将鼠标悬停在上面。 现在,您可以轻松查看评论日期。
for friendfeed.com - 在全尺寸的新浏览器选项卡中打开一个帖子映像(不是Bookmarklet Images,只有本机映像上传)。 friendfeed.com的扩展 - 打开一篇文章 在全尺寸的新浏览器选项卡中的图像(不是Bookmarklet ...
友谊赛精简版这是关于 FriendFeed 如何使用 MySQL 的想法的实现。 您应该阅读那篇文章以了解所有详细信息。长版把 MySQL 变成一个文档 db! 为什么? 每个人都对 NoSQL 感到非常兴奋。 除了删除 SQL 使事情具有神奇...