Distribution1:Distribution Reader
在事务复制中,在发布服务器中执行了一个更新,例如:update orders set col=? Where ?,该操作产生大量的数据更新操作,在Log Reader存储事务和命令时,把该更新操作分解成多条command,每一个command只更新一条record,这些command 位于同一个Transaction中。发布服务器执行命令的基本单元是一个事务,或者一个子事务。当一个事务包含的命令过多时,可以把一个事务拆分成多个子事务,使得每个子事务只包含特定数量的command。这样,分发服务器在把一个子事务准备就绪后,就可以执行该子事务中的命令,循环该过程,最终把整个事务中完成。
在事务复制中,事务的顺序必须得到保证。事务在订阅者和发布者中的执行顺序是相同的,换句话说,订阅者接收事务的顺序和发布者执行事务的顺序是一致的。
Distribution Agent包含两个子进程,Reader和Writer。 Reader负责从distribution 数据库中读取数据,Writer负责将reader读取的数据写入到订阅数据库。Reader是通过 sys.sp_MSget_repl_commands 来读取Distribution数据库中挂起(pending)的命令和事务(读取Msrepl_transactions表和Msrepl_Commands表),并把读取到的数据存储到内部队列中。Writer从队列中顺序获取命令,通过执行以sp_MSupd…, sp_MSins…, sp_MSdel…为前缀的存储过程,把队列中的命令依次写入到subscriber,换句话说,把数据更新的命令在订阅服务器中重新执行一遍。
CREATE PROCEDURE sys.sp_MSget_repl_commands
@agent_id int,
@last_xact_seqno varbinary(16),
@get_count tinyint = 0, -- 0 = no count, 1 = cmd and tran (legacy), 2 = cmd only
@compatibility_level int = 7000000,
@subdb_version int = 0,
@read_query_size int = -1
对Reader进行调优
案例:在Distribution Agent同步数据时,发现Subscriber中有很多Session处于 ASYNC_NETWORK_IO等待状态,该Session正在执行的sp是:sys.sp_MSget_repl_commands,正在执行的语句如下,这条查询用于返回Distribution Agent读取的Commands。
select rc.xact_seqno, rc.partial_command, rc.type,
rc.command_id, rc.command, rc.hashkey,
-- extra columns for the PeerToPeer resultset
-- originator_id, srvname, dbname, originator_publication_id, originator_db_version, originator_lsn
NULL, NULL, NULL, NULL, NULL, NULL, rc.article_id
from MSrepl_commands rc with (nolock, INDEX(ucMSrepl_commands))
inner join dbo.MSsubscriptions s with (INDEX(ucMSsubscriptions))
-- At end, we use the FASTFIRSTROW option which tends to force
-- a nested inner loop join driven from MSrepl_commands
ON (rc.article_id = s.article_id)
where s.agent_id = @agent_id and
rc.publisher_database_id = @publisher_database_id and
rc.xact_seqno > @last_xact_seqno and
rc.xact_seqno <= @max_xact_seqno and
(rc.type & @snapshot_bit) <> @snapshot_bit and
(rc.type & ~@snapshot_bit) not in ( 37, 38 )
and (@compatibility_level >= 9000000
or (rc.type & ~@postcmd_bit) not in (47))
order by rc.xact_seqno, rc.command_id asc
OPTION (FAST 1)
说明该Session返回的数据集太大,导致Writer不能及时读取Command,使得分发的时延增加。
1,查看正在分发的事务
通过SQL Server Profile抓取当前正在执行的SQL命令,从抓取的大量语句中发现,sp_MSget_repl_commands 一般只会用到前四个参数,第三个和第四个参数的值是固定不变的,分别是0和10000000。
exec sp_MSget_repl_commands 74,0x0008ECE200307E10014C00000000,0,10000000
2,Distribution Agent 读取的Commnd数量
sys.sp_MSget_repl_commands 返回的Result Set的大小跟变量 @max_xact_seqno 有关
rc.xact_seqno > @last_xact_seqno and rc.xact_seqno <= @max_xact_seqno
对变量 @max_xact_seqno 的赋值,是由 @read_query_size 参数控制的,在调用该sp时,其值是默认值-1。
下面代码表示 将 dbo.MSrepl_commands 最大的 xact_seqno 赋值给变量@max_xact_seqno,那么Distribution Agent 每次都会读取所有的Command。
--Note4: The max_xact_seqno is calculated based on the @read_query_size parameter -
-- this parameter limit the number of commands retrieved by this call.
if(@read_query_size <= 0)
begin
select @max_xact_seqno = max(xact_seqno) from MSrepl_commands with (READPAST)
where
publisher_database_id = @publisher_database_id and
command_id = 1 and
type <> -2147483611
end
else ....
3,是否可以修改参数 @read_query_size的值
明确为@read_query_size传递一个参数值,而不是使用默认值 -1,可以解决这个问题,但是该sp是系统存储过程,不能直接修改,而Distribution Agent profile中也没有参数能够控制Reader读取的Command数量。
┬_┬
遇到这种情况,就需要换种角度来思考,长时间出现ASYNC_NETWORK_IO,根本原因是一个Trasaction中包含的Command过多,而数据更新的速度跟不上。如果在源头把一个事务拆分成多个子事务,每个子事务可以很快地执行完成。
如果Log Reader将大事务拆分成多个小的Transaction写入到Distribution中,那么Distribution Reader很快地把commands读取,写入到in-memory queue中,进而 Distribution Writer很快把 Queued Commands 写入到Subscriber中,完成数据的一次同步。只要Distribution Reader的读取速度能够跟上Log Reader写入的速度,而Distribution Writer的写入速度也能跟上Distribution Reader的读取速度,这样Distribution Latency 就会很小。
参考文档:
Performance Tuning SQL Server Transactional Replication – Part 1
SQL Server复制系列4 – Transactional replication中如何跳过一个事务
Distribution1:Distribution Reader的更多相关文章
- Replication:Distribution Reader
在transactional replication中,在publication中执行了一个更新,例如:update table set col=? Where ?,如果table中含有大量的数据行, ...
- Distribution2:Distribution Writer
Distribution Writer 调用Statement Delivery 存储过程,将Publication的改变同步到Subscriber中.查看Publication Properties ...
- 简单的Windows Webcam应用:Barcode Reader
原文:简单的Windows Webcam应用:Barcode Reader 在Windows上用WinForm创建一个Webcam应用需要用到DirectShow.DirectShow没有提供C#的接 ...
- 2015-2016 ACM-ICPC, NEERC, Northern Subregional Contest D:Distribution in Metagonia(构造)
http://codeforces.com/gym/100801/attachments 题意:给出一个数n(1 <= n <= 1e18),将 n 拆成 m 个整数,其中 m 必须是 2 ...
- Replication:distribution 中一直在运行 waitfor delay @strdelaytime 语句
Replication 自动创建来一个 Job:Replication monitoring refresher for distribution,这个Agent执行一个sp: dbo.sp_repl ...
- CVE-2012-0774:Adobe Reader TrueType 字体整数溢出漏洞调试分析
0x01 TrueType 字体 TTF 字体是 Apple 和 Microsoft 两家公司共同推出的字体格式,现在已经广泛的运用于 Windows 操作系统,其中 PDF 文档也可以嵌入 TTF ...
- 例子:RSS Reader Sample
本例演示了Rss xml信息的获取,以及如何使用SyndicationFeed来进行符合Rss规范的xml进行解析. SyndicationFeed 解析完成后 可以得到SyndicationItem ...
- Gym - 100801D:Distribution in Metagonia (数学)
题意:给定一个N,让你把它拆成若干个只含素因子2和3的数之和,且两两之间没有倍数关系,比如10=4+6. 思路:即是2因子的幂递增,3因子的幂递减:或者反之. 对于当前N,我们拆分出的数为num=2^ ...
- Scalaz(15)- Monad:依赖注入-Reader besides Cake
我们可以用Monad Reader来实现依赖注入(dependency injection DI or IOC)功能.Scala界中比较常用的不附加任何Framework的依赖注入方式可以说是Cake ...
随机推荐
- java中Map和List初始化的两种方法
第一种方法(常用方法): //初始化List List<string> list = new ArrayList</string><string>(); list. ...
- 读取hdfs文件之后repartition 避免数据倾斜
场景一: api: textFile("hfds://....").map((key,value)).reduceByKey(...).map(实际的业务计算逻辑) 场景:hdf ...
- 如何在windows上编译Chromium (CEF3) 并加入MP3支持(二)
时隔一年,再次编译cef3,独一无二的目的仍为加入mp3支持.新版本的编译环境和注意事项都已经发生了变化,于是再记录一下. 一.编译版本 cef版本号格式为X.YYYY.A.gHHHHHHH X为主版 ...
- tornado 学习笔记15 _ServerRequestAdapter分析
继承于HTTPMessageDeletegate,是HTTPMessageDeletegate的一种实现,用于处理请求消息. 15.1 构造函数 def __init__(self, ser ...
- tungsten抽取和应用mysql binlog
首先举例说明 api的基本使用方式 首先进行配置 , 可以看到源数据库和目的数据库 TungstenProperties tp=new TungstenProperties(); tp.setStri ...
- 获取img的真实宽高
之前项目后台上传图片时需要对图片的宽高做限制,一开始百度了之后使用js进行判断,可是这种方式存在一定问题,后来就改在后台判断了.现在吧这两种方式都贴出来. 一.用js获取: 先说第一个方法:obj.s ...
- redis的面试题,没答出来,直接被pass
redis 内存数据集大小上升到一定大小的时候,就会施行数据淘汰策略.redis 提供 6种数据淘汰策略: volatile-lru:从已设置过期时间的数据集(server.db[i].expire ...
- 7_nodejs angularjs
webstrom使用: ctrl+b/点击,代码导航,自动跳转到定义 ctrl+n跳转指定类 ctrl+d复制当前行ctrl+enter另起一行ctrl+y删除当前行 ctrl+alt/shift+b ...
- SMA、SMB、SMC封装的二极管
以常见的贴片肖特基二极管SS14 SS24 SS34为例,三种管子区别主要在电流上,有三种封装:SMA.SMB.SMC. 从成本和体积来说,优先选用最小尺寸的SMA/DO-214AC封装,其他封装一般 ...
- 利用DOS批处理实现定时关机操作
10月1放假回来,寝室晚上10:30就停电了,最无法让人理解的是第二天早上8:00才来电.原来晚上电脑都是不关机的,开着WiFi一直到天亮,可是现在不行了,电脑如果一直开着第二天早上起来电脑肯定没电, ...