天涯社区高性能数据引擎Memlink正式开源 不指定

刘天斯 , 2010/11/21 22:26 , Linux , 评论(3) , 阅读(14459) , Via 本站原创 | |

Memlink是天涯社区统平台部近日推出的开源项目,项目托管地址:http://code.google.com/p/memlink/
为什么会有Memlink?

       对于大型论坛服务,比如百度贴吧、天涯论坛,日均发帖量过百万或千万,日均PV过亿,日积月累下来的帖子数量可能几十亿到上百亿。这种超级论坛,其海量存储、海量访问都是一个非常有挑战性的技术难题。

中 小规模的论坛(Phpwind/discuz)通常使用mysql/sql server作为后端存储,当数据量膨胀时,比如一个版面有百万、千万级别主贴,一个主贴下有数百万回复,此时使用SQL语句select … order by … limit … 进行数据查询和展现,性能可想而知。

大型论坛中的数据可以抽象为如下三类数据模型:

  1. Key=>Value结构数据。比如:版面信息、主帖信息、回帖信息等。主贴id对应主贴的信息(标题、发帖时间、作者等等),回帖id对应回贴的信息(回复内容、回复时间、回复者等等)。
  2. Key=>List结构数据。比如:主贴列表,主贴列表按发表时间或者最后回复时间进行排序;回复列表等等。
    Key=>List通常有如下特点:
    1. 可排序
    2. 可动态调整顺序
  3. 其他周边数据(SQL系统/检索系统)。比如:斑竹、会员、友情版面/链接等等,由于数据量较小、逻辑关系较复杂,可以使用sql系统存储;比如帖子检索可以使用检索系统。

        对于Key=>Value系统,市面上有较多选择,它们的数据容量大小从数百万到上百亿不等,性能、功能也各有差异,由于讨论KV系统的文章很多,再次不赘述。

对于Key=>List系统,市面上可选择的余地非常小,加之线上工业级别的一些要求,经对比了一些Key=>List系统(Redis),最终选择开发memlink系统,同时开源出来,也希望为业界同行提供多一种选择,繁荣开源社区。

Memlink简介

        Memlink 是一个高性能、持久化、分布式的Key=>List/Queue数据引擎。正如名称中的Memlink所示,所有数据都建构在内存中,保证了系统的 高性能(读性能大约是Redis几倍到十倍),精简内存(内存消耗大约是Redis的1/4),使用了redo-log技术保证数据的持久化。此 外,Memlink还支持主从复制、读写分离、数据项过滤操作等功能。

特点:

  • 内存数据引擎,性能极为高效
  • List中的Node采用块链组织,精简内存,优化查找效率
  • Node数据项可定义Mask表,支持多种过滤操作
  • 支持redo-log,数据持久化,非Cache模式
  • 分布式,主从同步
  • 读写分离,写优先处理。

与Redis区别

Redis同样也提供key=>list 存储功能,Memlink与Redis区别有:

  • Redis比较消耗内存。每个存储节点,在不支持vm的情况下要额外消耗12字节内存,在支持vm的情况下,每个节点额外消耗24字节内存。对于存储上亿条数据来说,额外消耗的内存太大。
  • Redis redo-log不够完善。redis提供了两种redo-log机制,机制一:每隔一段时间同步磁盘(此期间重启会丢失部分数据);机制二:追加log方式,会使log文件越来越膨胀,造成性能不优化(需采用额外命令减小log)。
  • 主从同步不完善。如果slaver因为某原因丢失了部分同步数据,需要重新完全获取一份主节点的所有数据。在大数据量的情况下,不太合适线上生产的需求。
  • 网络处理主事件循环只有一个线程,不能很好的利用多核;同时读写没有分离,没有进行写优先处理。
  • List中的Node没有mask表,不能进行一些属性过滤。

Memlink主要对上述特点进行了改进。

性能测试

硬件

  • CentOS release 4.6 (Final)
  • Kernel 2.6.9-67.0.22.ELsmp 32位
  • Memory 4G
  • CPU Intel(R) Xeon(R) CPU E5405 @ 2.00GHz (四核)
  • Disk 250G SATA

客户端

  • 10个客户端,并发短连接
  • Memlink内部开启4个处理线程。
  • Redis只支持单线程模型。结果表格中的hiredis为使用hiredis客户端测试的结果。redis为官方的redis-benchmark测试结果。
1w10w100w1000w
insertmemlink966596501007810183
hiredis9381948989938976
redis9285929092878835
mysql5623562154685306
range first100memlink17400175041661417292
hiredis1695163716961586
redis4629458745044545
mysql2210228619551611
range first200memlink15786157721596416180
hiredis711711719692
redis2941294929412857
mysql1444179118701402
range first1000memlink3795391837033250
hiredis118115116114
redis761739761735
mysql550692620686
range last100memlink169891650213118319
hiredis2132240202
redis4385191192
mysql8081-
range last200memlink159151559612203316
hiredis743229202
redis2941182192
mysql9491-
range last1000memlink389336413332299
hiredis120174192
redis756149182
mysql9491-

详细性能测试请见Benchmark

Client API

客户端命令描述:

命令名类型描述
dump管理立即复制一份内存数据到磁盘
clean管理重排某个key下的列表
stat管理统计信息
create创建key
del删除key下的某个value
insert在key下的列表中插入一条
update更新key下列表中某value在列表中的位置
mask修改某个value的mask信息
tag标记删除列表中的某个value或者恢复某个value
rmkey删除一个key,包括它的列表
range获取指定key下的列表中的某个范围的value
count获取指定key下列表的条数

详细客户端API请见ClientAPI

岁月无痕
2017/11/30 14:42
写得很好 学习了
青剑Steven Email Homepage
2011/06/19 01:24
你的博客回复验证码肉眼实在难识别(浅黄色的字,淡灰色的底),想刷新又点不了。没有办法,只有自己打开:http://blog.liuts.com/inc/securitycode.php?rand=0.6950039001116208页面刷新好多次才看清。弄的我想回复点什么都忘记了。
刘天斯 回复于 2011/06/19 09:49
为了防止广告短信,自己改造了验证码这块代码。呵呵~
安定 Email
2010/12/16 23:32
请教刘大师,Memlink应该算是一种NoSQL数据库吧?
刘天斯 回复于 2010/12/17 08:41
当然算,类似于redis。
分页: 1/1 第一页 1 最后页
发表评论

昵称

网址

电邮

打开HTML 打开UBB 打开表情 隐藏 记住我 [登入] [注册]