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. 补充说明

  1. 在同步提交模式下,日志块必须在主副本和辅助副本上都被固化到磁盘上,事务才能真正在主数据上提交。但是它并不要求日志在辅助副本上完成重做,这样可以减轻对主副本的性能影响。
  2. 进入DISCONNECTED或"NOT SYNCHRONIZING"状态后,即使可用性副本处于同步提交模式,事务也不需要等待该副本的响应就可以在主副本上提交。
  3. 如果为当前主副本配置了异步提交可用性模式,则它将通过异步方式为所有辅助副本提交事务,而不管这些副本各自的可用性模式设置如何。
  4. 它可以保证事务日志是同步的,也就是可以保证不丢失数据,但不能保证数据变化没有延时,这是由于辅助副本在接收主副本传来的Trans log时,首先将其缓到本地Log Cache,接着强制硬化到本地Ldf,然后随即向主副本告知你可以commit了,但注意,此时的硬化到本地ldf并非本地数据已经变化,这是因为辅助副本将trans log硬化到本地的同时,它是使用一个异步进程去redo这些trans log产生的Page变化到Data文件的,所以数据的延时就是肯定的了。

3.AlwaysOn异步提交模式

  •          当辅助副本处于异步提交模式下时,主副本无须确认该辅助副本已经完成日志固化,就可以提交事务。因此,主数据库事务提交不会受到辅助数据库的影响而产生等待。
  •           对于主副本和辅助副本相隔很远而且不希望小错误影响主副本性能的灾难恢复方案,异步提交模式将会很有用。而且,由于主副本不会等待来自辅助副本的确认,因而辅助副本上的问题从不会影响主副本。
  • 在异步提交模式下,辅助副本会尽量与自主副本的日志记录保持一致。不过,即使辅助数据库和主数据库上的数据事实上是同步的,可用性组也始终认为辅助数据库处于“SYNCHRONIZING”状态(即“未同步”状态)。

部分内容参照书籍《SQL Server 2012 实施与管理实战指南》,感谢原作者。

SQL Sever AlwaysOn的数据同步原理的更多相关文章

  1. AlwaysOn的数据同步原理

    摘抄自<SQL Server 2012实施与管理实战指南> 镜像的工作原理: 那么主体数据库和镜像数据库是如何同步数据的呢?SQL数据库中任何的数据变化都会先记录到事务日志中,然后才会真正 ...

  2. SQLServer 2012之AlwaysOn —— 指定数据同步链路,消除网络抖动导致的提交延迟问题

    事件起因:近期有研发反应,某数据库从08切换到12环境后,不定期出现写操作提交延迟的问题: 事件分析:在排除了系统资源争用等问题后,初步分析可能由于网络抖动导致同步模式alwayson节点经常出现会话 ...

  3. MongoDB副本集配置系列十一:MongoDB 数据同步原理和自动故障转移的原理

    1:数据同步的原理: 当Primary节点完成数据操作后,Secondary会做出一系列的动作保证数据的同步: 1:检查自己local库的oplog.rs集合找出最近的时间戳. 2:检查Primary ...

  4. sql server作业实现数据同步

    作业介绍  SQL SERVER的作业是一系列由SQL SERVER代理按顺序执行的指定操作.作业可以执行一系列活动,包括运行Transact-SQL脚本.命令行应用程序.Microsoft Acti ...

  5. Oracle与SQL Server实现表数据同步

    将SQLServer2008中的某些表同步到Oracle数据库中,不同数据库类型之间的数据同步我们可以使用链接服务器和SQLAgent来实现. 实例1:SQLServer2008有一个表employ_ ...

  6. Redis 高可用篇:你管这叫主从架构数据同步原理?

    在<Redis 核心篇:唯快不破的秘密>中,「码哥」揭秘了 Redis 五大数据类型底层的数据结构.IO 模型.线程模型.渐进式 rehash 掌握了 Redis 快的本质原因. 接着,在 ...

  7. MongoDB副本集配置系列十:MongoDB local库详解和数据同步原理

    1:local库是MongoDB的系统库,记录着时间戳和索引和复制集等信息 gechongrepl:PRIMARY> use local switched to db local gechong ...

  8. SQL数据同步到ELK(四)- 利用SQL SERVER Track Data相关功能同步数据(上)

    一.相关文档 老规矩,为了避免我的解释误导大家,请大家务必通过官网了解一波SQL SERVER的相关功能. 文档地址: 整体介绍文档:https://docs.microsoft.com/en-us/ ...

  9. 如何把本机Sql Sever数据库转移到虚拟主机sql数据库

    不少站长的网站都是asp+access的网站  因为操作access数据库的网站非常简单,甚至你对数据库不懂都可以 但如果是mssql数据库的网站,有些新手朋友就不知道该怎么弄了  在这里给大家做个简 ...

随机推荐

  1. [Swift]LeetCode375. 猜数字大小 II | Guess Number Higher or Lower II

    We are playing the Guess Game. The game is as follows: I pick a number from 1 to n. You have to gues ...

  2. [Swift]LeetCode556. 下一个更大元素 III | Next Greater Element III

    Given a positive 32-bit integer n, you need to find the smallest 32-bit integer which has exactly th ...

  3. HTTPS 到底加密了什么?

    关于 HTTP 和 HTTPS 这个老生常谈的话题,我们之前已经写过很多文章了,比如这篇<从HTTP到HTTPS再到HSTS>,详细讲解了 HTTP 和 HTTPS 的进化之路,对的没错, ...

  4. Elasticsearch之删除索引

    1. #删除指定索引    # curl -XDELETE -u elastic:changeme http://localhost:9200/acc-apply-2018.08.09    {&qu ...

  5. ZooKeeper 01 - 什么是ZooKeeper + 部署ZooKeeper集群

    目录 1 什么是ZooKeeper 2 ZooKeeper的功能 2.1 配置管理 2.2 命名服务 2.3 分布式锁 2.4 集群管理 3 部署ZooKeeper集群 3.1 下载并解压安装包 3. ...

  6. PyQt:左侧选项卡

    写在前面 正在用pyqt写我们比赛项目的客户端,针对左侧选项卡,写了一个简单的demo.记录一下. 环境 Python3.5.2 PyQt5 陈述 用的结构是左边一个QListWidget + 右边Q ...

  7. [Leetcode]237. Delete Node in a Linked List -David_Lin

    Write a function to delete a node (except the tail) in a singly linked list, given only access to th ...

  8. 前端笔记之JavaScript(一)初识JavaScript

    一.JavaScript简介 1.1网页分层 web前端一共分三层: 结构层 HTML         : 负责搭建页面结构 样式层 CSS          : 负责页面的美观 行为层 JavaSc ...

  9. Chapter 4 Invitations——13

    "Thank you," I said icily. “谢谢你”,我冰冷的说道. His eyes narrowed. 他眯着眼睛. "You're welcome,&q ...

  10. JAVA内存分配与回收策略

    对象的内存分配,大方向上讲,就是在堆上分配,对象主要分配在新生代的Eden区上,如果启动了本地线程分配缓冲,将按线程优先在TLAB上分配.少数情况下也可能会直接分配在老年代中,分配规则并不是百分百固定 ...