SQL Server 事务复制调优(1)

 

在如今有规模的OLTP系统中,为了缓解数据库单点读写压力,特别是读的压力,采用复制多个副本,是解决问题的一个不错的方法。

而SQL Server的事务复制 Transactional Replication  是我们所采用的最多的复制形式。以往的一些文章总是介绍一些基本的搭建,

缺少一些优化方面的介绍,今天我就简单介绍其中一些可以调整优化的地方,(其实微软这方面已经做的很出色,默认的情况下就以能

满足我们大部分的情形,希望通过这篇文章的介绍,大家结合自己系统的实际情况,做些调整可能会有一些意想不到的收获,注意在生产

环境中请谨慎操作)

 

在这之前,我们先回顾一下 事物复制 的流程

 

201206201126068828[8]

 

我们可以看到 从Publication 到 Subscriber  这这期间经历了LogReader Agent  , Distribution Agent 这两个代理

用来传输生产库中,产生的数据变化,并最终体现到订阅库中。而对于这两个代理是否有可以优化的内容呢,在这篇文章中

我们先关重点注下 LogReader Agent。在之后的文章中,我们将继续介绍其他可调整和优化的地方。

 

LogReader Agent 顾名思义,它主要完成日志的读取,并写入分发的操作,下面我们介绍一些对于优化而言可操作的参数。

 

-LogScanThreshold

此项微软没有官方的解释,简单来说此项控制着LogReader Agent  一次扫描日志的条数,

默认值是500000,而扫描的频率是5秒钟,其中-PollingInterval 参数控制着频率。

这个参数基本没有太大调整的必要,增大它的同时将加大一次提交大量数据到分发的时间

也会消耗单次的扫描时间,一般较快速的系统这个值是有富余的,但有个例外,对于使用如FusionIO 等IO卡的系统,

个人感觉可以进行一些调整,希望有相关设备的朋友可以提供一些实践结果。

 

-ReadBatchSize

此项为一次读取的最大事务数,默认值为500,有时候我们可以看到 如“2 transaction(s) with 12 command(s) were delivered.”

这样的提示,这个提示标示2个事务中包含12个命令。

 

-ReadBatchThreshold

此项与ReadBatchSize关系密切, 标示读取的命令数command(s)  默认值为 0。如果此参数未指定,

日志读取器代理会将此日志读取完毕 或者读到 -ReadBatchSize中指定的(事务数)为止。

根据你系统的实际情况,酌情的加大,并实时观察系统状况,作出调整。

 

-MaxCmdsInTran

调整此项会对因为大事物造成的延迟带来显著提升,但是同时也会失去事物的完整性。

简单来说就是此项指定在Logreader 将命令写入到分发数据库时,可分组到一个事务中的语句的最大数目。

默认值为 0,保持发布服务器的事务边界。设置此值,就会对超过此值的大事物进行拆分。

 

总结一下,

如果你的IO够快,可以尝试调整它,增加吞吐。

如果总是受到大事务延迟的困扰,可以尝试进行事物拆分。

 

其实,所谓优化就是寻找一个平衡,满足你想要的结果后的平衡。

未完待续。。。

posted @ 2015-08-05 18:04  dbanote  阅读(523)  评论(0)    收藏  举报