分布式一致性协议

本文涉及的产品
日志服务 SLS,月写入数据量 50GB 1个月
简介: 分布式一致性协议

分布式一致性协议

当前业界主流的分布式一致性协议主要有如下几种:

  • totem协议(简单即有效)
    totem协议,全称是The Totem Single-Ring Ordering and Membership Protocol,是一个基于令牌环的分布式一致性算法。corosync基于totem协议实现。
  • paxos协议(二阶段提交)
  • raft协议(二阶段提交,基于paxos协议完善和改进)
    Raft协议就是Paxos的衍生,etcd基于raft协议实现。
  • zab协议(二阶段提交)
    ZAB协议是为分布式协调服务Zookeeper专门设计的一种支持崩溃恢复和原子广播协议。

totem协议

totem协议,全称是The Totem Single-Ring Ordering and Membership Protocol,是一个基于令牌环的分布式一致性算法。一个令牌在集群节点之间传递,拿到令牌的节点才能够发消息,消息通过UDP广播发送。所以,totem只适合在局域网里的小集群使用,这种情况下,这个算法性能还算高的。从CAP来说,totem具有强一致性,但几乎没有分区容错性,在网络出现分区时,totem会脑裂,当网络恢复时,会造成消息丢失。

在多个节点组成的集群中,totem实现让一个节点发送消息,其它所有节点都能全部收到,并且有序的提交给上层应用。

说起totem协议,最简单的形象就是,他将多个节点组成一个令牌环。多个节点手拉手形成一个圈,大家依次的传递token。只有获取到token的节点才有发送消息的权利。简单有效的解决了在分布式系统中各个节点的同步问题,因为只有一个节点会在一个时刻发送消息,不会出现冲突。当然,如果有节点发生意外时,令牌环就会断掉,此时大家不能够通信,而是重新组建出一个新的令牌环。

totem的节点有四个状态,也是组建集群的4个阶段。

  • Gather阶段:这个阶段用于每个节点向外界广播自己的存在并收集其它节点的存在
  • Commit阶段:这个阶段会产生一个代表节点,该节点向其它所有节点收集信息,并将收集的信息传递给其它所有节点,用于后续阶段
  • Recovery阶段:这个阶段用于新旧集群交替时,旧集群成员用新集群传递旧集群的消息,使旧集群成员达到所有节点消息全部有序提交到上层
  • Operational阶段:这个阶段是集群组建完成正常工作的状态,这个状态一个节点发送的消息其它节点都会全部有序提交给上层

通信方式。

  • 当集群有节点要发起通信时,需要等待token。
  • 当拿到token后,先广播这次需要发送的数据,然后传递token来确认所有人都接收到消息。
  • 如果确认成功,释放token。

节点的加入和退出。

  • 当集群中有节点加入时,加入的节点广播一个加入信息,所有人都开始广播自己的信息,当所有人都获得同伴信息,开始由id最小的人提交一个token,交由所有节点确认。
  • 如果都确认后,则节点正式加入,开始正常运行。
  • 当集群有节点退出时,由于令牌环断链,触发token超时,则同样开始广播信息,然后由最小id提交token,经过确认后恢复正常。

raft协议

Paxos 算法的描述偏学术化,缺失了很多细节,无法直接应用于工程领域。实际工程应用中的分布式算法大多是 Paxos 的变种,Raft协议就是Paxos的简化。

RAFT算法分为两个阶段:Leader选举,日志复制。也有三种角色,分别为:

  1. Leader(领导者):负责发送要进行共识的数据,如果客户端发送的数据不是发送到Leader而是其他角色,其他角色会进行转发至Leader。
  2. Follower(追随者):参与共识的角色
  3. Candidate(候选者):如果Follower没有收到Leader的心跳响应超过150——300ms,会进行Leader选举

正常运行的情况下,会有一个Leader,其他全为Follower,Follower只会响应Leader和Candidate的请求,而客户端的请求则全部由Leader处理,即使有客户端请求了一个Follower也会将请求重定向到Leader。Candidate代表候选人,出现在选举Leader阶段,选举成功后Candidate将会成为新的Leader。

Raft 将一致性问题分解为 3 个独立的子问题:

  • Leader 选举Election:Leader 进程失效后能够自动选举出一个新的 Leader
  • 日志复制Replication:Leader 保证其他节点的日志与其保持一致
  • 状态安全Safety:Leader 保证状态机执行指令的顺序与内容完全一致

leader选举

  • 所有节点初始状态为Follower状态,此时没有Leader,肯定会与Leader的心跳超时(一般150——300ms,随机的,这样就是想谁先发出竞选,谁当选leader),此时Candidate就会发出leader竞选给其他节点(大家快选我啊,leader挂掉了);其他节点收到竞选请求,会响应同意,当一个Candidate收到大多数(n/2 + 1)节点的回复,就成为leader。然后与Candidate保持心跳连接。Raft有个Term(任期)的概念,只有在发生Leader选举阶段,term+1,表示新的leader产生,挂掉的节点,或者挂掉的leader重启后,会发现自己的term小于最新的,此时就会切换到日志复制,去同步之前丢失的消息。
  • 如果同时有多个Candidate发出竞选,并且都没有获得大多数投票,会一直进行竞选,直到选出leader

日志复制

  • leader收到客户端或者其他节点转发过来需要共识的值,会跟随心跳一起广播给其他节点,进行写入
  • 其他节点写入后响应成功给leader,当leader收到大多数的follower响应的成功,发出commit命令
  • 其他节点收到commit后,进行事务提交,响应成功为leader,leader收到大多数的commit成功,Raft完成

ZAB协议

Zookeeper是一个为分布式应用提供高效且可靠的分布式协调服务。在解决分布式一致性方面,Zookeeper并没有使用Paxos,而是采用了ZAB协议。

ZAB协议基本与Raft相同,都是Multi Paxos的衍生。ZAB与Raft在一些名词的叫法上有区别:如ZAB将某一个Leader的周期称为epoch,而Raft则称之为term。在实现上也有些许不同:Raft为了保证日志连续性,心跳方向为Leader至Follower,ZAB则相反。

消息广播模式

ZAB协议的消息广播过程使用的是一个原子广播协议,类似一个2PC二阶段提交过程

  1. Leader将客户端的request转化成一个Proposal(提议);
  2. Leader为每一个Follower准备了一个FIFO队列,并把Proposal发送到队列上;
  3. Leader若收到follower的半数以上ACK反馈;
  4. Leader向所有的follower发送commit。

崩溃恢复

ZAB 定义了 2 个原则:

  1. ZAB 协议确保那些已经在 Leader 提交的事务最终会被所有服务器提交。
  2. ZAB 协议确保丢弃那些只在 Leader 提出/复制,但没有提交的事务。

所以,ZAB 设计了下面这样一个选举算法:能够确保提交已经被 Leader 提交的事务,同时丢弃已经被跳过的事务。针对这个要求,如果让 Leader 选举算法能够保证新选举出来的 Leader 服务器拥有集群中所有机器编号(即 ZXID最大)的事务,那么就能够保证这个新选举出来的 Leader 一定具有所有已经提交的提案。

reference

  1. https://blog.csdn.net/zancijun1666/article/details/83512038
  2. https://blog.csdn.net/cloudresearch/article/details/23127985
  3. https://blog.csdn.net/TJtulong/article/details/106510970
  4. https://blog.csdn.net/TJtulong/article/details/106510970
相关实践学习
日志服务之使用Nginx模式采集日志
本文介绍如何通过日志服务控制台创建Nginx模式的Logtail配置快速采集Nginx日志并进行多维度分析。
目录
相关文章
|
5月前
|
存储 缓存 NoSQL
Redis常见面试题(二):redis分布式锁、redisson、主从一致性、Redlock红锁;Redis集群、主从复制,哨兵模式,分片集群;Redis为什么这么快,I/O多路复用模型
redis分布式锁、redisson、可重入、主从一致性、WatchDog、Redlock红锁、zookeeper;Redis集群、主从复制,全量同步、增量同步;哨兵,分片集群,Redis为什么这么快,I/O多路复用模型——用户空间和内核空间、阻塞IO、非阻塞IO、IO多路复用,Redis网络模型
Redis常见面试题(二):redis分布式锁、redisson、主从一致性、Redlock红锁;Redis集群、主从复制,哨兵模式,分片集群;Redis为什么这么快,I/O多路复用模型
|
2月前
|
JSON 分布式计算 前端开发
前端的全栈之路Meteor篇(七):轻量的NoSql分布式数据协议同步协议DDP深度剖析
本文深入探讨了DDP(Distributed Data Protocol)协议,这是一种在Meteor框架中广泛使用的发布/订阅协议,支持实时数据同步。文章详细介绍了DDP的主要特点、消息类型、协议流程及其在Meteor中的应用,包括实时数据同步、用户界面响应、分布式计算、多客户端协作和离线支持等。通过学习DDP,开发者可以构建响应迅速、适应性强的现代Web应用。
|
2月前
|
架构师 Java 数据中心
二阶段提交:确保分布式系统中数据一致性的关键协议
【10月更文挑战第16天】在分布式系统中,数据一致性的维护是一个至关重要的挑战。为了应对这一挑战,二阶段提交(Two-Phase Commit,简称2PC)协议应运而生。作为一种经典的分布式事务协议,2PC旨在确保在分布式系统中的所有节点在进行事务提交时保持一致性。
42 0
|
3月前
|
监控
分布式-Zookeeper-Zab协议
分布式-Zookeeper-Zab协议
|
3月前
|
网络协议 网络安全 网络架构
分布式基础-网络通信协议讲解
分布式基础-网络通信协议讲解
分布式基础-网络通信协议讲解
|
2月前
|
消息中间件 缓存 算法
分布式系列第一弹:分布式一致性!
分布式系列第一弹:分布式一致性!
|
2月前
|
算法 Java 关系型数据库
漫谈分布式数据复制和一致性!
漫谈分布式数据复制和一致性!
|
4月前
|
存储 算法 NoSQL
(七)漫谈分布式之一致性算法下篇:一文从根上儿理解大名鼎鼎的Raft共识算法!
Raft通过一致性检查,能在一定程度上保证集群的一致性,但无法保证所有情况下的一致性,毕竟分布式系统各种故障层出不穷,如何在有可能发生各类故障的分布式系统保证集群一致性,这才是Raft等一致性算法要真正解决的问题。
122 11
|
4月前
|
存储 算法 索引
(六)漫谈分布式之一致性算法上篇:用二十六张图一探Raft共识算法奥妙之处!
现如今,大多数分布式存储系统都投向了Raft算法的怀抱,而本文就来聊聊大名鼎鼎的Raft算法/协议!
131 8
|
4月前
|
存储 算法 Java
(五)漫谈分布式之一致性算法篇:谁说Paxos晦涩难懂?你瞧这不一学就会!
没在时代发展的洪流中泯然于众的道理很简单,是因为它们并不仅是空中楼阁般的高大上理论,而是有着完整落地的思想,它们已然成为构建分布式系统不可或缺的底层基石,而本文则来好好聊聊分布式与一致性思想的落地者:Paxos与Raft协议(算法)。
115 6