7.2.3 复制与一致性

云SQL Server采用"Quorum Commit"的复制协议,用户数据存储三个副本,至少写成功两个副本才可以返回客户端成功。如图7-5所示,事务T的主副本分区生成操作日志并发送到备副本。如果事务T回滚,主副本会发送一个ABORT消息给备副本,备副本将删除接收到的T事务包含的修改操作。如果事务T提交,主副本会发送COMMIT消息给备副本,并带上事务提交顺序号(Commit Sequence Number,CSN),每个备副本会把事务T的修改操作应用到本地数据库并发送ACK消息回复主副本。如果主副本接收到一半以上的成功ACK(包含主副本自身),它将在本地提交事务并成功返回客户端。

7.2.3 复制与一致性 - 图1

图 7-5 云SQL Server主备同步

某些备副本可能出现故障,恢复后将往主副本发送本地已经提交的最后一个事务的提交顺序号。如果两者相差不多,主副本将直接发送操作日志给备副本;如果两者相差太多,主副本将首先把数据库快照传给备副本,再把快照点之后的操作日志传给备副本。

主副本与备副本之间传送逻辑操作日志,而不是对磁盘物理页的redo&undo日志。数据库索引及schema相关操作(如创建,删除表格)也通过操作日志发送。实践过程中发现了一些硬件问题,比如某些网卡会表现出错误的行为,因此对主备之间的所有消息都会做校验(checksum)。同样,某些磁盘会出现“位翻转”错误,因此,对写入到磁盘的数据也做校验。