先看文档中的 Fault tolerant support 部分
primary node 和 standby node 在主数据文件之外,还多了一个以 cnt 为后缀的文件,这个文件里面存储的是整数数组,有物理上能存多少个页面,这个数组就有多在,数据的每一个元素与一个页面相对应,是只增不减的,当这个页面更新过之后,这个整数就递增,不一定是递增1。这个文件主要是为了增量恢复,当primary node 和 standby node 中对应的整数相等时,就说明这两个结点的内容相同,否则,就应是从较大的拷贝,覆盖较小的,
primary node 和 standby node 之间是通过socket进行通信的,每次传递的数据是页面大小4K的整数倍,把每次修改后的相邻页面做为一个整体发送,
数据的接收是在dbfile类的:
bool updatePages(socket_t* s, size_t pos, int updateCount, int size);
bool concurrentUpdatePages(socket_t* s, size_t pos, int updateCount, int size);
发送是在在dbfile类的:
int dbFile::flush(bool physical)
在数据库的启动过程中,
master node 向slave node 发送 ONLINE 状态;slave node 向 master node 发送 RECOVERED 状态,为的是当找到新的master node 后,从其同步最新的数据
master node 将自身的状态改为 ACTIVE;slave node 会轮寻 master node ,直到收到的的master node 状态改为ACTIVE;
之后交给void dbReplicatedDatabase::reader(),创建的线程进行双方的通信