Facebook Delos 中的虚拟共识协议

news2024/11/23 9:03:39

背景
Facebook 的软件系统栈一般包括两层:上层是数据平面, 下层是控制平面。

facebook software stack

数据平面包括大量的服务,他们需要存储和处理海量数据。控制平面用来支撑数据平面,起到一些控制作用:调度、配置、命名、切片等等。控制平面通常是有状态的,比如控制的元信息,为了存储这些元信息,控制平面需要有自己的存储。控制平面对存储有以下要求:

容错:零依赖、可持久化、高可用。
丰富的 API:事务,范围查询,二级索引。
在 17 年的时候,  Facebook 使用几种组件来充当控制平面的存储,包括:

MySQL:API 丰富,表达能力强,但是不支持容错。
ZooKeeper:容错,零依赖,但是 API 表达能力弱。
可以看出,他们都不能很好的同时满足控制平面对存储的需求。此外,作为单体架构,上述组件都比较难改造成同时支持容错和丰富 API 的系统。此外,还有一大问题,团队当时所面临的工期非常紧。最终,他们交出的答卷是 —— Delos。

架构
Delos 是一个基于共享日志(shared log)的控制面存储系统。db 层的实例通过 append 和 read 与共享日志进行交互,从而保持对外状态的一致性。根据近几十年的研究,使用共享日志作为 API,可以很好的向 db 层隐藏共识协议的大量细节。

design based sharedlog

读写流程

 

read write procedure via shared log

存储服务可以分为两层,db API 层和共享日志 runtime 层。如上图,以表格存储为例,在上层,DelosTable 负责提供表格存储的 API;在下层,DelosRuntime 负责共享日志的读写。则,一个典型的写流程如下:

客户端发起一个写请求
DelosTable 层将其转发给 DelosRuntime
DelosRuntime 将该请求序列化后追加到共享日志
各个服务器侦听到该追加后,读取其内容,以同一种顺序将其应用到本地状态机
在该架构中,有两个关键的设计点:

共享日志层提供了具有线性一致性保证的极简 API
基于该简明 API,上层可以方便的提供不同存储接口的实现
虚拟共识
到此为止,该架构设计看起来相当简单,但我们知道,复杂性只能被转移,但不可能凭空消失。可以看到,最复杂的共识协议被隐藏在了共享日志后面,于是问题随之而来:

我们需要如何快速实现一个满足共识协议的的共享日志组件?
随着技术的发展,如果我们之后想用更好的共识协议,该如何进行替换?
为了解决这些问题,Delos 提出了虚拟共识(Virtual Consensus)。通过抽象出一层虚拟共识协议,Delos 的共享日志组件可以快速复用现有实现,比如 Zookeeper;之后为了提高性能,也可以借助此该层对下层进行不停机迁移。

在 Delos 中,虚拟共识协议的承载层被称为 VirtualLog。对上,db 层基于 VirtualLog 层进行实现;对下,VirtualLog 被映射成一组物理共享日志,称为 Loglets。每个 loget 提供和共享日志同样的 API,外加一个 seal 命令。一旦被 seal,Loglet 便不再接受追加。为了存储 VirtualLog 逻辑空间到 Loglets 物理空间的映射,Delos 引入了新的组件:MetaStore。

MetaStore 是一个带版本的简单 KV 存储。通过存储的不同版本的 Loglet 的切换,VirtualLog 就自然的将流量打到新的 Loglet 上。如下图展示了 VirtualLog 向 MetaStore put 一个新版本(ver0 -> ver1)的映射信息,将流量无宕机的从 Zookeeper 切换到了 LogDevice 的过程 。

virtualizing consensus via the VirtualLog

定制 Loglet
在满足基本需求后,为了进一步提升性能,Delos 想自己定制 Loglet,以满足以下特点:

简单:simple
快速:fast
容错:fault tolerant
NativeLoglet
只实现其中两点,比较容易;若要三者皆得,有点困难。Delos 通过分治策略,将其分解为两个组件:

MetaStore:进行容错
Loglet:专注性能
此时,所有一致性的来源便都移到了 MetaStore 之上。而 MetaStore 功能相对简单,只需保存空间映射,并提供容错的 reconfiguration 源语(即对映射进行操作,比如 loglet 切换),且 reconfiguration 是个低频操作。因此 MetaStore 的实现无需关注性能优化,只需要按照 Lamport 最初的 Paxos 进行实现即可,可以保证 MetaStore 实现的简洁性。

同时,将 Loglet 职能弱化,不再需要提供完全的容错机制,只需提供一个高可用的 seal 命令即可。如此一来,当一个 Loget 不可用时,VirtualLog 只需将其 seal,然后将流量切向其他 Loglet 即可。

据此,Delos 实现了新的 Loglet 实例——NativeLoglet 。

 

the NativeLoglet

直观感觉来说,NativeLoglet 类似一个弱化版的 LogDevice。其交互流程如下:

正常运行时,集群中某个 LogServer 充当 Sequencer
所有 DelosRuntime 发出的 Append 请求都要通过 Sequencer 定序后,追加到各个 LogServer
当 Sequencer 所在 LogServer 宕机后,DelosRuntime 直接向所有 LogServer 发送 CheckTail 请求,以 quorum 协议确定 tail
所有 DelosRuntime 都可以发起 seal 请求,对 NativeLoglet 进行 seal
注意,NativeLoget 中所有 LogServer 可以和 DelosRuntime 部署在一块(称作 Converged 模式),也可以单独部署(称作 Disaggregated 模式)。前者能够获取更好的本地读性能,并且让数据库实例和日志实例生命周期绑定。后者将数据库层和日志层分离,可以避免不同层的资源争夺,并允许各自按需伸缩。

converged vs disaggregated

下图是一个替换 NativeLoglet 后的性能提升对比:

 

NativeLoglet compare

StripedLoglet
为了进一步提升性能,在 VirtualLog 的抽象下,Delos 利用分片思想又造出了一种叫做 StripedLoglet 的实现。该实现在底层组合了多个 Loglets 实例,当 Append 请求到来时,将其 round robin 的打到各个底层 Loglet 系统中,从而极大提升性能。

此外,StripedLoglet 允许多个 DelosRuntime 使用不同策略进行并行 Append,并且允许暂时的空洞存在,之后使用类似滑动窗口的机制,进行捎带 ACK,从而进一步提升性能。

底层多个 Loglet 系统可以视情况共享一个集群或分散到多个集群.

striped loglet

The Last Thing:VirtualLog Triming
此外值得一说的细节是,VirtualLog 提供的 Trim 操作。得益于虚拟化的抽象,Delos 可以通过删除映射,将老的日志进行移除。当然,一种更好的做法是,将老的日志移动到 BackupLoget 的冷集群中,然后改变映射,对外提供一种无限日志的抽象,进而允许按年龄对不同日志段进行细粒度的存储控制。

另一方面,通过修改 MetaStore 中的映射,Delos 允许修改单个日志记录,对某些有问题的日志进行删除,以避免系统 hang 住或者反复重启宕机。这是之前的一致性协议无法做到的。

 

trimming the VirtualLog

结语
Delos 位于 Facebook 系统的底层(用于控制面的存储),它采用分层的设计,使得:

在项目之初,可以在某些层复用现有系统,进行快速上线,投入使用。
在上线之后,允许不停机的替换更高性能的组件、实验更新的一致性协议。

summary

虚拟共识之于分布式系统,有点像虚拟内存之于单机系统,通过分层解耦,使得设计者在系统构建时有更多腾挪空间。至于该思想是否能够实至名归,还得等待时间和实践的检验。

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1054590.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

XSS-labs

XSS常见的触发标签_xss标签_H3rmesk1t的博客-CSDN博客 该补习补习xss漏洞了 漏洞原理 网站存在 静态 和 动态 网站 xss 针对的网站 就是 动态网站 动态网站会根据 用户的环境 与 需求 反馈出 不同的响应静态页面 代码写死了 只会存在代码中有的内容 通过动态网站 用户体…

2023年中国火化设备行业现状分析:随着城市化进程的推进,市场需求将持续增长[图]

火化设备行业是指生产和提供用于尸体火化处理的设备和相关服务的行业。火化设备主要用于将尸体进行高温焚烧,将尸体转化为骨灰,以达到尸体处理和殡葬的目的。 火化设备行业优点 资料来源:共研产业咨询(共研网) 我国火…

C++面试八股(一)

目录 C和C的区别 1、语言特性 2、内存管理 3、C的库更加丰富 4、对异常的处理 什么是封装继承多态? 封装 继承 多态 new和malloc的区别 STL容器有哪些?容器对应的使用场景?(挑一个你认为最熟悉的容器) vector、…

评估指标Pre\Rec\F1\AUC

AUC的计算方法同时考虑了分类器对于正例和负例的分类能力,在样本不平衡的情况下,依然能够对分类器作出合理的评价。AUC代表模型预估样本之间的排序关系,即正负样本之间预测的gap越大,auc越大. 来自 https://blog.csdn.net/pearl8…

wustctf2020_name_your_cat

wustctf2020_name_your_cat Arch: i386-32-little RELRO: Partial RELRO Stack: Canary found NX: NX enabled PIE: No PIE (0x8048000)32位,开了NX和canary int shell() {return system("/bin/sh"); }有个后门函数 unsigned int…

AutoHotkey ---- 统一所有软件的快捷键(分析篇)

文章目录 引言理论编程方案 引言 快捷键大家都不陌生.但是目前的快捷键普遍存在以下几个问题。 不统一,即word、ppt、浏览器、各种编辑器、邮件客户端等等,都有属于自己的一套快捷键。快捷键冲突,即不同软件使用了相同的快捷键,而且作用域是…

GNN PyG~torch_geometric 学习理解

目录 1. PyG Introduction 2. PyG Installation 2.1 PyG 安装常见错误及原因 2.2 PyG 具体安装步骤 3. torch_geometric packages torch_geometric.data.Data Dataset 与 DataLoader Dropout、BatchNorm 3. torch_geometric: 理解edge_index 3.1 理解 mini-batch edg…

[H5动画制作系列]帧代码运行顺序测试

刚开始接触Animate CC(过去叫:Flash),对于帧代码的执行顺序十分迷惑。所以,专门做一个简单代码顺序测试. 准备工作: 代码图层actions,第1帧和第10帧为关键帧。 背景图层bg,就一个字符串红色Test.界面如下: 代码测试步骤: 第1帧参考代码如下: 第10帧参考代码如下: …

​68条萝卜刀《乡村振兴战略下传统村落文化旅游设计》许少辉八一新书

​68条萝卜刀《乡村振兴战略下传统村落文化旅游设计》许少辉八一新书 ​68条萝卜刀《乡村振兴战略下传统村落文化旅游设计》许少辉八一新书

打包python模块代码到pypi

python中,我们会在自己业务中,重复性的使用某些功能。我们可以把这些公用的模块,打包上传,然后给需要的人使用,pypi给我们提供了这个机会 本期目录 一、准备工作 二、编写文件 三、上传下载 一、准备工作 1、需要git…

k8s实战案例之部署Nginx+Tomcat+NFS实现动静分离

1、基于镜像分层构建及自定义镜像运行Nginx及Java服务并基于NFS实现动静分离 1.1、业务镜像设计规划 根据业务的不同,我们可以导入官方基础镜像,在官方基础镜像的基础上自定义需要用的工具和环境,然后构建成自定义出自定义基础镜像,后续再基于自定义基础镜像,来构建不同服…

软件测试之Python基础学习

目录 一、Python基础 Python简介、环境搭建及包管理 Python简介 环境搭建 包管理 Python基本语法 缩进(Python有非常严格的要求) 一行多条语句 断行 注释 变量 基本数据类型(6种) 1. 数字Number 2. 字符串String 3. 列表List 4. 元组Tuple 序列相关操作方法 …

Unity 鼠标悬浮时文本滚动(Text Mesh Pro)

效果 直接将脚本挂载在Text Mesh Pro上,但是需要滚动的文本必须在Scroll View中,否侧会定位错误,还需要给Scroll View中看需求添加垂直或者水平布局的组件 代码 using System.Collections; using System.Collections.Generic; using UnityE…

【生物信息学】使用谱聚类(Spectral Clustering)算法进行聚类分析

目录 一、实验介绍 二、实验环境 1. 配置虚拟环境 2. 库版本介绍 3. IDE 三、实验内容 0. 导入必要的工具 1. 生成测试数据 2. 绘制初始数据分布图 3. 循环尝试不同的参数组合并计算聚类效果 4. 输出最佳参数组合 5. 绘制最佳聚类结果图 6. 代码整合 一、实验介绍…

【BLIP/BLIP2/InstructBLIP】一篇文章快速了解BLIP系列(附代码讲解说明)

文章目录 BLIP系列1. BLIP1.1 动机1.2 整体架构1.3 损失函数1.4 Captioning and Filtering(CapFilt)1.4.1 Why?1.4.2 方法 2. BLIP22.1 Q-Former的设计2.2 实现功能2.2.1 图像文本检索(Image-Text Retrieval)2.2.2 图像字幕(Image Captioning)2.2.3 视觉问答(VQA)2.…

1. Flink程序打Jar包

文章目录 步骤注意事项 步骤 用 maven 打 jar 包&#xff0c;需要在 pom.xml 文件中添加打包插件依赖 <build><plugins><plugin><groupId>org.apache.maven.plugins</groupId><artifactId>maven-shade-plugin</artifactId><ver…

Python绘图系统24:绘图类型和坐标映射的关系

文章目录 类别与轴数坐标类别对映射的影像绘图类别对坐标轴的影响源代码 Python绘图系统&#xff1a; 前置源码&#xff1a; Python打造动态绘图系统&#x1f4c8;一 三维绘图系统 &#x1f4c8;二 多图绘制系统&#x1f4c8;三 坐 标 轴 定 制&#x1f4c8;四 定制绘图风格 &a…

CV面试知识点总结

一.卷积操作和图像处理中的中值滤波操作有什么区别&#xff1f; 1.1卷积操作 卷积操作是一种线性操作&#xff0c;通常用于特征的提取&#xff0c;通过卷积核的加权求和来得到新的像素值。1.2中值滤波 原文&#xff1a; https://blog.csdn.net/weixin_51571728/article/detai…

英飞凌Tricore原理及应用介绍06_系统定时器(STM)模块详解

目录 1.概述2 STM外设基本介绍3. STM模块使用原理3.1 64位数据如何同步读取?3.2 比较寄存器的原理?1.概述 STM全称为System Timer即系统定时器模块,在英飞凌Tricore芯片中,每个单独的CPU操作系统中配备一个系统定时器,为其操作系统程序调度提供时钟基础,在整个大系统中,…

【day9.30】消息队列实现进程间通信

write.c linuxlinux:~/23062/930$ cat write.c #include<myhead.h>#define ERR_MSG(msg) do{\fprintf(stderr, "__%d__:", __LINE__); \perror(msg);\ }while(0)typedef struct {long msgtype; //消息类型char data[1024]; //消息正文 }Msg_s;#define SIZ…