数据复制
概念
数据复制为分区组中节点之间的相互同步的机制。
在数据节点和编目节点中,任何数据增删改操作均会写入日志。SequoiaDB 会首先将日志写入日志缓冲区,然后将其异步写入本地磁盘。
每个数据复制会在两个节点间进行:
源节点: 为包含新数据的节点。主节点并不一定永远是复制的源节点。
目标节点: 为请求进行数据复制的节点。
复制过程中,目标节点选择一个与其最接近的节点,然后向其发送一个复制请求。源节点接到复制请求后,会将目标节点请求的同步点之后的日志记录打包并发送给目标节点,目标节点接收到数据包后会重新处理日志中的所有操作。
节点之间的复制有两个状态:
对等状态(PEER): 当目标节点请求的日志依然存在于源节点的日志缓冲区中,两节点之间为对等状态
远程追赶状态(RemoteCatchup): 当目标节点请求的日志不存在于源节点的日志缓冲区中,但依然存在于源节点的日志文件中,两节点之间为远程追赶状态
如果目标节点请求的日志已经不再存在于源节点的日志文件中,目标节点则进入全量同步状态。
当两节点处于对等状态时,同步请求在源节点可以直接从内存中获取数据,因此目标节点选择复制源节点时,总会尝试选择距离自己当前日志点最近的数据节点,使其所包含的日志尽量坐落在内存中。
全量同步
概念
在分区组内,当一个新的节点加入分区组,或者故障节点重新加入分区组,需要进行数据全量同步,以保障新的节点与现有节点之间数据的一致性。
在进行数据全量同步时有两个节点参与:
源节点: 为包含有效数据的节点。主节点并不一定永远是同步的源节点。任何与主节点处于同步状态的从节点均可作为源节点进行数据同步。(目前只能主节点作为同步源节点)
目标节点: 为新加入组,或重新入组的故障节点。同步时该节点下原有的数据会被废弃。
![同步](/projects/SequoiaDB-3.2/29ac8e74f1ecf0e043107c0a9b6a087d.jpeg)
全量同步发生时,目标节点会定期向源节点请求数据。源节点将数据打包后作为大数据块发送给目标节点。当目标节点重做该数据块内所有数据后,向源节点请求新的数据块。
为保障源节点在同步时可进行写操作,所有已经被发送给目标节点的数据页如果被更改,其更新会被同步到目标节点,以保障全量同步过程中更新的数据不会损失。
Note:
更多同步日志的内容请参考 同步日志