AlwaysOn的数据同步原理
摘抄自《SQL Server 2012实施与管理实战指南》
镜像的工作原理:
那么主体数据库和镜像数据库是如何同步数据的呢?
SQL数据库中任何的数据变化都会先记录到事务日志中,然后才会真正更新数据页面。而事务日志是
先保存在该数据库的日志缓存(log buffer)里,然后将缓冲中的日志固化到磁盘上LDF文件中。在数据库
镜像中,主体服务器在将主体数据库的日志从日志缓存固化到磁盘的同时,还会使用另一个线程来将日志
块(log block)发送到镜像服务器的端点。当镜像服务器通过端点接收到日志块后,他先将日志块
放到镜像数据库的日志缓存里,然后将缓存里的日志固化到磁盘上。一旦日志块被固化后,镜像服务器会
根据日志来对镜像数据库执行“重做(redo)”,最终更新数据页面。当镜像服务器重做日志时,镜像数据库
实际就是在执行日志的前滚操作。如果重做失败,则镜像服务器通过将数据库至于suspended状态
来暂停会话。DBA必须找到问题的原因并解决问题才能继续会话。当主体服务器截断或收缩数据库事务日志时,
镜像服务器也将在日志的同一点收缩日志。
可以看到,数据库镜像其实就是通过发送日志来保持伙伴之间的同步。从SQL2008开始,日志块在被主体服务器
发送网络之前会做压缩处理。这麽做的目的是为了提升日志发送和接收的效率,降低日志块传输对网络链路
和网络设备所带来的负载。对应那些异常繁忙的生产系统,这项功能不但降低了由于网络不胜负荷的镜像会话
异常中断,也降低由于网络延迟导致的数据库镜像性能问题,可谓一举两得。
AlwaysOn的工作原理: AlwaysOn跟镜像有相同也有不同
3.2 AlwaysOn的数据同步原理
像数据库镜像技术一样,AlwaysOn会在各个副本上都维护一套数据副本。主副本上发生的数据变化,会同步到辅助副本上。所以和镜像一样,AlwaysOn也要完成三件事:
1.把主副本上发生的数据变化记录下来。
2.把这些记录传输到各个辅助副本。
3.把数据变化在辅助副本上同样完成一遍。
那AlwaysOn又是怎么做的呢?在主副本和辅助副本上,SQL Server都会启动相应的线程来完成相应的任务。
现在先从主副本谈起。
任何一个SQL Server里都有个叫Log Writer的线程,当任何一个SQL用户提交一个数据修改事务时,
它会负责把记录本次修改的日志信息先记入一段内存中的日志缓冲区,然后再写入物理日志文件(日志固化)。
所以对于任何一个数据库,日志文件里都会有所有数据变化的记录。
对于配置为AlwaysOn主副本的数据库,SQL Server会为它建立一个叫Log Scanner的工作线程。
这个线程专门负责将日志记录从日志缓冲区或者日志文件里中读出,打包成日志块,发送给各个辅助副本。
由于它的不间断工作,才使主副本上的数据变化,可以不断地向辅助副本上传播。
在辅助副本上,同样会有两个线程,完成相应的数据更新动作,它们是固化(Harden)和重做(Redo)。
固化线程会将主副本Log Scanner所发过来的日志块写入辅助副本的磁盘上的日志文件里(这个过程被称为"固化")。
而重做线程,则负责从磁盘上读取日志块,将日志记录翻译成数据修改操作,在辅助副本的数据库上完成。
当重做线程完成其工作以后,辅助副本上的数据库就会跟主副本一致了。AlwaysOn就是通过这种机制,保持副本之间的同步。
重做线程每隔固定的时间点,会跟主副本通信,告知它自己的工作进度。主副本就能够知道两边数据的差距有多远。
这些线程在工作上各自独立,以达到更高的效率。Log Scanner负责传送日志块,而无须等待Log Writer完成日志固化;辅助副本完成日志固化以后就会发送消息到主副本,告知数据已经传递完毕,而无须等待重做完成。其设计目标,是尽可能地减少AlwaysOn所带来的额外操作对正常数据库操作的性能影响。
读到这里,你或许会想,既然这些线程都是独立工作的,那主副本和辅助副本之间的数据差异量是怎么控制的呢?如何能保证主副本上的所有数据变化,都能被安全地传递到各个辅助副本上呢?AlwaysOn里有相应的机制,让这些线程相互协作。而副本之间是否允许有数据差异,则是由AlwaysOn的可用性模式决定的。
AlwaysOn的数据同步原理的更多相关文章
- SQL Sever AlwaysOn的数据同步原理
1. SQL Server AlwaysOn数据同步基本工作 AlwaysOn 副本同步需要完成三件事: 1.把主副本上发生的数据变化记录下来. 2.把这些记录传输到各个辅助副本. 3.把数据变化在辅 ...
- SQLServer 2012之AlwaysOn —— 指定数据同步链路,消除网络抖动导致的提交延迟问题
事件起因:近期有研发反应,某数据库从08切换到12环境后,不定期出现写操作提交延迟的问题: 事件分析:在排除了系统资源争用等问题后,初步分析可能由于网络抖动导致同步模式alwayson节点经常出现会话 ...
- MongoDB副本集配置系列十一:MongoDB 数据同步原理和自动故障转移的原理
1:数据同步的原理: 当Primary节点完成数据操作后,Secondary会做出一系列的动作保证数据的同步: 1:检查自己local库的oplog.rs集合找出最近的时间戳. 2:检查Primary ...
- Redis 高可用篇:你管这叫主从架构数据同步原理?
在<Redis 核心篇:唯快不破的秘密>中,「码哥」揭秘了 Redis 五大数据类型底层的数据结构.IO 模型.线程模型.渐进式 rehash 掌握了 Redis 快的本质原因. 接着,在 ...
- MongoDB副本集配置系列十:MongoDB local库详解和数据同步原理
1:local库是MongoDB的系统库,记录着时间戳和索引和复制集等信息 gechongrepl:PRIMARY> use local switched to db local gechong ...
- rsync数据同步备份
一.rsync简介 (1)rsync是什么? rsync是一款开源的.快速的.多功能的.可实现全量及增量的本地或远程数据同步备份的优秀工具. (2)rsync作用比较 远程拷贝:有点类似ssh的scp ...
- 两台SQL Server数据同步解决方案
复制的概念 复制是将一组数据从一个数据源拷贝到多个数据源的技术,是将一份数据发布到多个存储站点上的有效方式.使用复制技术,用户可以将一份数据发布到多台服务器上,从而使不同的服务器用户都可以在权限的许可 ...
- rsync 文件校验及同步原理
rsync 文件校验及同步原理 参考:http://rsync.samba.org/how-rsync-works.html 我们关注的是其发送与接收校验文件的算法,这里附上原文和我老婆(^_^)的翻 ...
- redis 学习笔记——数据同步、事务
redis主从同步 redis支持简单易用的主从复制(master-slave replication)功能,该功能也是redis高可用性实现的基础. redis复制原理 re ...
随机推荐
- POJ 1222 EXTENDED LIGHTS OUT(反转)
EXTENDED LIGHTS OUT Time Limit: 1000MS Memory Limit: 10000K Total Submissions: 12616 Accepted: 8 ...
- 1123 Is It a Complete AVL Tree
1123 Is It a Complete AVL Tree(30 分) An AVL tree is a self-balancing binary search tree. In an AVL t ...
- ALSA声卡笔记1---ALSA驱动框架
1.声卡驱动程序sound.c (1)入口函数里通过register_chrdev()函数注册file_operations 结构体 (2)file_operations 结构体,里面只有open函数 ...
- PowerMock单元测试
在Java程序的单元测试中常用的mock工具有Mockito和EasyMock.但是这两种mock工具都无法实现对静态.final.私有方法或类的mock.因此有了功能强大的PowerMock工具.P ...
- POJ-3273 Monthly Expense (最大值最小化问题)
/* Monthly Expense Time Limit: 2000MS Memory Limit: 65536K Total Submissions: 10757 Accepted: 4390 D ...
- Python Twisted系列教程19:改变之前的想法
作者:dave@http://krondo.com/i-thought-i-wanted-it-but-i-changed-my-mind/ 译者: Cheng Luo 你可以从”第一部分 Twis ...
- SVN更新或提交时出现冲突该如何解决
解决版本冲突的命令.在冲突解决之后,需要使用svnresolved来告诉subversion冲突解决,这样才能提交更新.冲突发生时,subversion会在WorkCopy中保存所有的目标文件版本(上 ...
- 接口测试基础operation
Jmeter接口测试 一般分五个步骤: (1)添加线程组 (2)添加http请求 (3)在http请求中写入接入url.路径.请求方式和参数 (4)添加查看结果树 (5)调用接口.查看返回值
- 通过Java代码装配Bean
上面梳理了通过注解来隐式的完成了组件的扫描和自动装配,下面来学习下如何通过显式的配置的装配bean 二.通过Java类装配bean 在前面定义了HelloWorldConfig类,并使用@Compon ...
- ror笔记2
在rails app的 config 文件夹中新建unicorn.rb内容如下 worker_processes 2 working_directory "/home/mage/boleht ...