背景
Apache Ratis是开源的,由Java实现的Multi-Raft共识协议。基于Raft实现的共识协议还有许多种,例如有各种语言的实现方案如 jraft,goraft,还有许多KV数据库同样使用了raft协议,但目前看来,ratis的实现和使用更为普遍,Ozone项目中就使用了ratis做为HA的实现方案,并且还作为DN 副本之间的数据同步。
ratis的架构图
ratis的结构大致可以分为下面几种角色:
client: 用于发起不同的数据请求
reteyCache: 是一个针对client请求的缓存,该cache会缓存近期的请求request.
raftLog: 可以理解为Ratis Server的WAL,每次用户的操作都会被转化成transaction log然后被写入到Raft Log中,如果log写满了,则会新创建Raft Log文件进行写入。
Log Appender: 此角色是将Leader内最新的transaction log发送到远端的各个follower服务中,并获取返回结果,然后及时更新Raft Log的commit index。
StateMachineUpdater: 该角色根据Raft Log的commit的记录,及时apply最新commited的log entry到statemachine中,然后purge掉commit index之前的log文件。同时会定期给statemachine做snapshot操作(该功能类似hdfs的standbyCheckpointer)snapshot则类似hdfs的fsimage。
StateMachine: 是Ratis Server上层构筑的状态机,实现了多个接口的Api,负责处理和返回客户端的请求,如读写数据等等,statemachine中的数据是由updater负责更新的。
上述过程的核心点在于StateMachine只会apply那些成功提交的transaction log, 所以我们能够确保主从服务状态的一致性。