《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的延迟)的更多相关文章

  1. Replication的犄角旮旯(六)-- 一个DDL引发的血案(上)(如何近似估算DDL操作进度)

    <Replication的犄角旮旯>系列导读 Replication的犄角旮旯(一)--变更订阅端表名的应用场景 Replication的犄角旮旯(二)--寻找订阅端丢失的记录 Repli ...

  2. 一个字母引发的血案 java.io.File中mkdir()和mkdirs()

    一个字母引发的血案 明天开始放年假了,临放假前有个爬虫的任务,其中需要把网络图片保存到本地,很简单,马上写完了代码: //省略部分代码... Long fileId= (Long) data.get( ...

  3. SQL实战——04. 查找所有已经分配部门的员工的last_name和first_name以及dept_no (一个逗号引发的血案)

    查找所有已经分配部门的员工的last_name和first_name以及dept_noCREATE TABLE `dept_emp` (`emp_no` int(11) NOT NULL,`dept_ ...

  4. 一个链接引发的血案---------服务器 IO及网络流量暴涨解决历程

    在这里介绍一次因为更改网站地址而引发服务器IO读取速度,网络流入流出速度暴涨10倍的解决经历. 环境:Ubuntu + Nginx + php-cgi + Wordpress 事情是这样的,现在网站使 ...

  5. 一个NULL引发的血案

    go sql.stmt query 发生了一个NULL值,所以发现了error, 发现服务不停的初始化sql stmt, 导致连接数过多,服务就变得很慢. 首先,我在初始化的之前,要判断这个是否是NU ...

  6. 【原创】经验分享:一个Content-Length引发的血案(almost....)

    前言 上周在工作中遇到一个问题,挺有意思,这里记录一下.上周在工作中遇到一个问题,挺有意思,这里记录一下.标题起的很唬人,这个问题差点引发血案,花哥还是很严谨的一个人,后面备注了almost.... ...

  7. String属于“假引用类型”,代码为证(一个String引发的血案...)

    一直以为String是引用类型,今天写了个浅拷贝的测试,发现String有基本类型的特征. class A{ public int a = 555; } class User implements C ...

  8. 一个JS引发的血案

    转载一篇大师傅的文章: 原文链接:http://xn--i2r.ml/index.php/2017/08/05/39.html 又到了周末,闲来无聊,挖挖补天 找了个目标,发现一个站 查看源码发现一个 ...

  9. Matlab一个错误引发的血案:??? Error using ==> str2num Requires string or character array input.

    Matlab总遇到一些神奇的问题,让人摸不着头脑.昨天编写程序的时候遇到一个让我十分火大的问题,也是自己的matlab基础不好吧. 先描述一下问题,再GUI界面有个listbox,Tag属性是’lis ...

随机推荐

  1. HR开发 操作信息类型数据

    1.通过函数操作. . DATA: ZRETURN TYPE BAPIRETURN1, ZPAKEY TYPE BAPIPAKEY. GET PERNR. LOOP AT P0001 WHERE .. ...

  2. MongoDB的C#官方驱动InvalidOperationException异常的解决办法

    异常情况描述 有一个“文章”类,其中包含一个“List<段落>”类型的属性,“段落”类是抽象类,其子类有“副标题段落”.“文本段落”.“图像段落”.“附件段落”.“列表段落”等类型. 将“ ...

  3. linux备忘

    一.数字计算 echo $[3600*24] --只能计算整数echo $((3600*4)) --只能计算整数 expr 3600 \* 24        --注意空格,*要加\,只能计算整数ec ...

  4. 开启 mysql 远程访问

    如何开启MySQL的远程帐号-1)首先以 root 帐户登陆 MySQL 在 Windows 主机中点击开始菜单,运行,输入“cmd”,进入控制台,然后cd 进入MySQL 的 bin 目录下,然后输 ...

  5. Ceph剖析:定时器safetimer的实现

    定时器的作用是在指定的时间执行指定的动作.SafeTimer通过multimap数据结构维护定时项,定时项是时间和事件的Pair,定时项在map中按照定时时间从小到大排列.此外,SafeTimer使用 ...

  6. 了解Hadoop和大数据

    1. 场景: 现在人产生数据越来越快,机器则更快,所以需要另外的一种处理数据的方法.   硬盘容量增加,但是性能没跟上,解决办法是将数据分到多块硬盘,然后同时读取. 问题:     硬件问题 -- 复 ...

  7. mysql 事件调度

    适用于mysql 5.1 及以后版本 1.查看是否开启 show variables like '%scheduler%' 2.查看进程 show processlist 3.事件调度器默认是关闭的, ...

  8. kernel 对浮点的支持

    http://blog.chinaunix.net/uid-22545494-id-316735.html 作者: Sam(甄峰)  sam_code@hotmail.com 一:早期ARM上的浮点模 ...

  9. 高尔夫管理系统SSH

    登录-----------http://localhost:8080/GOLF/Denglu 一.Action 1.处理今日消费数据逻辑的 package com.chinasofti.golf.ac ...

  10. 远程访问MySQL遇到的一些问题

    一.access deny GRANT ALL PRIVILEGES ON *.* TO '用户名'@'IP地址' IDENTIFIED BY '密码' with grant option;