前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >差不多的分布式一致性算法:Paxos、Raft、ZAB

差不多的分布式一致性算法:Paxos、Raft、ZAB

原创
作者头像
王二蛋
发布2024-05-07 10:18:49
2730
发布2024-05-07 10:18:49

前言

在分布式系统中,如何确保一致性始终是绕不开的话题。无论是对分布式事务的处理、数据副本之间的同步,还是集群节点状态的管理。为此,就诞生了很多分布式一致性算法和协议,比如Paxos算法、ZAB协议、Raft算法、以及当下比较火的区块链共识机制。

为什么这么多分布式一致性算法

为什么会有这么多的分布式一致性算法,我认为有两个原因:

  1. 分布式一致性的应用场景多样,不同的场景对一致性的处理也就不一样。
  2. 技术永远是与时俱进的,没有一成不变的方法,只要满足场景就是最合适的。

事实上,这些分布式一致性算法的最终目的都是一样的,只是处理方法不同。当理解了分布式一致性的核心思想时,其它的一致性算法也就不攻自破了。

分布式系统确保一致性的基础

在了解分布式一致性算法之前,需要有一个基本的认识。

在分布式系统中,各节点要实现一致性首先需要通信,而通信方式有两种:共享内存消息传递

举个例子:

作为一名Java开发人员,我们通常会使用Redis组件在分布式系统中实现数据共享,通过这种方式可以实现系统中的各节点访问数据时是一致的(Redis 单点)。这种场景下,Redis就属于分布式系统中的共享内存

但是,作为一个组件,Redis需要保证高可用,于是就采取了一些措施,比如主从架构、哨兵模式、集群架构。无论哪种架构,都需要解决一个问题:集群之间的数据同步。这个场景下,Redis自身就是一个分布式系统,需要通过消息传递的方式实现数据同步,也就是一致性。

通用的分布式一致性算法:Paxos

Paxos 背景

Paxos算法是莱斯利·兰伯特(英语:Leslie Lamport,LaTeX中的“La”)于1990年提出的一种基于消息传递且具有高度容错特性的一致性算法。

基于消息传递通信方式构建的分布式组件,不可避免会发生以下错误:

  • 某个进程可能被杀死或者重启
  • 消息可能会丢失、重复

当发生这些问题时,各节点之间的数据如何保持一致就是一个问题。

为了解决一致性问题,Paxos算法应运而生。它的目标是:

确保一个分布式系统不论发生上述任何异常,都不会破坏一致性。

那么,Paxos 是如何确保的?

Paxos 确保一致性的方法

Paxos 对一致性的处理方法是:

当某个节点做任何操作时(例如写数据),需要其他节点投票通过才能生效

Paxos 处理一致性的流程

为了直观的理解Paxos算法,这里通过一个典型的场景进行说明:

在一个分布式数据库系统中,不论各节点正常或异常,每个节点需要执行相同顺序的操作,最后才能得到一致的状态。

那么,Paxos是如何通过投票保证执行顺序是一致的?

在投票时需要两个信息(全局唯一编号、具体操作),具体过程如下:

  1. 当某个节点进行某项操作时,向其他节点发送投票请求。
  2. 提交投票请求时会将一个全局唯一、递增的编号(N)发送给其他节点。
  3. 其他节点收到这个投票请求后,会和自己处理过的最大编号进行比较:
    • 如果小于编号(N),那么将它处理过的最大编号响应给对方,意味着认可这个操作。
    • 如果大于编号(N),则代表编号(N)被处理过,就不会对对方任何响应,意味着不认可这个操作。
  4. 当投票发送者收到半数以上响应后,会再次发送一个确认请求
  5. 当其他节点在收到确认的请求后,如果对该编号的投票请求做出过响应,并且不小于处理过的最大编号,该节点就执行本次的操作并更新编号。
每个节点都可以发起投票请求
每个节点都可以发起投票请求

通过上述执行流程可以得知,Paxos 通过全局唯一编号确保执行顺序一致性

而且,当出现错误异常时也不会破坏一致性:

Paxos 高度容错的机制

  • 某个进程可能被杀死或者重启:
    • 当某个进程被杀死后,投票发送者如果没有收到半数以上响应,所有节点都不会执行本次的操作,系统的一致性就不会被破坏。
    • 当某个进程重启后,会收集半数以上正常运行节点的数据和状态信息,以便恢复和同步自己的数据,系统的一致性就不会被破坏。
  • 消息可能会丢失、重复:
    • 如果在投票请求阶段没有收到半数以上响应,可能意味着消息的丢失,那么所有节点都不会执行本次的操作,系统的一致性就不会被破坏。
    • 由于编号是唯一的,各节点在接收到投票请求后,不会对之前重复的编号进行处理,系统的一致性就不会被破坏。

其他分布式一致性算法

相对于 Paxos 算法,ZAB和Raft理解起来就比较直观了,原因是两者有具体的场景。

ZAB 协议

ZAB 协议(ZooKeeper Atomic Broadcast)是 ZooKeeper 用来保证集群节点之间的数据同步。所以在理解 ZAB 协议前需要对 ZooKeeper 有所了解。

这里总结一下 ZAB 协议做的几件事:

  1. 投票选举 ZooKeeper 集群的 Leader 节点(ZooKeeper 所有的写操作统一经过 Leader 节点)。
  2. 通过投票广播的方式保证集群之间的数据一致。
  3. 节点崩溃后进行崩溃恢复(涉及到 Leader 重新选举以及数据同步)。

当你把 Paxos 投票流程运用到这几个场景中,会发现处理过程基本一致。

Raft 算法

Raft官方将算法解决的场景分为以下几点:选举、日志复制、安全性。看上去和ZAB协议在场景上的表现上高度相似。

同样,当你把 Paxos 投票流程运用到这几个场景中,会发现处理过程基本一致。

如果想要更直观地理解 Raft 算法。可以移步 Raft 提供的易于理解的分布式一致性动画演示:

http://thesecretlivesofdata.com/raft/

总结

不论是哪种分布式一致性算法,目的都很明确。对于不同的场景,处理细节可能会有所不同。当理解分布式一致性的核心原理后,所有的算法看起来都是高度相似的。

我正在参与2024腾讯技术创作特训营最新征文,快来和我瓜分大奖!

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 前言
  • 为什么这么多分布式一致性算法
  • 分布式系统确保一致性的基础
  • 通用的分布式一致性算法:Paxos
    • Paxos 背景
      • Paxos 确保一致性的方法
        • Paxos 处理一致性的流程
          • Paxos 高度容错的机制
          • 其他分布式一致性算法
            • ZAB 协议
              • Raft 算法
              • 总结
              相关产品与服务
              云数据库 Redis
              腾讯云数据库 Redis(TencentDB for Redis)是腾讯云打造的兼容 Redis 协议的缓存和存储服务。丰富的数据结构能帮助您完成不同类型的业务场景开发。支持主从热备,提供自动容灾切换、数据备份、故障迁移、实例监控、在线扩容、数据回档等全套的数据库服务。
              领券
              问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档