SQL Sever AlwaysOn的数据同步原理
1. SQL Server AlwaysOn数据同步基本工作
AlwaysOn 副本同步需要完成三件事:
1.把主副本上发生的数据变化记录下来。
2.把这些记录传输到各个辅助副本。
3.把数据变化在辅助副本上同样完成一遍。
这3件工作主要由以下4个线程完成
Log Writer线程:当任何一个SQL用户提交一个数据修改事务时,它会负责把记录本次修改的日志信息先记入一段内存中的日志缓冲区,然后再写入物理日志文件(日志固化)。
Log Scanner工作线程:位于主副本所在SQL Server上。这个线程专门负责将日志记录从日志缓冲区或者日志文件里中读出,打包成日志块,发送给各个辅助副本。由于它的不间断工作,才使主副本上的数据变化,可以不断地向辅助副本上传播。
固化(Harden)线程和重做(Redo)线程:位于辅助副本所在的SQL server上。固化线程会将主副本Log Scanner所发过来的日志块写入辅助副本的磁盘上的日志文件里(这个过程被称为"固化")。而重做线程,则负责从磁盘上读取日志块,将日志记录翻译成数据修改操作,在辅助副本的数据库上完成。
这些线程在工作上各自独立,以达到更高的效率。Log Scanner负责传送日志块,而无须等待Log Writer完成日志固化;辅助副本完成日志固化以后就会发送消息到主副本,告知数据已经传递完毕,而无须等待重做完成。其设计目标,是尽可能地减少AlwaysOn所带来的额外操作对正常数据库操作的性能影响。
AlwaysOn的数据同步有可分为异步提交和同步提交
2. AlwaysOn同步提交模式
在同步提交模式下由可分为 辅助副本发出同步请求和主副本发出同步请求。
2.1 辅助副本发出同步请求
此情况,主要发生在辅助副本刚刚加入可用性组、或者网络等原因主副本出现差异、或者辅助副本出现脏页(物理)等少数情况下。

|
步 骤 |
行 为 |
| 1.连接 | 辅助副本通过主副本的镜像端点建立两者之间的连接。 |
| 2.请求数据 |
辅助副本发出一个请求到主副本,要求主副本发送日志块。辅助副本和主副本 会协商出一个日志块的LSN初始位置以及一些其他的信息。 |
| 3.运行Log Scanner |
在主副本上,Log Scanner的工作线程开始工作。Log Scanner负责将日志块 传送到辅助副本。 |
| 4.固化和重做日志 |
辅助副本会使用固化(Harden)线程和重做(Redo)线程的工作线程来处理 Log Scanner发送过来的日志块,固化线程将日志块固化到辅助副本的磁盘上 ,而重做线程负责将日志中记录的事务在辅助副本上重新演绎。 |
| 5.反馈进度 |
每当辅助副本收到3条来自主副本的消息的时候,就把固化和重做的进度作为 一个消息返回给主副本。如果超过1秒还没收到3条消息,进度消息也会被返回。 反馈到主副本的消息里包含了哪些LSN已经在辅助副本上被重做和固化。 |
2.1 主副本发出同步请求,即客户端提交SQL请求触发的同步请求

| 步 骤 | 行 为 |
| 1.提交事务 | 在主副本上运行COMMIT TRAN命令来提交事务. |
|
2.写入到本 |
在主副本上,COMMIT TRAN命令会被写成一条日志记录(此时记录还在主数据库的日志缓存中). 然后主副本上的log writer工作线程会把直到COMMIT命令为止的所有日志记录组成一个日志块 从缓存写入到磁盘上的LDF文件中。当日志被写入到磁盘之后,主数据库就开始等待来自辅助副本 的消息来确认日志在辅助数据库上被成功写入磁盘。在这之前,该事务提交操作会保持等待。 |
| 3.扫描日志 |
当日志块开始被从缓存写入到磁盘上时,它也会发信号给Log Scanner工作线程,告诉 Log Scanner“日志已经准备好了,可以被发送到辅助副本上”。Log Scanner从缓存中取出 日志块,把它发送给AlwaysOn的日志块解码器(Log Block Cracker)。解码器会搜索日志 中那些需要特别处理的操作,比如file stream操作,文件增长等。解码器会把这些操作作为 一个消息发送给辅助副本。一旦日志块被解码完毕,整个日志块也会被作为消息发送给辅助副本. |
| 4.处理日志块消息 |
日志块消息在辅助副本上得到处理。固化线程负责将日志固化到磁盘上。然后日志被保存到辅助 数据库的日志缓存中,重做线程从缓存中获得日志块并开始执行重做操作. |
| 5.反馈进度 |
每当辅助副本收到3条来自主副本的消息时,就把固化和重做的进度作为一个消息返回给主副本。 如果超过1秒还没收到3条消息,进度消息也会被返回。进度信息中包含当前哪些LSN被固化了, 哪些LSN已经被重做了。由于重做线程晚于固化操作启动,被固化的LSN可能会多于被重做的LSN. |
| 6.完成提交 | 主数据库受到了辅助副本来的确认消息,完成事务提交处理并向客户端发送一条确认消息. |
2. 补充说明
- 在同步提交模式下,日志块必须在主副本和辅助副本上都被固化到磁盘上,事务才能真正在主数据上提交。但是它并不要求日志在辅助副本上完成重做,这样可以减轻对主副本的性能影响。
- 进入DISCONNECTED或"NOT SYNCHRONIZING"状态后,即使可用性副本处于同步提交模式,事务也不需要等待该副本的响应就可以在主副本上提交。
- 如果为当前主副本配置了异步提交可用性模式,则它将通过异步方式为所有辅助副本提交事务,而不管这些副本各自的可用性模式设置如何。
- 它可以保证事务日志是同步的,也就是可以保证不丢失数据,但不能保证数据变化没有延时,这是由于辅助副本在接收主副本传来的Trans log时,首先将其缓到本地Log Cache,接着强制硬化到本地Ldf,然后随即向主副本告知你可以commit了,但注意,此时的硬化到本地ldf并非本地数据已经变化,这是因为辅助副本将trans log硬化到本地的同时,它是使用一个异步进程去redo这些trans log产生的Page变化到Data文件的,所以数据的延时就是肯定的了。
3.AlwaysOn异步提交模式
- 当辅助副本处于异步提交模式下时,主副本无须确认该辅助副本已经完成日志固化,就可以提交事务。因此,主数据库事务提交不会受到辅助数据库的影响而产生等待。
- 对于主副本和辅助副本相隔很远而且不希望小错误影响主副本性能的灾难恢复方案,异步提交模式将会很有用。而且,由于主副本不会等待来自辅助副本的确认,因而辅助副本上的问题从不会影响主副本。
- 在异步提交模式下,辅助副本会尽量与自主副本的日志记录保持一致。不过,即使辅助数据库和主数据库上的数据事实上是同步的,可用性组也始终认为辅助数据库处于“SYNCHRONIZING”状态(即“未同步”状态)。
部分内容参照书籍《SQL Server 2012 实施与管理实战指南》,感谢原作者。
SQL Sever AlwaysOn的数据同步原理的更多相关文章
- AlwaysOn的数据同步原理
摘抄自<SQL Server 2012实施与管理实战指南> 镜像的工作原理: 那么主体数据库和镜像数据库是如何同步数据的呢?SQL数据库中任何的数据变化都会先记录到事务日志中,然后才会真正 ...
- SQLServer 2012之AlwaysOn —— 指定数据同步链路,消除网络抖动导致的提交延迟问题
事件起因:近期有研发反应,某数据库从08切换到12环境后,不定期出现写操作提交延迟的问题: 事件分析:在排除了系统资源争用等问题后,初步分析可能由于网络抖动导致同步模式alwayson节点经常出现会话 ...
- MongoDB副本集配置系列十一:MongoDB 数据同步原理和自动故障转移的原理
1:数据同步的原理: 当Primary节点完成数据操作后,Secondary会做出一系列的动作保证数据的同步: 1:检查自己local库的oplog.rs集合找出最近的时间戳. 2:检查Primary ...
- sql server作业实现数据同步
作业介绍 SQL SERVER的作业是一系列由SQL SERVER代理按顺序执行的指定操作.作业可以执行一系列活动,包括运行Transact-SQL脚本.命令行应用程序.Microsoft Acti ...
- Oracle与SQL Server实现表数据同步
将SQLServer2008中的某些表同步到Oracle数据库中,不同数据库类型之间的数据同步我们可以使用链接服务器和SQLAgent来实现. 实例1:SQLServer2008有一个表employ_ ...
- Redis 高可用篇:你管这叫主从架构数据同步原理?
在<Redis 核心篇:唯快不破的秘密>中,「码哥」揭秘了 Redis 五大数据类型底层的数据结构.IO 模型.线程模型.渐进式 rehash 掌握了 Redis 快的本质原因. 接着,在 ...
- MongoDB副本集配置系列十:MongoDB local库详解和数据同步原理
1:local库是MongoDB的系统库,记录着时间戳和索引和复制集等信息 gechongrepl:PRIMARY> use local switched to db local gechong ...
- SQL数据同步到ELK(四)- 利用SQL SERVER Track Data相关功能同步数据(上)
一.相关文档 老规矩,为了避免我的解释误导大家,请大家务必通过官网了解一波SQL SERVER的相关功能. 文档地址: 整体介绍文档:https://docs.microsoft.com/en-us/ ...
- 如何把本机Sql Sever数据库转移到虚拟主机sql数据库
不少站长的网站都是asp+access的网站 因为操作access数据库的网站非常简单,甚至你对数据库不懂都可以 但如果是mssql数据库的网站,有些新手朋友就不知道该怎么弄了 在这里给大家做个简 ...
随机推荐
- [Swift]LeetCode334. 递增的三元子序列 | Increasing Triplet Subsequence
Given an unsorted array return whether an increasing subsequence of length 3 exists or not in the ar ...
- apache(OS 10013)以一种访问权限不允许的方式做了一个访问套接字的尝试 ...
今天启动Apache时, 报了“(OS 10013)以一种访问权限不允许的方式做了一个访问套接字的尝试. : make_sock: could not bind to address 0.0.0.0: ...
- Linux 下源码编译FFMEG
目录 1. 安装依赖关系 2. 源码安装 yasm 3. 源码安装 NASM 4. 源码安装libx264 5. 源码安装x265 6. 源码安装 libmp3lame 7. 源码安装 libopus ...
- 机器学习入门15 - 训练神经网络 (Training Neural Networks)
原文链接:https://developers.google.com/machine-learning/crash-course/training-neural-networks/ 反向传播算法是最常 ...
- 面向对象-Java MOOC翁恺老师第一次作业
由于看这个慕课的时候已经结课了,没有办法提交查看代码是否正确...先保存一下,以后再提交改错 欢迎批评指正! 题目链接:https://www.icourse163.org/learn/ZJU-100 ...
- 从搭建V2Ray服务器到编译V2Milk的完整过程
概述 因为公司出口ip一直在变,所以waf白名单不好加入,所以搭一个了代理服务器 .搭建了V2Ray服务器 .为了好管理,找了一个@Zzm317开源的V2Milk. V2Milk为V2Ray跨平台定制 ...
- 20行以内python代码画出各种减压图
一.太阳花 看到一个很有意思的代码,你若安好,便是晴天!太阳花向你开~ 绘画效果如下: 代码如下: from turtle import * color('red', 'yellow') begin_ ...
- HBase篇--搭建HBase完全分布式集群
一.前述. 完全分布式基于hadoop集群和Zookeeper集群.所以在搭建之前保证hadoop集群和Zookeeper集群可用.可参考本人博客地址 https://www.cnblogs.com/ ...
- asp.net core 系列 11 配置configuration (下)
四. 文件配置提供程序AddIniFile. AddXmlFile.AddJsonFile FileConfigurationProvider 是从文件系统加载配置的基类. 以下配置提供程序专用于特定 ...
- QQ音乐的动效歌词是如何实践的?
本文由云+社区发表 作者:QQ音乐技术团队 一. 背景 1. 现状 歌词浏览已经成为音乐app的标配,展示和动画效果也基本上大同小异,主要是单行的逐字染色的卡拉OK效果和多行的滚动效果.当然,我们也不 ...