复制组
一、原理
复制组副本间通过拷贝和重放事务日志来实现数据同步。
复制组成员
一个复制组由一个或者多个节点组成。复制组内有两种不同的角色:主节点和备节点。正常情况下,一个复制组内有且只有一个主节点,其余为备节点。
主节点
主节点是复制组内唯一接收写操作的成员。当发生写操作时,主节点写入数据,并记录事务日志 replicalog。备节点从主节点异步复制 replicalog,并通过重放 replicalog 来复制数据。
备节点
- 备节点持有主节点数据的副本,一个复制组可以有多个备节点。
- 备节点从主节点异步复制 replicalog,并重放 replicalog 来复制数据。复制数据的过程需要一定的时间,有可能经过一段时间才能从备节点上访问到更新后的数据,SequoiaDB 的复制组默认是保证最终一致性。
数据复制
数据复制为复制组中节点之间的同步机制。
增量同步
在数据节点和编目节点中,任何增删改操作均会写入日志。节点会将日志写入日志缓冲区,然后再异步写入本地磁盘。
数据复制在两个节点间进行:
- 源节点:含有新数据的节点
- 目标节点:请求进行数据复制的节点
目标节点会选择一个与其数据最接近的节点,然后向它发送一个复制请求。源节点收到复制请求后,会打包目标节点请求的同步点之后的日志,并发送给目标节点。目标节点接收到同步数据包后,会重放事务日志中的操作。
节点之前的复制有两种状态:
- 对等状态(Peer):目标节点请求的日志,存在于源节点的日志缓冲区
- 远程追赶状态(Remote Catchup):目标节点请求的日志,不存在于源节点的日志缓冲区中,但存在于源节点的日志文件中
如果目标节点请求的日志,已经不存在于源节点的日志文件中,则目标节点进入全量同步状态。
当两节点处于对等状态时,源节点上可以直接从内存中获取日志。因此目标节点选择源节点时,总会尝试选择距离自己当前日志点最近的节点,使请求的日志尽量落在内存中。所以源节点不一定总是主节点。
全量同步
在复制组内,有些情况下需要进行数据全量同步,才能保障节点之间数据的一致性。以下情况需要进行全量同步:
- 一个新的节点加入复制组
- 节点故障导致数据损坏
- 节点日志远远落后于其他节点,即当前节点的日志已经不存在于其他节点的日志文件中
全量同步在两个节点间进行:
- 源节点:指含有有效数据的节点,全量同步的源节点必定是主节点
- 目标节点:指请求进行全量同步的节点,全量同步时,该节点下原有的数据会被废弃
数据复制
数据复制为复制组中节点之间的同步机制。
增量同步
在数据节点和编目节点中,任何增删改操作均会写入日志。节点会将日志写入日志缓冲区,然后再异步写入本地磁盘。
数据复制在两个节点间进行:
- 源节点:含有新数据的节点
- 目标节点:请求进行数据复制的节点
目标节点会选择一个与其数据最接近的节点,然后向它发送一个复制请求。源节点收到复制请求后,会打包目标节点请求的同步点之后的日志,并发送给目标节点。目标节点接收到同步数据包后,会重放事务日志中的操作。
节点之前的复制有两种状态:
- 对等状态(Peer):目标节点请求的日志,存在于源节点的日志缓冲区
- 远程追赶状态(Remote Catchup):目标节点请求的日志,不存在于源节点的日志缓冲区中,但存在于源节点的日志文件中
如果目标节点请求的日志,已经不存在于源节点的日志文件中,则目标节点进入全量同步状态。
当两节点处于对等状态时,源节点上可以直接从内存中获取日志。因此目标节点选择源节点时,总会尝试选择距离自己当前日志点最近的节点,使请求的日志尽量落在内存中。所以源节点不一定总是主节点。
全量同步
在复制组内,有些情况下需要进行数据全量同步,才能保障节点之间数据的一致性。以下情况需要进行全量同步:
- 一个新的节点加入复制组
- 节点故障导致数据损坏
- 节点日志远远落后于其他节点,即当前节点的日志已经不存在于其他节点的日志文件中
全量同步在两个节点间进行:
- 源节点:指含有有效数据的节点,全量同步的源节点必定是主节点
- 目标节点:指请求进行全量同步的节点,全量同步时,该节点下原有的数据会被废弃