写点什么

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:173544

评论

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

Java类与对象,万物皆对象

未见花闻

6月月更

Disruptor 高性能堆内队列 系列二

Nick

Java Disruptor false sharing 6月月更 高性能堆内队列

Django API 开发:身份认证原理

宇宙之一粟

django 6月月更

JavaScript原型链继承与盗用构造函数继承

大熊G

JavaScript 前端 6月月更

Linux驱动开发_倒车影像项目介绍

DS小龙哥

6月月更

面试突击55:delete、drop、truncate有什么区别?

王磊

Java 面试

聚焦中国算力大会 | 浪潮集团肖雪: 数字化转型新场景激发算力需求

云计算

GIT 常见问题

甜甜的白桃

git 版本管理 6月月更

抖音测试小说频道:抖音早已不再是短视频平台

石头IT视角

OKALEIDO的NFT聚合交易,打造面向艺术家的Web3商业生态

BlockChain先知

服务管理与通信,基础原理分析

Java 架构 微服务 nacos Feign

C#入门系列(八) -- 方法定义

陈言必行

C# 6月月更

【Python技能树共建】正则表达式

梦想橡皮擦

6月月更

帮助中心对企业有用吗?要不要做帮助中心页面?

小炮

网络七层结构是干啥的? 看这篇文章就够了

郑州埃文科技

TCP/IP 网络结构 传输网络

leetcode 934. Shortest Bridge 最短的桥(中等)

okokabcd

LeetCode 搜索 算法与数据结构

协同办公市场暴增背后:融云通信能力是需求重点

融云 RongCloud

一二三线互联网公司划分标准和榜单

laofo

研发效能 互联网公司 一线大厂 二线互联网 一线互联网

什么是加密?有哪些加密类型和加密算法?逆天原创神作,值得一读!

wljslmz

加密 密码学 加密算法 网络技术 6月月更

【LeetCode】爱吃香蕉的珂珂Java题解

Albert

LeetCode 6月月更

SpringBoot官方支持任务调度框架,轻量级用起来也挺香!

沉默王二

Java springboot

如何搭建短视频app源码,实现短视频内容的播放优化

开源直播系统源码

APP开发 短视频源码

基于 spring-cloud-k8s 跨NS坑续集

Damon

微服务架构 云原生 6月月更

Apache.commons.lang3 的 isNumber 将会在 lang 4 的时候丢弃

HoneyMoose

架构训练营模块三作业

融冰

spring4.1.8初始化源码学习三部曲之二:setConfigLocations方法

程序员欣宸

Java spring 6月月更

在 Flutter 中以编程方式截取任何 Widget

坚果

6月月更

深入浅出Spring事务的实现原理

清风

spring 原理 事务 源码学习 深入浅出

Fabric.js 元素被选中时保持原有层级🥁

德育处主任

web前端 前端可视化 FabricJS Fabric.js 6月月更

物联网低代码平台如何快捷管理资产?

AIRIOT

Web Service进阶(七)浅谈SOAP Webservice和RESTful Webservice

No Silver Bullet

6月月更 SOAP Webservice RESTful Webservice

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