Replication的犄角旮旯(七)-- 一个DDL引发的血案(下)(聊聊logreader的延迟)
《Replication的犄角旮旯》系列导读
Replication的犄角旮旯(一)--变更订阅端表名的应用场景
Replication的犄角旮旯(二)--寻找订阅端丢失的记录
Replication的犄角旮旯(三)--聊聊@bitmap
Replication的犄角旮旯(四)--关于事务复制的监控
Replication的犄角旮旯(五)--关于复制identity列
Replication的犄角旮旯(六)-- 一个DDL引发的血案(上)(如何近似估算DDL操作进度)
Replication的犄角旮旯(七)-- 一个DDL引发的血案(下)(聊聊logreader的延迟)
Replication的犄角旮旯(八)-- 订阅与发布异构的问题
Replication的犄角旮旯(九)-- sp_setsubscriptionxactseqno,赋予订阅活力的工具
---------------------------------------华丽丽的分割线--------------------------------------------
前言:这是昨天刚刚发生的案例,尽管事件的起因只是一个简单的DDL操作,但影响面和影响时间可以说是大大超出了预期;我们将在描述本案例的前因后果之后,聊聊如何近似估算DDL的操作进度,以及关于logreader延迟的问题;
前一篇文章《Replication的犄角旮旯(六)-- 一个DDL引发的血案(上)(如何近似估算DDL操作进度)》
http://www.cnblogs.com/diabloxl/p/3844205.html
前因简述:
一个复制节点(即使上级的订阅,又是下级的分发)需要对一个表进行DDL操作,由于需要修改主键,因此将这个表从publication中删除,然后就开始了漫长的DDL操作……
本来需要进行DDL操作的表已经从replication中摘除了,以为不会影响到其他article的复制,结果惨剧还是发生了,原因依旧是VLF对logreader的影响,但这次的问题和以往又有些不同……
=====================华丽丽的分割线=====================
先说说之前遇到的logreader延迟的情况:
1、发布表的写操作
这里又分为两种情况
a)大量并发写操作:指大量的小DML操作,特点是事务小、并发多
b)大事务写操作:指有单个大事务操作,特点是事务大、并发少
2、非发布表的写操作
指有写操作的表并不是需要复制的表,这里将上述a\b两种情况合并在一起说,这次遇到的是b这个类型;
检查logreader的延迟的利器——sp_replcounters
MSDN上关于这个存储过程的解释:
http://msdn.microsoft.com/zh-cn/LIBRARY/ms190486
无论对于上述哪种情况,如果Replicated transactions持续增加,那就是logreader延迟了,初步的现象就是这个发布下所有的订阅都在延迟;
那上述3种情况的差异呢?
对于1a)
Replicated transactions快速增加,replbiginlsn和replnextlsn都会较慢速度的变化;(这里的慢速是相对与正常速度而言,受实际业务环境影响,下同)
这是由于大量的小DML操作都会快速的提交,但由于大量的日志写入,导致存在大量的活动VLF,因而日志不能被截断;同时,尽管logreader根据replnextlsn去定位下一个要复制的lsn,但由于效率下降,且后面涌入的新事务也在增长,导致恶性循环,从而引起logreader的延迟;
对于1b)
Replicated transactions慢速增加,replbiginlsn不变、replnextlsn不变;
虽然事务并发量很小,但由于单个提交的事务很大,仍然导致大量的活动VLF,从而引起logreader效率下降;
对于2
Replicated transactions快速增加,replbiginlsn不变、replnextlsn慢速变化;
由于非复制的表也需要写日志,且占用了大量VLF,因此logreader需要从大量的VLF中获取需要复制的日志信息,这也同样影响到它的执行效率;
那我们该如何应对呢?
硬件当然是最有效的手段之一,升级内存、磁盘换成IO卡等可以解决根本问题,但这又不是绝对,一个SQL跑死服务器的情况也绝非不可能;
1、对于1a的情况,建议有频繁写操作的表,还是能分就分,或者分到多个库中,或者分到多个实例下,原则就是不要让logreader干太多活,毕竟的是个单线程的任务,穿少了也cool,喝多了也吐。
2、对于1b的情况,本身单个大事务就不是OLTP环境中提倡的,不光是复制延迟,光一堆锁估计机器也受不了;建议拆成多个事务来跑;
3、对于2来说,尽管要搞的表和复制没有任何关系,但不能忽略VLF对logreader的影响,既然在一个库中,公用日志序列,还是小心为妙;如果是大表的DDL的操作,还是通过停写、建新表、导数据的方法实现,bulk insert的方式或许是对日志影响最小的;
但bulk insert的方式一般要求停写,而受业务的制约,可能不允许长时间的停写,这该怎么破?
可以看看我之前的文章《Replication的犄角旮旯(一)--变更订阅端表名的应用场景》,复制回路可以说是为这种需求量身定做的~
Replication的犄角旮旯(七)-- 一个DDL引发的血案(下)(聊聊logreader的延迟)的更多相关文章
- Replication的犄角旮旯(六)-- 一个DDL引发的血案(上)(如何近似估算DDL操作进度)
<Replication的犄角旮旯>系列导读 Replication的犄角旮旯(一)--变更订阅端表名的应用场景 Replication的犄角旮旯(二)--寻找订阅端丢失的记录 Repli ...
- 一个字母引发的血案 java.io.File中mkdir()和mkdirs()
一个字母引发的血案 明天开始放年假了,临放假前有个爬虫的任务,其中需要把网络图片保存到本地,很简单,马上写完了代码: //省略部分代码... Long fileId= (Long) data.get( ...
- SQL实战——04. 查找所有已经分配部门的员工的last_name和first_name以及dept_no (一个逗号引发的血案)
查找所有已经分配部门的员工的last_name和first_name以及dept_noCREATE TABLE `dept_emp` (`emp_no` int(11) NOT NULL,`dept_ ...
- 一个链接引发的血案---------服务器 IO及网络流量暴涨解决历程
在这里介绍一次因为更改网站地址而引发服务器IO读取速度,网络流入流出速度暴涨10倍的解决经历. 环境:Ubuntu + Nginx + php-cgi + Wordpress 事情是这样的,现在网站使 ...
- 一个NULL引发的血案
go sql.stmt query 发生了一个NULL值,所以发现了error, 发现服务不停的初始化sql stmt, 导致连接数过多,服务就变得很慢. 首先,我在初始化的之前,要判断这个是否是NU ...
- 【原创】经验分享:一个Content-Length引发的血案(almost....)
前言 上周在工作中遇到一个问题,挺有意思,这里记录一下.上周在工作中遇到一个问题,挺有意思,这里记录一下.标题起的很唬人,这个问题差点引发血案,花哥还是很严谨的一个人,后面备注了almost.... ...
- String属于“假引用类型”,代码为证(一个String引发的血案...)
一直以为String是引用类型,今天写了个浅拷贝的测试,发现String有基本类型的特征. class A{ public int a = 555; } class User implements C ...
- 一个JS引发的血案
转载一篇大师傅的文章: 原文链接:http://xn--i2r.ml/index.php/2017/08/05/39.html 又到了周末,闲来无聊,挖挖补天 找了个目标,发现一个站 查看源码发现一个 ...
- Matlab一个错误引发的血案:??? Error using ==> str2num Requires string or character array input.
Matlab总遇到一些神奇的问题,让人摸不着头脑.昨天编写程序的时候遇到一个让我十分火大的问题,也是自己的matlab基础不好吧. 先描述一下问题,再GUI界面有个listbox,Tag属性是’lis ...
随机推荐
- JS验证字符长度
function getStrLength(str) { var cArr = str.match(/[^\x00-\xff]/ig); return str.length + (cArr == nu ...
- php 中遍历数组时使用引用出现的问题
今天在使用foreach遍历数组时发现,当使用&时会出现问题: $arr = array( array('id' => 100, 'error'=> 'aa'), array('i ...
- Flask备注三(Context)
Flask备注三(Context) Flask支持不同的应用场景下,对应不同的local context(本地上下文环境),用来提供当前环境下的资源.lcoal context和全局变量以及局部变量最 ...
- H5学习系列之Geolocation API
获取位置信息途径: 1.IP地址地理定位数据 2.GPS地理定位数据 3.WI-FI地理定位数据 4.手机地理定位数据 无废话直接上重点:navigator.geolocation对象就是获取地理位置 ...
- My安卓知识3--多个activity之前共享数据的方法
在网上搜这个问题的时候看到了有一篇文章说有五种方法: 1.基于消息的通信机制 Intent ---boudle ,extra 数据类型有限,比如遇到不可序列化的数据Bitmap,InputStrea ...
- 如何优化sql语句
1. 首先要搞明白什么叫执行计划? 执行计划是数据库根据SQL语句和相关表的统计信息作出的一个查询方案,这个方案是由查询优化器自动分析产生的,比如一条SQL语句如果用来从一个 10万条记录的表中查1条 ...
- win2008 IIS与php整合
首先安装好IIS 安装的时候 要注意三个地方打得勾 注: CGI 会在IIS+PHP的环境中用到 php.ini default_socket_timeout = 60extension_dir ...
- Tier和RBD Cache的区别
相同点 缓存 数据不会持久保存在ssd或者内存:预读回写直写 都需要解决缓存数据和磁盘数据不一致和“内存页”置换的问题. 差异点 缓存的位置不同,tier是rados层在osd端进行数据缓存,也就是说 ...
- [python](爬虫)如何使用正确的姿势欣赏知乎的“长得好看是怎样一种体验呢?”问答中的相片
从在知乎关注了几个大神,我发现我知乎的主页画风突变.经常会出现 ***长得好看是怎样一种体验呢? 不用***,却长得好看是一种怎样的体验? 什么样***作为头像? ... 诸如此类的问答.点进去之后发 ...
- 通过反射及注解的运用获取SQL语句
import java.lang.reflect.*; public class BeanUtil { //这是拼接查询SQL语句的方法(getDelectSQL) public static Str ...