首页 > 数据库 >SQLServer事务复制延迟优化之多并行(多线程)复制

SQLServer事务复制延迟优化之多并行(多线程)复制

时间:2024-09-04 20:26:19浏览次数:11  
标签:订阅 事务 SubscriptionStreams SQLServer 复制 多线程 节点

事务复制的延迟

在数据库的主从复制过程中,包括MySQL的主从复制,SQLServer的事务复制等等,鉴于主节点往往是并发写入的,而从节点(SQLServer中叫做订阅节点)在重放主节点的写操作的时候,往往会产生一定时间的延迟,如何降低这种复制延迟,并行复制或者说多线程复制是其中手段之一。  

SQLServer事务复制分发线程

参考如下图例涉及的事务复制相关的线程,类似于MySQL的MTS多线程并行复制技术,SQLServer数据的事务复制同步过程中,数据库在主节点(publication发布节点)上以并发的形式写入,从节点(Subscribtion订阅节点)默认情况下以单线程的方式来“重放”主节点的写入操作,这样在高并发的情况下可能会造成一个较高的复制延迟。这里的并行复制,就是下图中的writer thread,以多个线程的方式并行执行,来尽可能地降低复制延迟。


图片来源于https://red9.com/blog/sql-server-replication-performance-tips/

 

事务复制分发线程参数SubscriptionStreams

以下是SQLServer事务复制的进程结构示例图,从中可以看到,distrib.exe的writer thread就是把distrubution中解析出来的日志在订阅节点上重放的的实现者。 分发代理distrubution agent有一组配置文件,涉及到22个分发相关的参数,参考下图,其中SubscriptionStreams参数就是所谓的并行复制参数,默认值是1。

先看官方对SubscriptionStreams参数的解释: SubscriptionStreams参数可以极大地提高聚合复制(注:这里官方叫aggregate replication ,一个很奇怪的用词)的吞吐量。 它允许到订阅服务器的多个连接并行应用批量更改,同时保持着事务在单线程下的特征(意思是和单线程回放效果一致)。如果其中一个连接执行或提交失败,则所有连接将中止当前批处理,代理将使用单个流重试失败的批处理。在此重试阶段完成之前,订阅服务器上可能存在暂时的事务不一致。在成功提交失败的批之后,订阅服务器将恢复到事务一致性状态。 SubscriptionStreams默认值是1,也就是distrubution agent使用一个线程在订阅节点做回放,该参数的可配置范围为1~64,但并不意味着事务复制的吞吐量会随着该参数的增加而等比例增加,考虑一下因素: 1,如果分发节点和订阅节点之间网络流存在瓶颈 2,订阅节点服务器CPU核数 3,订阅节点的磁盘IO处理能力有限 以上因素都会影响到订阅节点回放事务操作的效率。  

SubscriptionStreams值对事务复制吞吐量的影响

参考微软官方的SQLServer team blogs中的测试结果

在单事务( singleton transactions,每个事物一条命令)情况下,在修改默认的commitbatchsize(默认为100)为200,SubscriptionStreams为8的情况如下

在复杂事物事物(each transaction ranging from 500-1000 commands),结果如下。

以上两种情况,均说明SubscriptionStreams在8的情况下,比默认值1在事务复制,订阅节点的吞吐量会得到大幅度提升。

 

 

参考: https://red9.com/blog/sql-server-replication-performance-tips/ https://repltalk.com/2010/03/01/navigating-sql-replication-subscriptionstreams-setting/ https://learn.microsoft.com/en-us/sql/relational-databases/replication/administration/enhance-transactional-replication-performance?view=sql-server-ver16 https://learn.microsoft.com/en-us/archive/blogs/sql_server_team/optimizing-replication-agent-profile-parameters-for-better-performance  

标签:订阅,事务,SubscriptionStreams,SQLServer,复制,多线程,节点
From: https://www.cnblogs.com/wy123/p/18396228

相关文章

  • 【Linux修行路】多线程——互斥量
    目录⛳️推荐一、多线程模拟抢票二、加锁——互斥量2.1pthread_mutex_init——初始化互斥量2.2pthread_mutext_destroy——销毁一个互斥量2.3pthread_mutex_lock——加锁2.4pthread_mutex_trylock——非阻塞的申请锁2.4pthread_mutex_unlock——解锁2.5定义一个......
  • Sqlserver openquery
    InsertIntoopenquery()解析:INSERTINTOOPENQUERY([192.168.1.50],'SELECT*FROMNEWDBERP_Test2.jserp.Wo_Modified_Record')VALUES(2,'MO23092200232','220103001077',20,'DXL240509','220103001077',2,&......
  • 直接复制nacos库,最后编辑-保存报错
    更改nacos的yml文件,保存后报错:caused:PreparedStatementCallback;SQL[INSERTINTOhis_config_info(id,data_id,group_id,tenant_id,app_name,content,md5,src_ip,src_user,gmt_modified,op_type)VALUES(?,?,?,?,?,?,?,?,?,?,?)];Field'nid'doesn&......
  • Linux C++ 多线程高并发服务器实战项目一
    1、项目介绍1、按照包头+包体的格式收发数据包,解决粘包的问题2、非常完整的多线程高并发服务器3、根据收到数据包执行,不同的业务逻辑函数用到的技术:epoll高并发通讯技术,用的是水平触发【LT】水平触发模式通过线程池技术处理业务逻辑多线程、之间同步技术使用,互斥量、和条件变......
  • (八)Redis 主从复制、切片集群
    一、主从复制1、主从关系都说的Redis具有高可靠性,这里有两层含义:一是数据尽量少丢失,二是服务尽量少中断。AOF和RDB保证了前者,而对于后者,Redis的做法就是将一份数据同时保存在多个实例上。为了保证数据一致性,Redis提供了主从库模式,并采用读写分离的方式,如图2、主从复制-......
  • SQLServer2017对象名STRING_SPLIT无效
    SQLServer2017在使用“STRING_SPLIT”方法时报错:  1select*fromSTRING_SPLIT('1,2,3,4,5',',')  12消息208,级别16,状态1,第3行对象名'STRING_SPLIT'无效。原因STRING_SPLIT方法要求数据库的兼容级别至少为130。当级别小于130时,SQ......
  • 二、并发编程与多线程-2.1、J.U.C和锁(下篇)
    2.1、J.U.C和锁(下篇)2.1.8、什么是可重入锁?它的作用是什么?答:在Java中,可重入锁是一种同步机制,它允许同一个线程多次获取同一个锁。当一个线程持有该锁时,它可以反复进入被该锁保护的代码块,而不会被阻塞。这种机制也被称为递归锁。比如synchronized锁和ReentrantLock锁都是可......
  • 多线程、任务、异步的区别
    Task和Thread的区别这是一个高频,深刻的问题,无论去哪都逃不过被询问这个问题。Task是基于Thread的,这是众所周知的。但是Task和Thread的联系如此简单和纯粹确实我没想到的。甚至只需要几十行代码就能呈现其原理。一个简单的模拟实例说明Task及其调度问题,这真是一篇好文章。任务体......
  • 【多线程】 - 实现方法以及自定义线程池
    概念进程进程是程序的基本执行实体线程线程是操作系统能够进行运算调度的最小单位。它被包含在进程之中,是进程中的实际运作单位。多个线程组成了多线程多线程应用场景软件中的耗时操作拷贝、迁移大文件加载大量的资源文件想让多个事情同时运行就需要多线程并发和并行并发在同一时刻......
  • 二、并发编程与多线程-2.1、J.U.C和锁(中篇)
    2.1、J.U.C和锁(中篇)2.1.4、什么是CAS?答:CAS是Java中Unsafe类里面的方法,全称是CompareAndSwap,是比较并交换的意思。作用就是保证在多线程环境下,对于修改共享变量操作的原子性。扩展:CAS保证修改共享变量操作原子性的实现逻辑:CAS方法里有三个参数,依次分别是共享变量的内......