翻译 | AI科技大本营(rgznai100)
参与 | Shawn,周翔
作为数据库领域的顶级会议,VLDB (Very Large Data Base)是数据库研究人员、供应商、参与者、应用开发者、以及用户一年一度的主要国际论坛。今年的 VLDB 于 8 月 28 日——9 月 1 日在德国慕尼黑举行,涵盖了数据管理、数据库和信息系统研究领域的问题。
在这篇题为《 PaxosStore: High-availability Storage Made Practical in WeChat 》的论文中,微信团队介绍了微信中高可用性的存储系统——PaxosStore。该系统在存储层采用了组合式设计,针对不同存储模型开发不同的存储引擎。
以下是论文简介:
引言
在微信的业务单元中,以下关于存储服务的要求均属常规要求。
第一,大数据具备著名的三 V 特性: volume、 velocity、 variety(大量、高速、多样)。微信每天平均生成约 1.5TB 的数据,这些数据包含各种各样的内容,如文本信息、图像、音频、视频、金融交易以及朋友圈文章等。在白天,每秒发出的应用请求就有成千上万次,而且系统使用以单记录访问(single-record accesses)为主。
第二,高可用性是存储服务的首要特性。大多数应用的实现都要依赖 PaxosStore,例如点对点讯息传递、群聊、浏览朋友圈文章等。高可用性对用户体验至关重要。微信的大多数应用需要PaxosStore 的 latency overhead 控制在 20 ms 以内。而且,还必须按 urban scale 的需求来满足这样的延迟要求。
有效且高效的一致性保证。根本上,PaxosStore 使用 Paxo 算法处理一致性问题。尽管原始的 Paxos 协议有提供一致性保证,但是应用的复杂性(例如,复杂状态机器需要进行妥善的维护和跟踪)和高额运行成本(例如同步所要求的带宽)使得该协议无法为微信的综合业务提供支持。
弹性和低延迟。 PaxosStore 需要按城市级的需求来为低延迟读写提供支持。在运行时,需要妥善处理负载冲击(Load surge)。
跨数据中心自动容错。在微信的运营中,PaxosStore 的应用横跨全球多个数据中心的数千商用服务器。在如此大规模的系统中,硬件故障和网络中断屡见不鲜。容错系统应能在不影响系统整体效率的条件下,进行错误检测和恢复。
PaxosStore 是一个实用的高可用性存储解决方案,它的应用为微信后端提供了强大的存储支持。该系统在存储层采用了组合式设计,针对不同存储模型开发不同的存储引擎。PaxosStore 的特点在于,它将基于 Paxos 的分布式一致性协议(consensus protocol)提取出来作为一个中间件,隐含的多模型存储引擎在各种情况下都可以访问这个中间件。这种基于 Paxos 的存储协议在经过扩展以后,可以为针对各种应用构建的编程模型中各种各样的数据结构提供支持。而且,PaxosStore 采用 leaseless 设计,可以实现很好的系统可用性和容错能力。本论文的主要贡献可概括为以下几点:
我们介绍了 PaxosStore 的设计,重点阐述了一致性读写协议的构建及其运作方式。通过从存储层中解耦出一致性协议,PaxosStore 拥有很好的可扩展性,可以给为不同存储模型构建的多种存储引擎提供支持。
根据 PaxosStore 的设计,我们进一步论述了容错系统以及关于数据恢复的细节。文中描述的技术已在大型生产环境中实现了全面应用,它们使 PaxosStore 在微信所有的生产应用中达到了99.9999% 的可用性(此结果是通过对 6 个月的运行数据进行统计得出的)。
在日益成长的微信业务背后, PaxosStore 已经为其提供了两年多的支持。基于这些实践经验,我们探讨了 PaxosStore 设计上的取舍,并给出了我们的应用实践所得到的实验评估结果。
设计
通常,传统的分布式存储系统都是基于系统的单一存储模型构建的,对模型的设计和应用作出稍微调整以满足不同的应用要求。但是,这样的话往往必须在不同组件之间进行复杂的协调。虽然将多个现成的存储系统组合成一个综合系统可以满足不同的存储要求,但是这常常会使整个系统难以维护并且会削弱可扩展性。而且,每个存储系统都将数据一致性协议嵌入到存储模型中,针对一致性问题的相应的分解克服(divide-and-conquer)法可能很容易出错。这是因为整体系统的一致性保证是由单独的子系统的一致性实现度的耦合决定的。而且,需要跨模型访问数据(即跨多个存储子系统)的应用几乎无法利用任何潜在子系统的一致性支持,对于这种跨模型数据访问的情况,只能单独地自行应用一致性协议。
PaxosStore 采用组合式存储设计。存储层上应用有多个存储模型,只处理高可用性的实现问题,一致性问题则由一致性层处理。这使得每个存储引擎以及整个存储层可以按照需求进行扩展。由于一致性协议应用已从存储引擎中解耦出来,所有支持的存储模型在各种情况下都可以利用数据一致性保证。这也使得跨模型数据访问更易于实现。
这种编程模型层的设计和应用在技术上简单易懂,在本部分,我们主要介绍 PaxosStore 一致性层和存储层的设计细节。
一致层(consensus layer)
图2:存储协议栈
图5:PaxosLog-as-value for key-value storage
图10:迷你集群大小的测量
总结
在 PaxosStore 的开发过程中,我们总结了几个设计原则和经验教训:
建议不要通过妥协的单一存储引擎支持存储多样性,而是设计这样的存储层,让它能够支持为不同存储模型构建的多个存储引擎。这种方法有助于开发者在操作维护的动态方面进行有针对性的性能调整。
除错误和故障外,系统过载也是影响系统可用性的关键因素。特别是在设计系统容错方案时,我们必须对过载引起的潜在雪崩效应给予足够的重视。 一个具体的例子是在 PaxosStore 中使用迷你集群组(mini-cluster group)。
PaxosStore 的设计大幅借鉴了基于消息传递的事件驱动机制,这可能会涉及逻辑实现方面的大量异步状态机转换。 在构建 PaxosStore 的工程实践中,我们开发了一个基于协同程序和 socket hook 的框架,以便于以 pseudo-synchronous 方式对异步过程进行编程。这有助于消除容易出错的函数回调,并简化了异步逻辑的实现过程。
原文地址:
http://www.vldb.org/pvldb/vol10/p1730-lin.pdf