蚂蚁金服开源 SOFAJRaft:生产级 Java Raft 算法库(2)
3.Snapshot and log compaction:定时生成 snapshot,实现 log compaction 加速启动和恢复,以及 InstallSnapshot 给 Followers 拷贝数据,如下图: 本图出自《In Search of an Understandable Consensus Algorithm》 4.Membership change:用于集群线上配置变更,比如增加节点、删除节点、替换节点等。 5.Transfer leader:主动变更 leader,用于重启维护,leader 负载平衡等。 6.Symmetric network partition tolerance:对称网络分区容忍性。 如上图 S1 为当前 leader,网络分区造成 S2 不断增加本地 term,为了避免网络恢复后 S2 发起选举导致正在良心 工作的 leader step-down,从而导致整个集群重新发起选举,SOFAJRaft 中增加了 pre-vote 来避免这个问题的发生。 SOFAJRaft 中在 request-vote 之前会先进行 pre-vote(currentTerm + 1, lastLogIndex, lastLogTerm),多数派成功后才会转换状态为 candidate 发起真正的 request-vote,所以分区后的节点,pre-vote 不会成功,也就不会导致集群一段时间内无法正常提供服务。 7.Asymmetric network partition tolerance:非对称网络分区容忍性。 如上图 S1 为当前 leader,S2 不断超时触发选主,S3 提升 term 打断当前 lease,从而拒绝 leader 的更新。
8.Fault tolerance:容错性,少数派故障不影响系统整体可用性,包括但不限于: 1)机器掉电 2)强杀应用 3)慢节点(GC, OOM 等) 4)网络故障 5)其他各种奇葩原因导致 raft 节点无法正常工作 9.Workaround when quorate peers are dead:多数派故障时,整个 grop 已不具备可用性,安全的做法是等待多数节点恢复,只有这样才能保证数据安全;但是如果业务更加追求系统可用性,可以放弃数据一致性的话,SOFAJRaft 提供了手动触发 reset_peers 的指令以迅速重建整个集群,恢复集群可用。 10.Metrics:SOFAJRaft 内置了基于 Metrics 类库的性能指标统计,具有丰富的性能统计指标,利用这些指标数据可以帮助用户更容易找出系统性能瓶颈。 11.Jepsen:除了几百个单元测试以及部分 chaos 测试之外, SOFAJRaft 还使用 jepsen 这个分布式验证和故障注入测试框架模拟了很多种情况,都已验证通过: 1)随机分区,一大一小两个网络分区 2)随机增加和移除节点 3)随机停止和启动节点 4)随机 kill -9 和启动节点 5)随机划分为两组,互通一个中间节点,模拟分区情况 6)随机划分为不同的 majority 分组 性能优化 除了功能上的完整性,SOFAJRaft 还做了很多性能方面的优化,这里有一份 KV 场景(get/put)的 Benchmark 数据, 在小数据包,读写比例为 9:1,保证线性一致读的场景下,三副本最高可以达到 40w+ 的 ops。 这里挑重点介绍几个优化点:
(编辑:ASP站长网) |