AlwaysON同步的原理及可用模式

新一代读写分离技术——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的可用模式为“同步提交模式,反之,则是“异步提交模式”。

异步提交模式

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

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

同步提交模式

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

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

时间: 2024-09-30 23:20:23

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

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

原文:SQL Server AlwaysON 同步模式的疑似陷阱 SQL Server 2012 推出的最重要的功能之一Alwayson,是一个集之前Cluster和Mirror于一体的新功能,即解决了Cluster依赖共享存储的问题,又解决了镜像不能实时读以及转移后连接串需要添加转移IP的问题,看起来的确很实用. 而且Alwayson多副本的功能为实现读写分离提供了可能,试想一下,当主副本压力比较大的时候,是否可以将读操作引向辅助副本呢?答案一般来讲是肯定的,请注意,是一般! Alwayson

SQLSERVER 2012之AlwaysOn -- 同步模式下的网卡性能优化

原文:SQLSERVER 2012之AlwaysOn -- 同步模式下的网卡性能优化 本文是基于上一篇<SQLServer 2012之AlwaysOn -- 指定数据同步链路,消除网络抖动导致的提交延迟问题>的问题继续进行优化:具体背景请参照上文:     前后折腾了一个多月,最近终于把这块难啃的骨头搞定了.问题只是出在网卡的高级功能上:     解决方案:关闭网卡的高级功能Jumbo Mtu和Large Send Offload V2     问题分析:根据Broadcom Ethernet

AlwaysON同步性能监控的三板斧

延迟是AlwaysOn最大的敌人之一 延迟是AlwaysON的最大敌人之一.对AlwaysON而言,其首要目标就尽量减少(无法避免)主副本.辅助副本的数据延迟,实现主副本.辅助副本的"数据同步".只有主副本.辅助副本的同步延迟越小越高,只读访问的实性性才会越高,数据库的RTO(Estimating Failover Time )和RPO(Estimating Potential Data Loss)也才会越小. 但延迟可能存在于AlwaysON同步的各个环节中,因此,在分析现延迟情况时

视频、音频打时间戳的方法及其音视频同步(播放)原理

视频.音频打时间戳的方法    http://blog.csdn.net/wfqxx/article/details/5497138 1. 视频时间戳      pts = inc++ *(1000/fps);  其中inc是一个静态的,初始值为0,每次打完时间戳inc加1.     在ffmpeg,中的代码为     pkt.pts= m_nVideoTimeStamp++ * (m_VCtx->time_base.num * 1000 / m_VCtx->time_base.den);  

MYSQL主从不同步延迟原理分析及解决方案_Mysql

1. MySQL数据库主从同步延迟原理.要说延时原理,得从mysql的数据库主从复制原理说起,mysql的主从复制都是单线程的操作,主库对所有DDL和DML产生binlog,binlog是顺序写,所以效率很高,slave的Slave_IO_Running线程到主库取日志,效率很比较高,下一步,问题来了,slave的Slave_SQL_Running线程将主库的DDL和DML操作在slave实施.DML和DDL的IO操作是随即的,不是顺序的,成本高很多,还可能可slave上的其他查询产生lock争

学习mysql数据库主从同步复制原理

MySQL的Replication(英文为复制)是一个多MySQL数据库做主从同步的方案,特点是异步复制,广泛用在各种对MySQL有更高性能.更高可靠性要求的场合.与之对应的是另一个同步技术是MySQL Cluster,但因为MySQL Cluster配置比较复杂,所以使用者较少. MySQL的Replication是一个异步复制的过程(mysql5.1.7以上版本分为异步复制和半同步两种模式),它是从一个Mysql instance(instance英文为实例)(我们称之为Master)复制到

Infrastractor As Code中Code与物理资源同步的原理分析

上篇文章讲到<企业应用如何解决Multi-Cloud的基础设施管理及应用部署问题>,其核心是使用Terraform的模板管理基础设施,虽然Terraform的中文资料较少,好在阿里云Terraform官方仓库的Example目录中提供了大量的模板参考,参考这些模板将能够管理常用的云服务. 什么是Infrastractor As Code(IaC) 基础设施即代码(IaC)的概念已经被人们所熟知,其核心就是"告别手工配置基础设施的时代,用自定义脚本来配置基础设施".目前也有很

同步线程--生产者与消费者模式

同步线程的一种经典设计模式. public class Test { public static void main(String[] args) {  Quene q = new Quene();  Producter producter = new Producter(q);  Customer customer = new Customer(q);   producter.start();  customer.start(); }} //生产者public class Producter

Java多线程及同步实现原理

一. 实现多线程 1. 虚假的多线程 例1: public class TestThread{ int i=0, j=0; public void go(int flag) { while(true) { try{ Thread.sleep(100); } catch(InterruptedException e) { System.out.println("Interrupted"); } if(flag==0) i++; System.out.println("i=&qu