脸书换数据库 存储空间节省90% 延迟少了50倍

由于早期设计的脸书Messenger架构已经开始不敷使用,而且也难以扩张新功能,因此脸书决定将Messenger的数据库从基于HDFS的开源分布式数据库HBase,转移到自家的开源数据库MyRocks,而且为了让系统转移的过程不影响用户的正常使用,特地规划了两套搬移流程,在两周的时间完成99.9%的帐户迁移,新系统带来的先进压缩方法让存储量减少90%,在使用快闪存储系统后读取延迟更是比过去少了50倍。

Messenger的用户现在高达10亿人,通过Messenger即时的分享文本、照片与视频等,但随着服务发展与扩张新功能,脸书发现是时候改变支持Messenger的基础架构了。脸书提到,最初Messenger被设计成类似电子邮件的功能,用户会在登录脸书网站时,看到在收件箱的消息,但是现在的Messenger已经不一样了,被发展成了即时通信系统,脸书为Messenger这一路的转变,更新了许多后端系统,并把原本单一的整体服务拆开成不同独立的系统,以支持移动优先的服务。

现在脸书还要对Messenger的存储基础架构进行大翻修,除了要提供更快更可靠的存储服务外,还要方便未来扩展新功能。这次的更新主要有三部分,第一是重新设计并简化数据格式。第二是将原本使用基于HDFS的开源分布式数据库HBase,转移到由脸书开发的开源数据库MyRocks上,而这是脸书耕耘许久将RocksDB数据库引擎集成进MySQL的开源项目。第三则是将存储设备从传统硬盘转移到快闪存储上。

为了确保在数据库转移时不影响所有用户的使用体验,脸书为搬移过程设计了两套流程,区分为一般搬移以及缓冲搬移。一般搬移针对一般的单一用户帐号,这个搬移的成立条件需要在搬移的过程没有数据写入帐户中,因此脸书为此定义了状态机,帐户在任何时间都会处于未搬移、双重写入或是已完成的状态。搬移工作开始时,会先存储一个旧系统最后一笔数据的位置,接着将数据搬到新系统中,完成数据复制后检查旧系统数据有无增加,没有增加就让未来新流量写进新系统中,并进入双重写入状态。假如在搬移的过程,仍有数据写进旧数据库,搬移系统便会将该帐号标记为失败,清除MyRocks中的数据,待下次再次进行搬移工作直到成功。

高流量帐号则无法使用一般的搬移流程,因为会不停的遭遇搬移失败,脸书表示,大型企业可能会用Messenger机器人来服务客户,所以没有空闲的时刻可以用来搬移数据,而且这种帐号的数据也会比典型的帐号大的多。脸书会为这些帐号设置一个开始搬移时间,并将这个时间的数据进行快照,并将快照复制进缓冲区层(Buffer Tier),再将缓冲区层的数据写入MyRocks,而复制旧数据的同时,新写入的数据则会被暂时缓存在Iris中(下图步骤D),一旦来自HBase的数据都被写到新系统后,该帐号便会进入双重写入状态,把缓存的数据接着写进MyRocks中。
脸书在两周内以一般搬移流程,转移了99.9%的帐号到新系统上,另外花了两周,以缓冲搬移​​处理完剩下的帐号。脸书表示,由于脸书在MyRocks中使用先进的无损数据压缩算法Zstandard,使数据副本(Replication Factor)数量可以从6个下降到3个,整体节省了90%的存储空间。他们也认为,与HBase相比,MyRocks能更成熟和更自动化的处理灾难恢复。而且MyRocks在读取和写入方面都进行了优化,尤其用在快闪存储系统上,读取延迟明显大降50倍,用户在读取历史消息的时候会非常有感。

由于HBase存在I/O限制,使得历史消息搜索这类读取任务繁重的功能难以实现,而脸书现在能直接将搜索基础架构创建在MySQL上,让用户可以快速的在桌面以及移动设备上,搜索他们的Messenger历史对话。