前言
前段时间,笔者讲述了关于Raft协议内部投票过程的一个具体实现,实现过程取自于Apache Ratis项目内部的代码。本文笔者将再来阐述Apach Ratis项目内部Ratis Server的主从服务同步机制。Ratis Server在经过Raft协议投票选举出Leader之后,是如何进行Leader、Follower间的数据同步的呢?更确切地来说,是如何保持主从之间数据的一致性的呢?
主从服务间的数据同步常用作法
这里我们所说的主从服务,它所指的是”有状态“的服务,并不是完全无状态只是为了临时快速切换的所谓的“主从服务”。对于这种“有状态”信息的服务,我们的目标是让这些“状态”信息及时同步到其它Follow的服务内。于是,我们可以想到以下一些同步方法:
- 主服务直接同步状态信息到多个备服务中。这种方案的弊端在于主服务没有持久化未及时同步到Follow服务的状态信息,这会导致系统服务突然crash导致状态信息丢失的情况。
- 主服务写出状态信息到外部存储中,由备服务再从外部存储中同步状态信息。这里外部存储的引入可以保证状态信息不丢失,但是此方案因为引入了外部存储的关系,在整个服务交互上会比第一种方案复杂一些。这种方案在实际工作的系统内经常能碰到,例如HDFS的QJM机制,还有例如其它一些存储系统的WAL机理等等。
本文笔者将要阐述的Ratis Server间的主从同步在本质原理上也属于第二套方案,不过在里面额外引入了状态机的角色,状态机将会和WAL进行一些额外的交互操作,下面我们来了解这方面的主要内容。