新一代读写分离技术——AlwaysOn

早在SQL Server 2005的时候微软就已经实现了数据库的查询分离技术——发布订阅。但生产库和查询库的同步性能较差,时常出现性能问题,因此在大型生产环境中一直被人所诟病。

从SQL Server 2012开始,微软逐渐使用AlwaysON技术来取代发布订阅。AlwaysOn 作为SQL Server 2012引入的一种新的技术架构,性能相比发布订阅而言提升很多,最明显的区别在于其充分利用内存高效读取的原理来实现日志的传递。下文将通过AlwaysOn的同步原理和可用模式来详细了解AlwaysOn的同步优势。

AlwaysOn同步原理

AlwaysON是一种整库同步的技术,所有的成员服务器都维护一套相同的数据库副本。当主副本上的数据发生变化时,数据会实时同步到辅助副本上。这点与数据库镜像非常类似。

下图详细描述了AlwaysON数据同步的整个过程,我们先来看看每个步骤所代表的意义。

① 主副本的logwiter把事务修改的日志信息先记入一段内存中的日志缓冲区,然后再写入物理日志文件(日志固化);

② 主副本的logscanner从缓存中或者日志文件中读取日志块,然后把它发送给AlwaysON的日志块解码器;

备注:解码器会搜索日志中那些需要特别处理的操作,比如file stream操作、文件增长等。

③ 主副本将日志块通过网络传送给辅助副本;

④ 和⑤

辅助副本接受到日志块后,logwiter把事务修改的日志信息先记入一段内存中的日志缓冲区,然后再写入物理日志文件(日志固化),另外,如果辅助副本处于同步可用模式时,在日志固化后,还必须反馈信息给主副本,主副本在接受到辅助副本完成固化的消息后才可以提交该事务,如果辅助副本在异步可用模式或者主副本在异步模式下,主副本提交事务与否跟辅助副本是否完成日志固化没有关系,下文在介绍可用模式时会详细介绍;

⑤ 重做(Redo)线程将日志中记录的事务在辅助副本上重新演绎。重做线程每隔固定的时间点,会跟主副本通信,告知它自己的工作进度。主副本就能够知道两边数据的差距有多远。

AlwaysOn VS 发布订阅

我们知道,事务日志发布订阅通常不会用于整个数据库的同步,而同步发布库中的部分对象,而AlwaysON却是整个数据库都要同步,从数据量的角度来说,AlwaysON要同步的数据要更多,那为什么其性能还更好呢?

我们从如下两个个方面的对比来寻找答案吧:

1. 同步对象

发布订阅的同步对象是已经写入到磁盘的事务日志,但不是所有的事务日志都发布,只有那些被标记为待发布的日志才会被发布,因此它不仅需要读磁盘,而且对于某个事务,扫描所有日志才能筛选到标记为待发布的日志,如果这个事务的日志非常多而待发布的日志非常少,则日志读取器的效率将非常低;

而AlwaysON同步的对象绝大部分位于内存的日志缓冲中,日志扫描器不需要读取磁盘或者只需读取少量磁盘,且AlwaysON是整库同步,只要是主副本产生的日志都会同步到辅助副本,不需要进行日志筛选,因此不仅读取速度快,而且效率还很高。

备注:AlwaysON同步的日志要比事务日志发布订阅的要多,但从网络角度来看不一定占用网络带宽也会更多,因为在AlwaysON中,网络上传递的是压缩了的日志,而发布订阅则没有做压缩的优化

2. 同步过程

在发布订阅中,日志无法直接从发布库到订阅库,期间必须通过分发库中转,每个过程都会产生大量的磁盘IO和网络消耗;

而AlwaysON是点到点的数据同步,日志从主副本直接发送到辅助副本,中间不需要中转,传输过程简单高效。

AlwaysOn的可用性模式

上文在介绍AlwaysON同步原理时,我们考虑地比较简单,只考虑了日志的同步情况。

如果要结合事务来整体考虑,AlwaysON的同步——更准确地说是可用模式,应该分为异步提交模式和同步提交模式。

可用性模式是AlwaysON中每个可用性副本的一个属性,它决定了主副本在提交事务之前是否需要等待某个辅助副本将事务日志记录固化到磁盘,如果需要等待,则该AlwaysON的可用模式为“同步提交模式,反之,则是“异步提交模式”。

异步提交模式

使用此可用性模式的可用性副本称为"异步提交副本"。

当辅助副本处于异步提交模式下或者尽管辅助副本在同步提交模式下,但此时主副本在异步提交模式时,主副本无须确认该辅助副本是否已经完成日志固化,就可以提交事务。因此,主数据库事务提交不会受到辅助数据库的影响而产生等待。但是,辅助数据库的更新可能会滞后于主数据库,如果发生故障转移,可能会导致某些数据丢失。因此这种可用模式适合于可用性副本的分布距离较远的情况。

同步提交模式

使用此可用性模式的可用性副本称为"同步提交副本"。同步提交模式要求主副本和辅助副本必须设置成同步提交副本。

在同步提交模式中,主副本必须确认辅助副本已经完成日志固化才可以提交事务(不需要等待辅助副本完成日志重做),这样就保证两边的数据始终是同步的。但是这种保障的代价是主数据库上的事务提交会有滞后时间。可以说,同步提交模式相对于性能而言更强调高可用性。

附上我的新浪微博二维码,期待跟大家畅游SQL Server的世界。

AlwaysON同步的原理及可用模式的更多相关文章

  1. SQL Server AlwaysON 同步模式的疑似陷阱

    原文:SQL Server AlwaysON 同步模式的疑似陷阱 SQL Server 2012 推出的最重要的功能之一Alwayson,是一个集之前Cluster和Mirror于一体的新功能,即解决 ...

  2. SQL Server AlwaysOn架构及原理

    SQL Server AlwaysOn架构及原理 SQL Server2012所支持的AlwaysOn技术集中了故障转移群集.数据库镜像和日志传送三者的优点,但又不相同.故障转移群集的单位是SQL实例 ...

  3. AlwaysON同步性能监控的三板斧

    延迟是AlwaysOn最大的敌人之一 延迟是AlwaysON的最大敌人之一.对AlwaysON而言,其首要目标就尽量减少(无法避免)主副本.辅助副本的数据延迟,实现主副本.辅助副本的“数据同步”.只有 ...

  4. CentOS6下OpenLDAP+PhpLdapAdmin基本安装及主从/主主高可用模式部署记录

    下面测试的部署机ip地址为:192.168.10.2051)yum安装OpenLDAP [root@openldap-server ~]# yum install openldap openldap- ...

  5. Redis主从原理及哨兵模式

    1.Redis主从搭建 主从的搭建很简单,主节点设置连接密码,从节点的配置上主节点的ip和端口,以及密码,一般从节点我们都设置只读模式. 主节点配置: 主节点密码: requirepass xxx 从 ...

  6. AlwaysOn 同步时间的测试

    背景 <SQL Server 2012实施与管理实战指南>中指AlwaysON同步过程如下: 任何一个SQL Server里都有个叫Log Writer的线程,当任何一个SQL用户提交一个 ...

  7. 深入解析Mysql 主从同步延迟原理及解决方案

    MySQL的主从同步是一个很成熟的架构,优点为:①在从服务器可以执行查询工作(即我们常说的读功能),降低主服务器压力;②在从主服务器进行备份,避免备份期间影响主服务器服务;③当主服务器出现问题时,可以 ...

  8. Discuz x3 UCenter实现同步登陆原理

    1.Discuz x3 的登录页面URL是:/member.php?mod=logging&action=login 2.这个登录页面,登录提交的地址是: <form method=&q ...

  9. gitlab高可用模式

    高可用模式 企业版 社区版 我们这里说一下成本比较低的主备模式,它主要依赖的是DRBD方式进行数据同步,需要2台ALL IN ONE的GitLab服务器,也就是通过上面安装方式把所有组件都安装在一起的 ...

随机推荐

  1. mysql解压缩安装(一)

    MySQL安装文件分为两种,一种是msi格式的,一种是zip格式的.如果是msi格式的可以直接点击安装,按照它给出的安装提示进行安装(相信大家的英文可以看懂英文提示),一般MySQL将会安装在C:\P ...

  2. php 学习日志- 变量作用域

    1.global 函数内访问全局变量 <?php $x=5; $y=10; function myTest() { global $x,$y; $y=$x+$y; } myTest(); ech ...

  3. Hibernate和jsp做数据库单表的增删改查

    虽然很基础,但是我转牛角尖了~~~~这是几个文件 1.最重要的.Java文件 package com.chinasofti.hibb.struts; import org.hibernate.Sess ...

  4. 升级到iOS9之后的相关适配

    iOS9AdaptationTips(iOS9开发学习交流群:458884057) iOS9适配系列教程[中文在页面下方]转自@iOS程序犭袁 (截至2015年9月26日共有10篇,后续还将持续更新. ...

  5. 用C语言关于学生管理系统的几种实现方法(一位数组,二维数组,指针,结构体)

    一位数组: #include <stdio.h> #include<string.h> #define N 5 void luru(float s[],int n); void ...

  6. javascript中onload事件如何绑定及执行顺序

    onload事件,顾名思义就是为了js程序能够在网页加载成功过后进行执行.对于放在head里面的js来说,非常必要. 如何给网页绑定onload,主要有三种方式: window.onload=func ...

  7. Jade之Plain Text

    Plain Text jade提供了3种得到纯文本的方法. Piped Text 添加纯文本的一个最简单的方法就是在文本最前面加|符号即可. jade: p | It must always be o ...

  8. FreeRTOS run on eclipse

    所需软件包: FreeRTOS.7.1.0.7zeclipse-cpp-helios-SR2-win32.zipTDM-GCC-32(版本任意吧..但同平台就选择一致的,32位系统就一致32位的软件, ...

  9. HTTP1.1初识

    Http(超文本传输协议)是一个基于请求与响应模式的.无状态的.应用层的协议. Http1.1版中,有一个持续连接(Persistent Connections)机制,其作为Http1.1中建立连接的 ...

  10. 使用ShareSDK一键分享

    首先需要到ShareSDK官方网站注册并且下载SDK,创建应用,获得ShareSDK的Appkey:文件如图: 在ShareSDK中打开即可:输入项目名称和包名,选择要分享的平台,点击确定会自动生成一 ...