分布式下的数据一致性问题,怎么解决?,java 编程教程下载
通过值的一致能够实现对同一个数据的请求会让同一个服务器来处理。
Paxos 和 Raft 都是通过选取 master 来实现多节点下值的一致性,从而借助一致性 hash 算法来分配请求。
一致性 Hash 算法 一致性 Hash 算法可以根据不同的属性参数(通常是 IP 和端口号),生成一串不相同的 Hash 值,并将 Hash 值转换成 0-2^32-1 的整数, 不同范围的值由不同服务器进行处理。(B-C 之间的由 B 处理)。
Raft 算法和 Paxos 算法
Raft 算法是在 Paxos 算法的基础上的进行优化。 Raft 在 Paxos 的基础上主要做了两个方向的优化: 1.将复杂的分布式共识问题拆分成领导选举、日志复制和安全性三个问题 2.压缩状态空间:相对于 Paxos 施加了更合理的限制,减少了系统状态过多而产生的不确定因素。
领导选举(具体以 zookeeper 举例) 其基本的特性有:
zookeeper 在配置集群时节点数不可小于 3
节点只有获得半数以上的投票才能当选 Leader
zookeeper 在启动时会通过广播机制来把投票结果告诉其他的节点
zookeeper 在启动时首先会给自己投票,然后与其他已启动的节点进行通信,通过比较 id 从而判断是否能获取其他节点的投票
zookeeper 在选举过程中的角色:领导者、跟随者、观察者、竞选者
日志复制 在共识算法中,所有服务器节点都会包含一个有限状态自动机,名为复制状态机(replicated state machine)。每个节点都维护着一个复制日志(replicated logs)的队列,复制状态机会按序输入并执行该队列中的请求,执行状态转换并输出结果。可见,如果能保证各个节点中日志的一致性,那么所有节点状态机的状态转换和输出也就都一致。
可见,日志由一个个按序排列的 entry 组成。每个 entry 内包含有请求的数据,还有该 entry 产生时的领导任期值。每个节点上的日志队列用一个数组 log[]表示。
领导节点选举出来后,集群就可以开始处理客户端请求了。当客户端发来请求时,领导节点首先将其加入自己的日志队列,再并行地发送 AppendEntries RPC 消息给所有跟随节点。最终实现节点数据的一致性。
安全性 Raft 安全保障机制有 5 种:
选举安全性:节点要 3 个以上,避免“脑裂”的方式
领导者只追加:客户端发出的请求都是插入领导者日志队列的尾部,没有修改或删除的操作。
日志匹配:每条 AppendEntries 都会包含最新 entry 之前那个 entry 的下标与任期值,如果跟随节点在对应下标找不到对应任期的日志,就会拒绝接受并告知领导节点。(避免追随者故障,导致数据不一致)
领导者完全性:如果有一条日志在某个任期被提交了,那么它一定会出现在所有任期更大的领导者日志里。(master 会优先获取日志的
更新)
状态机安全性:如果一个节点已经向其复制状态机应用了一条日志中的请求,那么对于其他节点的同一下标的日志,不能应用不同的请求。(避免 master 宕机时,重新选举,导致部分节点数据不一致)
评论