Facebook 迁移 Messenger 底层存储的过程

1. 背景

Facebook Messenger 用户超10亿,可以即时分享文字、图片、视频,产品自身不断的发展,背后的系统也在不断改变,开始是一个单体服务,后来变为有专门的缓存服务支持读、Iris 系统来队列化写、存储服务来保存历史消息。

为了更好的提升 Messenger 的用户体验,Facebook 对底层存储进行了本质性优化,主要包括:

  • 重新设计并简化了数据 schema
  • 从 HBase 改为 MyRocks(Facebook 开源的一个MySql存储引擎)
  • 把存储介质从旋转式磁盘改为最新的闪存

结果带来了更好的用户体验,也提高了系统灵活性,减少了延迟,减少了存储的消耗,升级过程是无缝的,没有停机。

2. 大规模迁移的挑战

MyRocks 可以带来很多优势,例如:

  1. 可以应用 Facebook 的开放式计算项目
  2. 可以使用闪存
  3. 更好的使用 Facebook 成熟的 MySql 运维管理经验
  4. 可以减少物理数据节点的数量,并获得更好的可用性

存储系统的迁移是必要的,但 HBase 中数据量巨大,而且迁移过程中不能影响 Messenger 系统的运行。

迁移过程需要对 HBase 集群进行读取,这对产品来讲是个额外的负载,如果迁移动作过猛,会严重影响 HBase 的性能,甚至产生错误,影响用户体验。

迁移涉及的数据量非常大,是 PB 级别的,而且因为修改了数据 schema,必须仔细分析现有数据、处理大量的遗留数据、解决冲突,以保证用户看到和之前一致的数据。

所以,如何不影响10亿用户实现无缝迁移是个有趣的挑战。

3. 迁移方案

Facebook 设计了2个迁移流程,一个是正常流程,用于处理 99.9% 的账户,另一个流程用于处理剩下的特殊账户。

迁移过程会进行严格的数据验证,提前准备好回退方案,并做好检查工作,保证没有漏掉任何一个账户,当一切都没有问题后,老系统下线。

3.1 正常迁移流程

迁移前后的数据必须是强一致的,迁移一个账户时有一个前提假设:迁移过程中,此账户没有数据写入。

为了保证这点,定义了状态机制和监控工具,当迁移开始时,会记录下来此账户在旧系统中数据的最后位置,然后把数据迁移到新系统,完成后,检查旧系统中数据的最后位置是否变化,如果没变,此账户在新系统就可用了,开始新旧系统双写,否则,此账户迁移失败,清除新系统的数据,等待下一次的迁移工作。

在双写阶段,迁移器会执行双重验证:

(1)数据验证

确认 HBase 和 MyRocks 中的数据是匹配。

(2)API验证

在读取数据时同时从两个系统中一起读,然后比较结果数据是否一致。

如果数据验证发现了问题,就进行回退,继续从旧系统读数据,清除新系统中的数据。

3.2 使用缓存迁移流程

有些账户比较特殊,比正常的账户要大很多(例如企业的客服机器人账户),不能使用正常的迁移流程,所以设计了缓存机制。

在某个时间点对账户数据进行快照,保存快照到缓存中,然后把缓存中的数据迁移到 MyRocks。

迁移过程中有新的写操作怎么办?Iris 会对写操作入队(Iris 可以使数据在队列中保存数周,支持海量数据的写入),当缓存中的数据迁移完成后,新系统从 Iris 队列中消费积累下来的写操作,消费完成后,就追赶上了旧系统,两个系统就一样了,之后的流程与正常迁移流程相同。

4. 迁移后的好处

  • 存储空间

简化后的数据 schema 使存储空间大大减少,而且因为 MyRocks 和 HBase 架构的不同,使得用于复制的资源减少了一半,所以,总体来看,存储上的消耗减少了90%。

  • 延时

MyRocks 在读和写都进行了优化,并且使用了闪存,在数据延迟上比旧系统减少了50倍,用户可以感知到,例如回看旧消息时快了很多。

  • 维护成本

相比于 HBase,MyRocks 在 Facebook 更加成熟,有更加智能的机制来处理灾难恢复,不需要人工的操作。

  • 对产品的支持

新系统的架构和性能也使得产品更容易添加新特性,例如移动消息内容搜索,之前使用 HBase 时较难实现,在新系统中就比较容易。

以上内容翻译整理自Facebook官方文章

https://code.fb.com/data-infrastructure/migrating-Messenger-storage-to-optimize-performance

原文发布于微信公众号 - 性能与架构(yogoup)

原文发表时间:2018-07-12

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏北京马哥教育

Uread 自动化运维平台七大阶段实践

首先技术并没有好坏之分,只能说一种技术在特定场景会优于另一种技术。 首先uread优读( http://aiuread.com/ )作为一个还处于起步阶段的团队...

36840
来自专栏IT笔记

MongoDB从入门到“精通”之3.0介绍

这其实是一篇水贴!!! ? 123465789.png MongoDB 3.0 版本标志着 MongoDB 数据库进入了一个全新的发展阶段,提供强大、灵活而且易...

30750
来自专栏CSDN技术头条

吴英昊:电商搜索引擎的架构设计和性能优化

前当当网高级架构师吴英昊对电商搜索引擎的架构进行了深入分享。在演讲中,他首先就电商搜索引擎的特点进行了解析,随后更分享了电商搜索引擎的架构、数据更新、故障恢复等...

564100
来自专栏FreeBuf

保护你的隐私:10项你必须知道的iPhone/iPad iOS 8安全设置

也许你并不知道,苹果iOS 8里包含了多项追踪你的地理位置和个人信息的功能,其中不少是默认开启的,很多APP和广告都在通过这些功能获取你的个人信息。 如果你忽视...

30060
来自专栏张戈的专栏

企业互联网+转型实战:如何进行PB级别数据的架构变迁

随着 DT 时代的来临,数据对于企业经营决策的价值日益凸显,而企业在进行互联网+转型的过程中,如何让数据架构平滑迁移到大数据平台,对于传统业务的转型升级至关重要...

45370
来自专栏服务端技术杂谈

Node.js 应该处于技术架构中的哪个位置?

很多人已经将Node作为JavaScript的Runtime了,视为一门后端语言。聊一聊究竟Node出现在架构的什么位置呢? 首先说下目前我了解到的技术架构,主...

37280
来自专栏技术翻译

理解分布式系统的8个谬误

你在分布式系统上工作吗?微服务,Web API,SOA,Web服务器,应用服务器,数据库服务器,缓存服务器,负载均衡器 - 如果这些描述了系统设计中的组件,那么...

17020
来自专栏Java后端技术栈

漫谈分布式架构的几种套路

今天小蕉跟大伙一起聊聊分布式系统的架构的套路。在开始说套路之前,大家先思考一个问题,为什么要进行分布式架构?

11310
来自专栏Java成长之路

分布式系统入门

分布式系统是一个硬件或软件组件分布在不同的网络计算机上,彼此之间仅仅是通过消息传递进行通信和协调的系统。 首先分布式系统一定是由多个节点组成的系统,一般来说...

21030
来自专栏企鹅号快讯

分布式架构的套路No.74

今天小蕉跟大伙一起聊聊分布式系统的架构的套路。在开始说套路之前,大家先思考一个问题,为什么要进行分布式架构? 大多数的开发者大多数的系统可能从来没接触过分布式系...

39290

扫码关注云+社区

领取腾讯云代金券