现在的位置: 首页 > 综合 > 正文

SQL Server 2012 新一代的高可用技术AlwaysOn 之三 AlwaysOn的数据同步原理

2013年12月08日 ⁄ 综合 ⁄ 共 1030字 ⁄ 字号 评论关闭

像数据库镜像技术一样,AlwaysOn会在各个副本上都维护一套数据拷贝。主副本上发生的数据变化,会同步到辅助副本上。所以和镜像一样,AlwaysOn也要完成三件事:

1.把主副本上发生的数据变化记录下来

2.把这些记录传输到各个辅助副本

3.把数据变化在辅助副本上同样完成一遍。

AlwaysOn又是怎么做的呢?在主副本和辅助副本上,SQL  Server都会启动相应的线程,完成相应的任务。现在先从主副本谈起。

任何一个SQLServer里都有个叫LogWriter的线程,当任何一个SQL用户提交一个数据修改事务时,它会负责把记录有这个修改的日志信息,先记入一段内存中的日志缓冲区,然后再写入物理日志文件(日志固化)。所以对于任何一个数据库,日志文件里都会有所以数据变化的记录。

对于配置为AlwaysOn主副本的数据库,SQLServer会为它建立一个叫LogScanner的工作线程。这个线程专门负责将日志记录从日志缓冲区或者日志文件里中读出,打包成日志块,发送给各个辅助副本。由于它的不停工作,主副本上的数据变化,可以不断地向辅助副本上传播。

在辅助副本上,同样会有两个线程,完成相应的数据更新动作,它们是固化(Harden)和重做(Redo)。固化线程会将主副本LogScanner所发过来的日志块写入辅助副本的磁盘上的日志文件里(这个过程被称为“固化”)。而重做线程,则负责从磁盘上读取日志块,将日志记录翻译成数据修改操作,在辅助副本的数据库上完成。

当重做线程完成其工作以后,辅助副本上的数据库就会跟主副本一致了。AlwaysOn就是通过这种机制,保持副本之间的同步。重做线程每隔固定的时间点,会跟主副本通讯,告知它自己的工作进度。主副本就能够知道两边数据的差距有多远。

这些线程在工作上各自独立,以达到更高的效率。LogScanner负责传送日志块,而无须等待LogWriter完成日志固化;辅助副本完成日志固化以后就会发送消息到主副本,告知数据已经传递完毕,而无须等待重做完成。其设计目标,是尽可能地减少AlwaysOn所带来的额外操作对正常数据库操作的性能影响。

读到这里,你或许会想,既然这些线程都是独立工作的,那主副本和辅助副本之间的数据差异量是怎么控制的呢?如何能保证主副本上的所有数据变化,都能被安全地传递到各个辅助副本上呢?AlwaysOn里有相应的机制,让这些线程相互协作。而副本之间是否允许有数据差异,则是由AlwaysOn的可用性模式决定的。

抱歉!评论已关闭.