写点什么

Facebook 强一致性键值存储 ZippyDB 架构简介

  • 2021-10-11
  • 本文字数:1684 字

    阅读完需:约 6 分钟

Facebook强一致性键值存储ZippyDB架构简介

Facebook 工程团队最近发布了一篇博客文章,阐述了如何构建其通用的键值存储的,也就是 ZippyDB。ZippyDB 是 Facebook 最大的键值存储,已经投入生产环境超过了六年的时间。它为应用程序在各个方面提供了灵活性,包括可调整的持久性、一致性、可用性以及低延迟保证等方面。ZippyDB 的使用场景包括分布式文件系统的元数据、用于内部和外部目的的事件计数,以及用于各种应用特性的产品数据。


Facebook 的软件工程师 Sarang Masti 对创建 ZippyDB 的动机进行了深入分析:


ZippyDB 使用RocksDB作为底层的存储引擎。在 ZippyDB 之前,Facebook 的各个团队都直接使用 RocksDB 来管理他们的数据。这导致每个团队在解决类似的挑战时造成了工作的重复,比如一致性、容错、故障恢复、副本以及容量管理等。为了解决这些不同团队的需求,我们创建了 ZippyDB,以提供一个高度持久化和一致性的键值数据存储,通过将所有的数据转移到 ZippyDB 上并解决管理这种数据相关的挑战,大大提升了产品开发的速度。


一个 ZippyDB 部署(叫做“tier”)由分布到全世界范围多个区域(region)的计算和存储资源组成。每个部署都以多租户的方式托管多个用例。ZippyDB 会将属于某个用例的数据划分为分片(shard)。根据配置,它会跨多个区域为每个分片创建副本,从而实现容错性,这个过程可以使用Paxos或异步副本来实现。



图片来源:https://engineering.fb.com/2021/08/06/core-data/zippydb/


每个分片副本的子集都是某个quorum组的一部分,在这里数据会被同步复制,从而能够在出现故障的时候提供高持久性和可用性。如果以 follower 的形式配置了其他副本的话,将会采用异步复制的方式。Follower 能够让应用程序拥有多个区域内的副本以支持宽松一致性的低延迟读取,同时能够保持较小的 quorum 大小以实现更低的写入延迟。这种分片内副本角色配置的灵活性能够让应用程序根据自身的需要平衡持久性、写入的性能和读取的性能。


ZippyDB 为应用程序提供了可配置的一致性和持久性等级,它们可以在读取和写入 API 中以可选项的形式进行指定。对于写入来讲,ZippyDB 默认会将数据持久化到大多数副本的 Paxos 的日志中并将数据写入到主 RocksDB 上。这样的话,对于主节点的读取能够始终看到最新的写入。除此之外,它还支持一个更低延迟的快速确认(fast-acknowledge)模式,在这种模式下,在主节点上排队进行副本操作的时候,写入就会进行确认。


对于读取来讲,ZippyDB 支持最终一致、读取自己的写入(read-your-write,该模式指的是系统能够保证一旦某个条目被更新,同一个客户端发起的任意读取请求都会返回更新后的数据,参见该文章的阐述——译者注)和强读模式。“对于‘读取自己的写入’模式,客户端会缓存服务器在进行写入时得到的最新序列号,并且会在随后的读取查询中使用该版本号”。ZippyDB 在实现强读取的时候,会将读取操作路由到主节点上,从而避免与 quorum 进行对话。“在某些极端的情况下,主节点尚未得到更新的消息,这时候对主节点的强读就变成了对 quorum 的检查和读取。”



图片来源:https://engineering.fb.com/2021/08/06/core-data/zippydb/


ZippyDB 支持事务和条件性的写入,从而能够适用于要对一组键进行原子读取-修改-写入操作的使用场景。Masti 介绍了 ZippyDB 的实现:


所有事务在分片上默认是序列化的,我们不支持更低的隔离级别。这简化了服务器端的实现,并且便于在客户端推断出并行执行事务的正确性。事务使用乐观并发控制来探测和解决冲突,作用原理如上图所示。


ZippyDB 中的分片,通常被称为物理分片或 p 分片,是服务器侧的数据管理单位。应用程序将其核心空间(key space)划分为μshard(微分片)。每个 p-shard 通常托管着几万个μshard。根据 Masti 的说法,“这个额外的抽象层允许 ZippyDB 在客户端不做任何改变的情况下透明地重新分片(reshard)数据”。

ZippyDB 利用Akkio实现 p-shard 和μshard 之间的映射,从而得到了进一步优化。Akkio 将μshard 放置在信息通常被访问的地理区域。通过这种方式,Akkio 有助于减少数据集的重复,这样就为低延迟访问提供一个比在每个区域放置数据更有效的解决方案。


原文链接:

ZippyDB: The Architecture of Facebook’s Strongly Consistent Key-Value Store

2021-10-11 20:173607

评论

发布
暂无评论
发现更多内容

软件测试 | 测试开发 | Web测试方法与技术实战演练

测吧(北京)科技有限公司

测试

软件测试 | 测试开发 | 测试面经 | 从测试螺丝钉到大厂测试开发,三点成长心得和面试经验

测吧(北京)科技有限公司

测试

2021 金三银四面试必备?体系化带你学习:分布式进阶技术手册

钟奕礼

Java 架构 后端 java面试

小程序容器,组装式应用的一种方案

Geek_99967b

小程序

面试凉凉,阿里学长甩我一份24w字Java核心技术面试手册,真香

钟奕礼

Java 架构 后端 java面试

GitHub获百万推荐的面试涨薪秘籍(Java岗)惨遭封杀?

钟奕礼

Java 后端 java面试 后端架构

开源实习 | 毕昇JDK发布国密算法实习任务

openEuler

开源 openEuler 毕昇 JDK

iMazing高效便捷的数据转移功能

淋雨

ios iphone

软件测试 | 测试开发 | 测试面试真题|抖音的广告系统前后台,该如何测试?

测吧(北京)科技有限公司

测试

软件测试 | 测试开发 | WEB 端常见 Bug 解析

测吧(北京)科技有限公司

测试

小程序怎样影响传媒产业的数字化

Geek_99967b

小程序

概述服务网格的优劣势

穿过生命散发芬芳

服务网格 9月月更

从融云社交泛娱乐出海白皮书,看「社交+X」的全球攻略

融云 RongCloud

即时通讯 白皮书 泛娱乐社交

八家知名大厂联合手写的Java面试手册刚上线!竟就到达巅峰?

钟奕礼

Java 架构 后端 java面试

软件测试 | 测试开发 | Web测试方法与技术之CSS讲解

测吧(北京)科技有限公司

测试

软件测试 | 测试开发 | 一道大厂测试开发面试真题,你需要几分钟解答?

测吧(北京)科技有限公司

测试

Java高手怎样炼成?阿里大牛一份火爆GitHub的1046页笔记帮你解决

钟奕礼

Java 程序员 架构 后端 java面试

iMazing怎么恢复备份?iMazing恢复备份教程分享

淋雨

ios iphone

自有APP小程序如何打通微信登陆体系

Geek_99967b

小程序 小程序生态

测试开发面试真题 | 测试老兵进阶突破,成功挑战大厂 P7 Offer!

测吧(北京)科技有限公司

测试

BATJ互联网月薪38K的Java岗面试题首曝光,掌握这些大厂Offer指定跑不了

程序知音

Java java面试 后端技术 秋招 Java面试八股文

22年程序员更卷了,金九银十“面试必备小册”最新开源

程序知音

Java 阿里 后端技术 秋招 Java面试题

阿里被转载上100W次的Java面试题教程!已助我拿下9家大厂offer!

钟奕礼

Java 架构 后端 java面试

一次 Rancher 和 openEuler 的上云之旅

openEuler

Linux 开源 openEuler rancher suse

StratoVirt 中的 PCI 设备热插拔实现

openEuler

开源 操作系统 虚拟机 openEuler

软件测试 | 测试开发 | Web自动化之Selenium安装

测吧(北京)科技有限公司

测试

软件测试 | 测试开发 | Selenium 测试用例编写

测吧(北京)科技有限公司

测试

从规模化平台工程实践,我们学到了什么?

SOFAStack

公司内部分享文档应该怎么写?看这篇就够了

Baklib

阿里面试官内部题库,阿里发布2022年Java岗(正式版)面试题

程序知音

Java java面试 后端技术 秋招 Java面试八股文

数据治理的核心:维度建模下的数仓构建

Taylor

数据仓库 维度建模 维度 数仓分层 分层划域

Facebook强一致性键值存储ZippyDB架构简介_语言 & 开发_Eran Stiller_InfoQ精选文章