写点什么

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

评论

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

质量基础设施一站式公共服务平台建设,NQI线上一站式平台开发

135深圳3055源中瑞8032

论文阅读丨神经清洁: 神经网络中的后门攻击识别与缓解

华为云开发者社区

神经网络 深度学习 论文阅读

【大咖直播】Elastic 企业搜索实战工作坊(第一期)

腾讯云大数据

elasticsearch

2021金九银十,啃完这35个Java技术栈,冲刺百万年薪不是梦

Java 架构 面试 程序人生 编程语言

刷爆Leetcode!字节算法大佬进阶专属算法笔记:GitHub标星97k+

Java 架构 面试 程序人生 LeetCode

阿里内部最新“SpringCloudAlibaba学习笔记”(全彩第三版)限时开源

Java 架构 面试 微服务 Alibaba

第5章-《Linux一学就会》- Linux基本操作和服务器硬件选购指南

学神来啦

Linux linux运维 linux学习 Linux教程

PerfDog携手Imagination,助力开发者获取GPU关键数据

WeTest

如何撬动企业数字化转型?智能客服是关键支点

ToB行业头条

GK架构营模4作业

Ping

音视频编解码 --X264码率控制初探

Fenngton

音视频 ffmpeg 编码 码率控制 引航计划

如何管理职场新人?

石云升

团队管理 管理 引航计划 内容合集 9月日更

应用开发中的存储架构进化史——从起步到起飞

Java 编程 架构 面试 后端

太牛了!从没见过哪位大佬能把《程序员必知必会的操作系统》知识点写得这么通俗易懂!

程序员知识圈

Java 程序员 架构 面试 编程语言

🏆【SpringBoot技术专题】「FtpServer文件服务」教你如何基于Springboot开发一个”可移植“的轻量级文件服务项目系统!

浩宇天尚

Apache springboot ftp服务 9月日更 FtpServer

AI专家一席谈:复用算法、模型、案例,AI Gallery带你快速上手应用开发

华为云开发者社区

算法 模型 案例 AI Gallery 应用开发

等保测评一次多少钱,收费标准是怎样的?

行云管家

网络安全 等保 等保测评 等保2.0

国庆临近,字节后端开发3+4面,终于拿到秋招第一个offer

Java 架构 面试 后端 计算机

车载高速CAN(HighSpeed CAN)通信基本原理讲解

SOA开发者

云原生时代,如何构建数字化转型架构?

博文视点Broadview

遇见乌镇 | VoneCredit洞见供应链金融新未来

旺链科技

世界互联网大会 供应链金融

三款Linux文件传输工具简单介绍-行云管家

行云管家

Linux 文件传输 IT运维

百胜中国使用Rainbond实现云原生落地的实践

Rex

Docker 行业资讯 案例分享 运维人生 kubenetes

解密秒杀系统架构,不是所有的系统都能做秒杀!

华为云开发者社区

架构 秒杀 电商系统

让数据库无惧灾难,华为云GaussDB同城双集群高可用方案正式发布

华为云开发者社区

数据库 高可用 集群 华为云GaussDB 同城双集群

一文带你掌握工作流引擎flowable所有业务概念

小鲍侃java

后端 引航计划

区块链食品溯源系统开发,区块链溯源的价值

135深圳3055源中瑞8032

如何使用ESD二极管,设计运算放大器电压保护?

不脱发的程序猿

电路设计 ESD二极管 运算放大器 电压保护 嵌入式硬件

金九银十面试如何得到面试官青睐?2021最新大厂Java面试真题合集(附权威答案)

Java 架构 面试 程序人生 编程语言

垂直CRM,能否走到终局?

ToB行业头条

ThingMap一键城市2.0重新出发:快速生成三维城市

森友小锘

地图 物联网 可视化 数字孪生

如何行之有效地参与开源?

如何行之有效地参与开源?

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