网易云背后的数据库:Facebook开源,完全兼容MySQL( 二 )


  • 压缩效率高

网易云背后的数据库:Facebook开源,完全兼容MySQL

文章插图
 
在压缩效率方面,也是RocksDB更占据优势 。InnoDB压缩以page/block为单位来独立保持压缩后的数据,而文件系统是需要块对齐的,一般都是4KB,这就意味着一个16KB的页,即使压缩为5KB,也需要使用2个文件block,即8K保存 。其中的3KB空间填空 。
RocksDB很好得解决了这个问题 。每个block压缩后,先组合成一个SST文件,保存时只需要SST文件对齐到4KB即可 。
不足
在性能上,MyRocks相比InnoDB不足之处在于查询性能(主要是范围查询),在这方面,MyRocks通过使用布隆过滤器(Bloom Filter)进行了查询优化 。
相对来说,MyRocks作为一个年轻的开源项目,相比MySQL/InnoDB在成熟度上和功能完整度上有所欠缺,包括XA事务支持度不够、在线DDL性能不足且内存消耗过大、支持的索引类型偏少(无地理位置索引、全文索引等)等 。此外,Bug数也更多 。
 
【使用场景和实际效果】由于MyRocks完全兼容MySQL,因此,对于一般的,比如读写压力都不大、只需关系型数据库基本功能的业务场景下,MyRocks是完全可以替代MySQL的,但这不是MyRocks项目的存在意义,因为带来不了多少价值 。
MyRocks应该用在相比现有方案能够明显产生更多价值的场景,下面列举MyRocks典型的应用场景,并介绍在部分场景上的使用效果 。
大数据量场景这类场景典型的特点是数据量大,此外可能数据增长也很快,也可能有过期删除的需求等,这类场景包括用户行为,动态等 。我们曾与DBA对云音乐和考拉等业务的MySQL实例进行应用场景分析,发现这类场景的MySQL实例占有不小的比率 。
MyRocks由于具备更高地压缩比,可以极大缩小数据的存储空间 。降低这部分业务的存储开销 。而且MyRocks支持数据TTL(Time To Live)特性,可以设定数据过期时间,更加方便进行数据生命周期管理 。
目前云音乐有多个这类业务场景使用了MyRocks,这里拿云音乐的用户历史听歌记录为例 。
网易云背后的数据库:Facebook开源,完全兼容MySQL

文章插图
 
在没替换为MyRocks前,历史听歌记录为一个下挂有16个MySQL高可用实例的DDB集群 。数据采用InnoDB压缩表形式存储,每个节点数据约1TB,整个集群共32TB,如上图所示 。下图为替换为MyRocks后的情况,设置RocksDB的压缩算法为Snappy,单个节点的数据量降为322GB,节省了700GB 。整个集群可省下20TB SSD盘,节省了超过2/3的存储成本;由于计算资源利用率低,存储缩小后,可提高物理服务器的MyRocks实例部署密度,进一步节省计算资源;同时数据增长速度也得到控制,集群扩容周期变长 。
写密集型场景这类场景的特点是数据量不小,对写性能要求超过了MySQL/InnoDB的能力,且对读的延迟和平稳性有较高要求 。如果仅需高写入能力,那么可选择分布式KV系统,比如HBase,其提供了不弱于MyRocks的写入能力,且扩展性更好 。但若对读性能有较高要求,那么选择MyRocks会更好,因为基于C++实现的MyRocks没有Java的GC等问题,性能更加平稳 。
如果是数据量较小,且对读写均有较高要求的场景,可采用redis等缓存方案 。但若业务场景的数据量较大,使用缓存的方案成本就会过高 。
这类场景有推荐类、业务流水和日志类等等 。在网易公司内部各部门均广泛存在类似的场景,目前云音乐的实时推荐、离线推荐等,NOS内部数据反查服务等均已使用MyRocks,这里举云音乐实时推荐为例 。
网易云背后的数据库:Facebook开源,完全兼容MySQL

文章插图
 
在本案例中主要还是关心成本 。因为数据量比较大,需要大量的内存,而且随着推荐的实时化改进和推荐场景的增多,内存使用成本急剧增加,甚至可能出现内存采购来不及的情况 。
显然,单个MyRocks肯定扛不住全部的压力,于是仍采用DDB+MyRocks的方式将压力拆分到多个实例上 。但落到MyRocks的写入压力仍较大,虽MyRocks主库能够扛住,但由于MySQL主从复制跟不上,所以MyRocks从库延迟不断增加 。由于推荐类业务对数据一致性有一定的容忍度,所以,最终落地的方案是业务层双写2个MyRocks而不是MyRocks层做主从复制 。下图为当前的部署架构 。
网易云背后的数据库:Facebook开源,完全兼容MySQL

文章插图
 
图中分左右两部分,左边为8个MyRocks节点组成的DDB1集群,右边也是8个MyRocks组成的DDB2集群,推荐算法逻辑相关的单元用Flink来表示 。算法单元从DDB1读取上一周期的推荐数据,跟当前实时变化的新数据相结合计算出本周期的推荐数据,然后将其分别写入DDB1和DDB2 。推荐业务使用方从DDB2上读取所需的推荐数据 。


推荐阅读