当前位置: 首页 > 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 是一个实时高品质音频驱动的唇形同步模型&#…...

日语AI面试高效通关秘籍:专业解读与青柚面试智能助攻

在如今就业市场竞争日益激烈的背景下,越来越多的求职者将目光投向了日本及中日双语岗位。但是,一场日语面试往往让许多人感到步履维艰。你是否也曾因为面试官抛出的“刁钻问题”而心生畏惧?面对生疏的日语交流环境,即便提前恶补了…...

视频字幕质量评估的大规模细粒度基准

大家读完觉得有帮助记得关注和点赞!!! 摘要 视频字幕在文本到视频生成任务中起着至关重要的作用,因为它们的质量直接影响所生成视频的语义连贯性和视觉保真度。尽管大型视觉-语言模型(VLMs)在字幕生成方面…...

SpringBoot+uniapp 的 Champion 俱乐部微信小程序设计与实现,论文初版实现

摘要 本论文旨在设计并实现基于 SpringBoot 和 uniapp 的 Champion 俱乐部微信小程序,以满足俱乐部线上活动推广、会员管理、社交互动等需求。通过 SpringBoot 搭建后端服务,提供稳定高效的数据处理与业务逻辑支持;利用 uniapp 实现跨平台前…...

Spring Boot+Neo4j知识图谱实战:3步搭建智能关系网络!

一、引言 在数据驱动的背景下,知识图谱凭借其高效的信息组织能力,正逐步成为各行业应用的关键技术。本文聚焦 Spring Boot与Neo4j图数据库的技术结合,探讨知识图谱开发的实现细节,帮助读者掌握该技术栈在实际项目中的落地方法。 …...

智能仓储的未来:自动化、AI与数据分析如何重塑物流中心

当仓库学会“思考”,物流的终极形态正在诞生 想象这样的场景: 凌晨3点,某物流中心灯火通明却空无一人。AGV机器人集群根据实时订单动态规划路径;AI视觉系统在0.1秒内扫描包裹信息;数字孪生平台正模拟次日峰值流量压力…...

【学习笔记】深入理解Java虚拟机学习笔记——第4章 虚拟机性能监控,故障处理工具

第2章 虚拟机性能监控,故障处理工具 4.1 概述 略 4.2 基础故障处理工具 4.2.1 jps:虚拟机进程状况工具 命令:jps [options] [hostid] 功能:本地虚拟机进程显示进程ID(与ps相同),可同时显示主类&#x…...

C++八股 —— 单例模式

文章目录 1. 基本概念2. 设计要点3. 实现方式4. 详解懒汉模式 1. 基本概念 线程安全(Thread Safety) 线程安全是指在多线程环境下,某个函数、类或代码片段能够被多个线程同时调用时,仍能保证数据的一致性和逻辑的正确性&#xf…...

快刀集(1): 一刀斩断视频片头广告

一刀流:用一个简单脚本,秒杀视频片头广告,还你清爽观影体验。 1. 引子 作为一个爱生活、爱学习、爱收藏高清资源的老码农,平时写代码之余看看电影、补补片,是再正常不过的事。 电影嘛,要沉浸,…...

协议转换利器,profinet转ethercat网关的两大派系,各有千秋

随着工业以太网的发展,其高效、便捷、协议开放、易于冗余等诸多优点,被越来越多的工业现场所采用。西门子SIMATIC S7-1200/1500系列PLC集成有Profinet接口,具有实时性、开放性,使用TCP/IP和IT标准,符合基于工业以太网的…...

SQL Server 触发器调用存储过程实现发送 HTTP 请求

文章目录 需求分析解决第 1 步:前置条件,启用 OLE 自动化方式 1:使用 SQL 实现启用 OLE 自动化方式 2:Sql Server 2005启动OLE自动化方式 3:Sql Server 2008启动OLE自动化第 2 步:创建存储过程第 3 步:创建触发器扩展 - 如何调试?第 1 步:登录 SQL Server 2008第 2 步…...