【六六互联】长期出售【美国抗投诉服务器】【欧洲抗投诉服务器】【亚洲抗投诉服务器】

 SQL Server 高可用镜像实现原理

 SQL Server 高可用镜像实现原理

数据副本

镜像技术实现了位于不同物理服务器上的两个 SQL Server 实例数据同步,在镜像集群中, SQL Server 实例具有三种角色:

○ Principal:具有完整的数据副本,对外提供数据库读写服务

○ Mirror:具有完整的数据副本,本身不提供读写服务,通过接收来自 Principal 的更新日志实现数据同步,允许创建快照实现报表;

○ Witness:本身不存储数据,只负责在高安全运行模式下提供自动故障切换的能力,确保两个 SQL Server 实例只有一个对外提供服务,避免脑裂情况出现;

在镜像集群中,principal 和 mirror 的数据同步是依靠事务日志来实现的,与 Oracle 和 MySQL 不同,SQL Server 的事务日志是 Database 级别的,不是实例级别的,每个 Database 都单独的事务日志,这也就使得 SQL Server 的镜像是可以基于 Database 层面实现。

一个 SQL Server 实例中的两个 Database,一个可以作为 principal,一个可以作为 mirror,分别与其他 SQL Server 实例组建镜像关系;另外,SQL Server 一个 Database 只能有一个 mirror 节点,一个 mirror 的 database 不可以再有 mirror 节点,这点与 MySQL 级联复制不同;

SQL Server 的事务日志是物理记录级别的,记录了对数据库某个页的某行记录(slot)的操作,principal 创建镜像后,会启动一个单独的事务日志发送线程,维护一个虚拟的发送队列,然后读取事务日志,将其进行压缩,根据官方公布的测试数据,压缩比不低于12.5%,然后发送给 mirror 节点,mirror 节点接收到以后,会将其写入本地在磁盘上的一个重做队列文件中,然后再通过另外的一个线程异步的方式,从重做队列中获取事务日志,然后分发给应用线程(process unit)进行回放。

 SQL Server 高可用镜像实现原理

不同于 MySQL Binlog,由于 SQL Server 的事务日志在 principal 上事务执行过程中就已经源源不断的写入(MySQL Binlog 仅在事务提交阶段生成),在 principal 事务执行的同时事务日志就已经传递给了 mirror,所以基于事务日志的 SQL Server 的复制性能会更理想。同时,在 mirror 回放的过程中,可以基于页(page)级别进行并发更新(redo parallel),在 SQL Server 的标准版中,仅提供一个线程进行事务日志回放(roll forward),在企业版中,如果当前服务器 CPU 大于5核,则每4个核,增加一个并行线程,如果低于5个核,则仍然使用单线程回放。同时,基于页的事务日志的并发执行,还有一个好处就是对于同一个页面的更新可以合并刷新,减少脏页刷新数量。