当前位置: 首页 > news >正文

图数据库 | 18、高可用分布式设计(中)

上文我们聊了在设计高性能、高可用图数据库的时候,从单实例、单节点出发,一般有3种架构演进选项:主备高可用,今天我们具体讲讲分布式共识,以及大规模水平分布式

主备高可用、分布式共识、大规模水平分布式,我们都知道这3套系统的实现复杂度是从低到高渐进的,但这并不意味着复杂度更高的系统在不同的应用场景、用户需求、查询模式、查询复杂度、数据特征条件下就能获得更好的效果。


分布式共识系统

前面提到即便在最简单的主备系统架构中也可能发生系统内无法保证一致性的情况,这是因为任何分布式系统在本质上都是异步分布式。所有操作(网络传输、数据处理、发送回执、信息同步、程序启动或重启等)都需要时间来完成,任何交易、任何事务处理在一个实例内都是异步的,而在多个实例之间这种异步性会被放大很多。分布式系统设计最重要的一个原则就是与异步性共存,不追求完美的一致性,但可以假设整个系统在大部分时间内是正常工作的,即便部分进程或网络出现问题,整个系统依然可以对外提供服务。

分布式共识系统,特别是分布式共识算法就由此应运而生,被用来保证即便在分布式系统中出现了各种各样的问题,但是整体服务依然可以保持在线。

分布式共识算法有3个核心特性:合法有效(validated proposal)​、达成一致(reaching agreement或unanimity)​、快速终止(processcan be terminated)​。

合法有效指的是进程间的指令信息传播需要基于合理有效的数据,且能让有效的进程集合达成一致,并且最终形成共识,进而终止同步过程的时耗需要在合理的、较短的时间内完成。在高性能分布式系统中可毫秒级完成同步,而在较大规模跨地域的分布式共识系统中,可能会出现秒级甚至需要人工介入的分钟级形成共识,具体的终止时间延迟取决于具体的业务需求。

达成一致等同于形成共识,类似于多个进程间的民主选举,一旦它们形成了共识,任何参与了选举的进程都不再允许对结果产生异议或按照与结果不符的方式或内容执行任务——这种情况就是我们前面提到过的分布式系统无法解决的“两军通信问题”​“拜占庭将军问题”​。

图1示意了多任务(多进程)间形成共识的过程,这一过程与我们日常生活中的行为并无本质不同。

图1: 多任务间形成共识


A、B、C、D四个人在一起讨论晚上去哪里,一开始A提议去看电影,得到了B的赞同,但是C很快提出去吃晚餐,D赞同C的提议,随后B改口赞同C的提议,最终A也改为同意C的提议。此时,四人达成了晚上去吃晚餐的共识。这就是多任务共识形成的简单例子。在实际的分布式共识算法中还会引入如角色、阶段以及如何终止共识等问题,下面逐一分析。

形成共识的过程需要有明确的终止算法,否则就会出现悬而不决、无限等待的问题。例如当某个实例(进程)下线后,剩余进程如果无限等待其重新上线,或是如图1所示,A、B、C、D四个进程出现层出不穷的新方案,以至于四人永远无法达成共识。共识算法需要考虑这些情况,并规避其发生。本质上,无论采用何种跨进程的集群内通信方式,都要使用尽可能简洁的算法,让共识的达成(进而终止)代价较低。

那么,分布式共识系统应该采用何种通信手段呢?前面提到过网络系统的3种通信方式:中心化(广播式)​、去中心化(分层区域广播或多播式)以及点对点分布式,对小型分布式系统而言,最简单和最直接的方式是广播式,因为发起广播者与信息接收者之间的互动逻辑决定了这个交互过程是属于“尽人事听天命”类型的单向一次性传送模式,还是其他更可靠的交互模式。

理解这个过程需要考虑这样一种可能发生的情况,即如果发起者A在发出请求给B、C后下线,但是并没有向D发送,那么在广播算法中,就需要考虑加上B、C可以向D继续广播的逻辑。从通信的复杂度角度看,这样的实现就是一种“可靠广播”模式,在有N个实例的分布式系统中,其复杂度为O(N^{2}),显然,这种漫灌式重度通信模式(floodingcommunication)对于大型分布式系统是不合适的,但是它已经具备了通过冗余通信来实现系统完整性、一致性的特征。

下面分析如何在分布式共识通信的过程中保证消息的有序性,即至少需要实现2个功能:多消息的事务性(原子性、不可分割性)和序列性。

一种比较简单的原子广播算法是分布式KV项目Apache Zookeeper中的ZAB(Zookeeper Atomic Broadcast)​,它把Zookeeper集群内的所有进程分为两个角色:领导者(leader)和跟随者(follower)​,3种状态:跟随(following)​、领导(leading)和选举(election)​;它的通信协议分为4个阶段:启动选举阶段(leader election phase)​、发现阶段(discovery phase)​、同步阶段(synchronization phase)​、广播阶段(broadcasting phase)​。

在启动选举阶段(阶段0)​,某个进程在选举状态中开始执行启动选举算法,并找到集群内的其他进程投票成为领导者。

在发现阶段(阶段1)​,进程检查选票并判断是否要成为两个角色之一,被选举为潜在领导者的进程称作意向领导(prospective leader)​,之后该进程通过与其他跟随进程通信发现最新的被接受的事务执行顺序。

在同步阶段(阶段2)​,发现过程被终止,跟随进程通过意向领导更新的历史记录进行同步。如果跟随进程自身的历史记录不晚于意向领导的历史,则向意向领导进程发送确认信息。当意向领导得到了主体选举人(quorum)的确认后,它会发送确认(commit)信息,这时意向领导成为确认领导(established leader)​。该阶段的算法逻辑如下:

在广播阶段(阶段3)​,如果没有新的宕机类问题发生,集群会一直保持在本阶段。在此阶段,不会出现两个领导进程,当前领导进程会允许新的跟随者加入,并接受事务广播信息的同步。

ZAB的阶段1~3都采用异步的方式,并通过定期的跟随进程与领导进程间的心跳信息来探测是否出现故障。如果领导进程在预定的超时时间内没有收到心跳,它会切换至选举状态,并进入阶段0,同样地,跟随进程也可以在没有收到领导进程心跳后进入阶段0。

在ZAB的具体实现逻辑中,leader选举是最核心的部分,ZAB采用的策略是拥有最新历史记录的进程会被选举为leader,并且假设拥有全部已提交事务(commitedtransactions)的进程同样拥有最新的已提议事务(most recent proposed transaction)​。当然,这个假设的前提是集群内的ID序列化及顺序增长,这一假设让leader选举的逻辑大幅简化,因此称为快速领导选举(Fast Leader Election,FLE)​。即便如此,FLE过程中的判断逻辑,特别是各种边界情况的考量依然很多,下面是节选的参与选举进程的FLE实现代码逻辑: 

 

ZAB最早是作为Yahoo!内部Hadoop项目的一个子项目,后来被拆分独立出来作为一款分布式服务器间进程通信及同步框架,并在2010年后成为Apache开源社区中的一个顶级项目。从上面的伪码中就可以看出,ZAB所采用的算法逻辑和通信步骤较为复杂。类似地,Paxos类算法的实现对于跨地理区域的系统实例间时钟同步有着严苛的要求,且算法逻辑复杂,不容易被理解。头部企业谷歌在其Spanner系统中通过原子钟的帮助实现基于Paxos的大规模分布式共识系统,但是对缺少同等系统架构把控能力的企业而言,Paxos就显得门槛过高了。 

在2013年之后,更简单、可解释的分布式共识算法应运而生,其中最知名的是2014年DiegoOngaro提出的RAFT算法及一种称作LogCabin的代码实现。

 在RAFT算法中,集群内的每个共识算法参与进程有3种角色:候选者(candidate)​、领导者(leader)和跟随者(follower)​。

与Poxos通过时钟同步来保证数据(事务)全局顺序一致不同(但是类似于ZAB)​,RAFT把时间块切分为terms(选举任期,类似于ZAB中的epoch)​,在每个任期期间(系统采用唯一的ID来标识每个任期,以保证不会出现任期冲突)​,领导者具有唯一性和稳定性。

RAFT算法有3个主要组件(或阶段)​:选举阶段、定期心跳阶段和广播及日志复制阶段。

图2示意了在一个3节点的RAFT集群中客户端与服务器集群的互动,整个流程围绕领导者角色进程展开,可分解为10步,而这只覆盖了RAFT算法的广播及日志复制阶段。 

图2:RAFT集群C/S工作流程步骤分解

如图3所示,3种角色及所负责的任务内容如下:

· 跟随者,不会主动发起任何通信,只被动接收RPC调用(Remote Procedure Calls)​。

· 候选者,会发起新的选举,对选举任期进行增量控制,发出选票,或重启以上任务。

在该过程中,只有含有全部已提交命令的候选者会成为领导者,并通过RPC调用的方式通知其他候选者选举结果,并避免出现split vote(平票)的问题(在RAFT算法中,通过随机选举超时,例如在0.15~0.3s间随机制造超时来避免因两个实例的候选进程同时发出导致选票计数出现平票)​。

另外,每个进程都维护了自己的一套日志,在原生的RAFT算法实现中称为logcabin(木筏)​。

· 领导者,会定期向所有跟随者发送心跳RPC,以防止因过长的空闲时间而过期(和重新选举)​。领导者通常是最先面向客户端进程请求的,对日志进程进行添加处理以及发起日志复制,提交并更改自身的状态机,并向所有跟随者同步log。

图3:RAFT共识算法集群进程间的角色转换关系


RAFT描述的是一种通用的算法逻辑,它的具体实现有很多种,并且有很大调整空间。例如,原始的RAFT算法与一主多备的架构类似,任何时候只有一个实例在服务客户端请求。如果我们结合图数据库的可能查询请求场景,完全可以分阶段地改造为如下几种(难度从低到高)​。

· 多实例同时接收读请求负载:写入依然通过leader节点实现,读负载在全部在线节点间均衡。

· 多实例同时接收先读再写类请求负载:典型的如回写类的图算法,全部节点都可以承载图算法,回写部分先进行本地回写,再异步同步给其他节点。

 · 多实例同时接收更新请求负载并转发:写入请求可以发送给任意集群内节点,但是跟随者会转发给leader节点处理。

· 多实例同时处理更新请求:这是最复杂的一种情况,取决于具体的隔离层级需求,如果多个请求同时在多个实例上更改同一段数据,并且有不同的赋值,会造成数据的不一致性。在这种情况下实现一致性的最可靠途径就是对关键区域采用序列化访问。这也是本章反复提到的,任何分布式系统在最底层、最细节、最关键的部分一定要考虑到有需要串行处理的情况。

目前已知的RAFT算法可能远超100种,如ETCD、HazelCast、Hashicorp、TiKV、CockrochDB、Neo4j、Ultipa Graph、嬴图等,并且以各种编程语言实现,如C、C++、Java、Rust、Python、Erlang、Golang、C#、Scala、Ruby等,足以体现分布式共识算法及系统的生命力。

在基于共识算法的高可用分布式系统架构中,我们做了一个比较重要的假设,即大多数时候,系统的每个实例上都存有全量的数据。注意,我们限定的是“大多数时候”​,言下之意是在某个时间点或切片下,多个实例间可能存在数据或状态的不一致性,也因此需要在分布式系统内通过共识算法来实现数据同步,以形成最终的数据一致性。

下篇继续聊大规模水平分布式。最近很忙,不过老夫会尽快更文。


· END ·



(文/Ricky - HPC高性能计算与存储专家、大数据专家、数据库专家及学者)

相关文章:

图数据库 | 18、高可用分布式设计(中)

上文我们聊了在设计高性能、高可用图数据库的时候,从单实例、单节点出发,一般有3种架构演进选项:主备高可用,今天我们具体讲讲分布式共识,以及大规模水平分布式。 主备高可用、分布式共识、大规模水平分布式&#xff…...

Java 读取 Windows 设备的唯一性标识及定位

在 Windows 系统中,获取设备唯一性标识及定位信息对设备管理、安全监控等场景意义重大。本文介绍 Java 中几种实现方法,如 JNA 库、WMI4Java 库及通过 JNI 结合 Windows API。 1. 使用 JNA 库读取 DEVPKEY_Device_ContainerId 在 Windows 系统中&…...

Spring boot框架下的RabbitMQ消息中间件

1. RabbitMQ 基础概念 1.1 消息处理流程与组件配合 Producer(生产者) 发送消息。消息先发送到 Exchange(交换机),而不是直接到队列。Exchange(交换机) 接收到消息后,根据 Routing …...

1 行命令引发的 Go 应用崩溃

一、前言 不久前,阿里云 ARMS 团队、编译器团队、MSE 团队携手合作,共同发布并开源了 Go 语言的编译时自动插桩技术。该技术以其零侵入的特性,为 Go 应用提供了与 Java 监控能力相媲美的解决方案。开发者只需将 go build 替换为新编译命令 o…...

ScratchLLMStepByStep:训练自己的Tokenizer

1. 引言 分词器是每个大语言模型必不可少的组件,但每个大语言模型的分词器几乎都不相同。如果要训练自己的分词器,可以使用huggingface的tokenizers框架,tokenizers包含以下主要组件: Tokenizer: 分词器的核心组件,定…...

G1原理—10.如何优化G1中的FGC

大纲 1.G1的FGC可以优化的点 2.一个bug导致的FGC(Kafka发送重试 subList导致List越来越大) 3.为什么G1的FGC比ParNew CMS要更严重 4.FGC的一些参数及优化思路 1.G1的FGC可以优化的点 (1)FGC的基本原理 (2)遇到FGC应该怎么处理 (3)应该如何操作来规避FGC (4)应该如何操…...

Java基础——概念和常识(语言特点、JVM、JDK、JRE、AOT/JIT等介绍)

我是一个计算机专业研0的学生卡蒙Camel🐫🐫🐫(刚保研) 记录每天学习过程(主要学习Java、python、人工智能),总结知识点(内容来自:自我总结网上借鉴&#xff0…...

2025.1.16——三、supersqli 绕过|堆叠注入|handler查询法|预编译绕过法|修改原查询法

题目来源:攻防世界supersqli 目录 一、打开靶机,整理已知信息 二、sqlmap解题 step 1:爆数据库 step 2:爆表 二、手工注入解题 step 1:判断注入类型 step 2:判断字段数 step 3:查询数据…...

浅谈计算机网络03 | 现代网络组成

现代网络组成 一 、网络生态体系1.1网络生态系统的多元主体1.2 网络接入设施的多样类型 二、现代网络的典型体系结构解析三、高速网络技术3.1 以太网技术3.2 Wi-Fi技术的深度剖析3.2.1 应用场景的多元覆盖3.2.2 标准升级与性能提升 3.3 4G/5G蜂窝网的技术演进3.3.1 蜂窝技术的代…...

Red Hat8:搭建FTP服务器

目录 一、匿名FTP访问 1、新建挂载文件 2、挂载 3、关闭防火墙 4、搭建yum源 5、安装VSFTPD 6、 打开配置文件 7、设置配置文件如下几个参数 8、重启vsftpd服务 9、进入图形化界面配置网络 10、查看IP地址 11、安装ftp服务 12、遇到拒绝连接 13、测试 二、本地…...

EWM 批次管理 / Batch Management

目录 1 简介 2 业务数据 2.1 基于 PO,创建 ERP LE - Delivery 内向交货单,同时同步到 EWM 内向交货单 2.2 在 EWM 内向交货单,创建批次。EWM 批次创建的前提条件来自于物料主数据批次分类(023)。SAP 提供的标准条件…...

Java 面试题 - ArrayList 和 LinkedList 的区别,哪个集合是线程安全的?

Java 面试题 - ArrayList 和 LinkedList 的区别,哪个集合是线程安全的? 在 Java 开发中,ArrayList和LinkedList是两个常用的集合类,它们在数据结构和性能上有诸多不同,同时线程安全性也各有特点。深入理解这些差异&am…...

初学SpringBoot

目录 什么是SpringBoot 使用 Spring Boot有什么好处 Spring Boot 特点 在线构建 IntelliJ IDEA在线模板构建 IntelliJ IDEA 通maven项目构建 SpringBoot的常用配置 入口类和相关注解 定制Banner 修改banner图标 关闭banner 常规属性修改 tomcat端口号修改 常规属性…...

【网络云SRE运维开发】2025第3周-每日【2025/01/15】小测-【第14章ospf高级配置】理论和实操解析

文章目录 14.1 选择题解题思路和参考答案14.2 理论题解题思路和参考答案14.3 实操题解题思路和参考答案思科(Cisco)设备华为(Huawei)设备小米/锐捷(或其他支持标准CLI命令的设备)通过网络管理工具注意事项 …...

AWS S3 跨账户访问 Cross Account Access

进入S3对应的存储桶,上面选项选权限,存储桶策略 -- 编辑,输入对应的policy。 完全控制,包含上传删除权限,policy如下: {"Version": "2012-10-17","Statement": [{"Si…...

Ubuntu20.4和docker终端指令、安装Go环境、安装搜狗输入法、安装WPS2019:保姆级图文详解

目录 前言1、docker、node、curl版本查看终端命令1.1、查看docker版本1.2、查看node.js版本1.3、查看curl版本1.4、Ubuntu安装curl1.5、Ubuntu终端保存命令 2、安装docker-compose、Go语言2.1、安装docker-compose2.2、go语言安装步骤2.3、git版本查看 3、Ubuntu20.4安装搜狗输…...

Kotlin语言的正则表达式

Kotlin语言中的正则表达式 引言 正则表达式(Regular Expression,简称Regex)是一种用于匹配字符串中字符组合的工具。在数据处理、文本解析等领域,正则表达式以其强大的字符串处理能力得到了广泛的应用。而Kotlin作为一种现代的编…...

npm的包管理

从哪里下载包 国外有一家 IT 公司,叫做 npm,Inc.这家公司旗下有一个非常著名的网站: https://www.npmjs.com/,它是全球最大的包共享平台,你可以从这个网站上搜索到任何你需要的包,只要你有足够的耐心!到目前位置,全球约…...

深度学习在文本情感分析中的应用

引言 情感分析是自然语言处理(NLP)中的一个重要任务,旨在识别和提取文本中的主观信息。随着深度学习技术的发展,我们可以使用深度学习模型来提高情感分析的准确性和效率。本文将介绍如何使用深度学习进行文本情感分析&#xff0c…...

【大模型系列篇】数字人音唇同步模型——腾讯开源MuseTalk

之前有一期我们体验了阿里开源的半身数字人项目EchoMimicV2,感兴趣的小伙伴可跳转至《AI半身数字人开箱体验——开源项目EchoMimicV2》,今天带大家来体验腾讯开源的数字人音唇同步模型MuseTalk。 MuseTalk 是一个实时高品质音频驱动的唇形同步模型&#…...

R语言AI模型部署方案:精准离线运行详解

R语言AI模型部署方案:精准离线运行详解 一、项目概述 本文将构建一个完整的R语言AI部署解决方案,实现鸢尾花分类模型的训练、保存、离线部署和预测功能。核心特点: 100%离线运行能力自包含环境依赖生产级错误处理跨平台兼容性模型版本管理# 文件结构说明 Iris_AI_Deployme…...

STM32+rt-thread判断是否联网

一、根据NETDEV_FLAG_INTERNET_UP位判断 static bool is_conncected(void) {struct netdev *dev RT_NULL;dev netdev_get_first_by_flags(NETDEV_FLAG_INTERNET_UP);if (dev RT_NULL){printf("wait netdev internet up...");return false;}else{printf("loc…...

Objective-C常用命名规范总结

【OC】常用命名规范总结 文章目录 【OC】常用命名规范总结1.类名(Class Name)2.协议名(Protocol Name)3.方法名(Method Name)4.属性名(Property Name)5.局部变量/实例变量(Local / Instance Variables&…...

Leetcode 3577. Count the Number of Computer Unlocking Permutations

Leetcode 3577. Count the Number of Computer Unlocking Permutations 1. 解题思路2. 代码实现 题目链接:3577. Count the Number of Computer Unlocking Permutations 1. 解题思路 这一题其实就是一个脑筋急转弯,要想要能够将所有的电脑解锁&#x…...

(二)原型模式

原型的功能是将一个已经存在的对象作为源目标,其余对象都是通过这个源目标创建。发挥复制的作用就是原型模式的核心思想。 一、源型模式的定义 原型模式是指第二次创建对象可以通过复制已经存在的原型对象来实现,忽略对象创建过程中的其它细节。 📌 核心特点: 避免重复初…...

MySQL 8.0 OCP 英文题库解析(十三)

Oracle 为庆祝 MySQL 30 周年,截止到 2025.07.31 之前。所有人均可以免费考取原价245美元的MySQL OCP 认证。 从今天开始,将英文题库免费公布出来,并进行解析,帮助大家在一个月之内轻松通过OCP认证。 本期公布试题111~120 试题1…...

NLP学习路线图(二十三):长短期记忆网络(LSTM)

在自然语言处理(NLP)领域,我们时刻面临着处理序列数据的核心挑战。无论是理解句子的结构、分析文本的情感,还是实现语言的翻译,都需要模型能够捕捉词语之间依时序产生的复杂依赖关系。传统的神经网络结构在处理这种序列依赖时显得力不从心,而循环神经网络(RNN) 曾被视为…...

3-11单元格区域边界定位(End属性)学习笔记

返回一个Range 对象,只读。该对象代表包含源区域的区域上端下端左端右端的最后一个单元格。等同于按键 End 向上键(End(xlUp))、End向下键(End(xlDown))、End向左键(End(xlToLeft)End向右键(End(xlToRight)) 注意:它移动的位置必须是相连的有内容的单元格…...

Unsafe Fileupload篇补充-木马的详细教程与木马分享(中国蚁剑方式)

在之前的皮卡丘靶场第九期Unsafe Fileupload篇中我们学习了木马的原理并且学了一个简单的木马文件 本期内容是为了更好的为大家解释木马(服务器方面的)的原理,连接,以及各种木马及连接工具的分享 文件木马:https://w…...

【生成模型】视频生成论文调研

工作清单 上游应用方向:控制、速度、时长、高动态、多主体驱动 类型工作基础模型WAN / WAN-VACE / HunyuanVideo控制条件轨迹控制ATI~镜头控制ReCamMaster~多主体驱动Phantom~音频驱动Let Them Talk: Audio-Driven Multi-Person Conversational Video Generation速…...