docs/design/sync.md
Slave中某一个Partition建立同步:
Master处理同步请求:
2,主库收到BinlogSyncRequest之后会从同步点开始发出一批BinlogSyncResponse。
3,从库在收到BinlogSyncResponse之后,会在写入本地binlog之后再进行1流程。
Pika的同步由ReplicaManager(RM)模块负责。RM中有两层结构,逻辑层负责同步逻辑,传输层负责链接的管理数据的解析和传输。
数据的同步的最小单位是Partition,每一个Pika实例会维护自己作为主的partition(MasterPartition)和自己是从的partition(SlavePartition)。对于MasterPartition,需要记录跟随自己的slave同步信息,逻辑层会根据该信息向slave同步信息。对于SlavePartition,则是需要需要记录master的信息,逻辑层会按照该信息按需向master发送同步请求。
逻辑层维护两个数据结构,一个是MasterPartitions,记录跟随自己的SlaveNode信息,主要包括slave的同步状态和当前的sessionId。另一个是SlavePartitions,记录主的信息。
传输层分为两个子模块,ReplicationClient负责发起链接的建立,ReplicationServer负责响应报文。每两个实例之间的所有partition复用一条链接。
逻辑层处理MasterPartition的同步事件,向其对应的从同步数据。
1,读取MasterPartition Binlog信息后,将BinlogOffsetInfo记录到SlaveNode自己的window中。
2,将Binlog暂存到临时的待发送队列中。
3,辅助线程(Auxiliary thread) 定时将临时待发送队列的数据通过RM的传输层发送给对应的slave节点。
4,收到slave的BinlogSyncResponse之后,得知slave收到的BinlogOffset信息,更新SlaveNode window,重复1流程继续同步
为了控制每个SlaveNode同步的速度,避免某几个SlaveNode占用过多资源,为每一个SlaveNode设置了window。如下图所示,Pika收到了BinlogOffset为100到200的ack response,从window中移除BinlogOffset位于100到200的元素,之后继续发送BinlogOffset为1100和1200的binlog,对应的BinlogOffset添加至window中。
逻辑层处理SlavePartition的同步事件,收到master发送的同步数据,向master发相应的response信息。
1,按照解析出的Partition信息,被分配到对应的线程处理binlog写入任务。
2,线程写入binlog之后,调用传输层发送BinlogSyncResponse信息。
3,根据binlog的key分配给对应的线程处理写入db任务。