前言
高可用的定义,指的是“一个系统经过特有的设计与改造,减少因不确定故障停服的时间,从而对业务使用方来说可以保证其服务的高度可用性”。在生产环境中,往往会存在很多不可预知的故障因素,比如虚拟机宕机、磁盘损坏和网络故障等,因此系统自身的高可用是任何工业级产品所需重点考虑的因素。
对于消息队列服务来说,考虑到故障切换和业务感知等问题,传统的高可用方式(冷备或者热备)一般都不太适用。在经过多种技术方案对比后,我们发现采用基于 Raft 共识算法的多副本设计方案可以满足我们产品的要求,因此在鉴权认证组件和 API 计量服务组件中,我们集成了蚂蚁金服开源的 SOFAJRaft 库,实现这两个组件应对单点故障的高可用。
背景知识:Raft 共识性算法是什么?
Raft 是一种分布式系统中易于理解的共识算法,该协议本质上是 Paxos 算法的精简版,而不同的是依靠 Raft 模块化的拆分以及更加简化的设计,其实现起来更加容易和方便。[1]
模块化的拆分主要体现在 Raft 把一致性协议划分为如下几部分:
- Leader 选举;
- Membership 变更;
- 日志复制;
- Snapshot;
而更加简化的设计则体现在:Raft 不允许类似 Paxos 中的乱序提交、简化系统中的角色状态(算法定义 Leader、Follower 和 Candidate 三种角色)、限制仅 Leader 可写入、采用随机超时触发 Leader Election 机制来避免“瓜分选票”等等。[2]