• 某、人
    2019-01-10
    遇到过下面几种造成主从延迟的情况:
    1.主库DML语句并发大,从库qps高
    2.从库服务器配置差或者一台服务器上几台从库(资源竞争激烈,特别是io)
    3.主库和从库的参数配置不一样
    4.大事务(DDL,我觉得DDL也相当于一个大事务)
    5.从库上在进行备份操作
    6.表上无主键的情况(主库利用索引更改数据,备库回放只能用全表扫描,这种情况可以调整slave_rows_search_algorithms参数适当优化下)
    7.设置的是延迟备库
    8.备库空间不足的情况下

    这期的问题:
    看这曲线,应该是从库正在应用一个大事务,或者一个大表上无主键的情况(有该表的更新)
    应该是T3随着时间的增长在增长,而T1这个时间点是没变的,造成的现象就是
    随着时间的增长,second_behind_master也是有规律的增长
    展开

    作者回复: 分析的点很准确👍

    
     57
  • linqw
    2019-02-17
    总结下学习完高可用,老师有空帮忙看下
    1、主备延迟,就是在同一个事务在备库执行完成的时间和主库执行完成的时间之间的差值,包括主库事务执行完成时间和将binlog发送给备库,备库事务的执行完成时间的差值。每个事务的seconds_behind_master延迟时间,每个事务的 binlog 里面都有一个时间字段,用于记录主库上的写入时间,备库取出当前正在执行的事务的时间字段的值,计算它与当前系统时的差值。
    2、主备延迟的来源①首先,有些部署条件下,备库所在机器的性能要比主库所在的机器性能差,原因多个备库部署在同一台机器上,大量的查询会导致io资源的竞争,解决办法是配置”双1“,redo log和binlog都只write fs page cache②备库的压力大,产生的原因大量的查询操作在备库操作,耗费了大量的cpu,导致同步延迟,解决办法,使用一主多从,多个从减少备的查询压力③大事务,因为如果一个大的事务的dml操作导致执行时间过长,将其事务binlog发送给备库,备库也需执行那么长时间,导致主备延迟,解决办法尽量减少大事务,比如delete操作,使用limit分批删除,可以防止大事务也可以减少锁的范围。
    ④大表的ddl,会导致主库将其ddl binlog发送给备库,备库解析中转日志,同步,后续的dml binlog发送过来,需等待ddl的mdl写锁释放,导致主备延迟。
    3、可靠性优先策略,①判断备库 B 现在的 seconds_behind_master如果小于某个值(比如 5 秒)继续下一步,否则持续重试这一步,②把主库 A 改成只读状态,即把 readonly 设置为 true,③判断备库 B 的 seconds_behind_master的值,直到这个值变成 0 为止; 把备库 B 改成可读写也就是把 readonly 设置为 false; 把业务请求切换到备库,个人理解如果发送过来的binlog在中转日志中有多个事务,业务不可用的时间,就是多个事务被运用的总时间。如果非正常情况下,主库掉电,会导致出现的问题,如果备库和主库的延迟时间短,在中转日志运用完成,业务才能正常使用,如果在中转日志还未运用完成,切换为备库会导致之前完成的事务,”数据丢失“,但是在一些业务场景下不可接受。
    4、可用性策略,出现的问题:在双m,且binlog_format=mixed,会导致主备数据不一致,使用使用 row 格式的 binlog 时,数据不一致的问题更容易发现,因为binlog row会记录字段的所有值。
    5、老师有个问题不太理解,就是主备延迟时,会导致备库在没有运用中转日志时,业务查询时导致”数据丢失“,那如何解决了?
    展开

    作者回复: 1~4 很好的总结
    5. 也是好问题,直接看《28 | 读写分离有哪些坑?》😆

    
     10
  • 7号
    2019-01-09
    老师,生产环境有一张表需要清理,该表大小140G。要保留最近一个月的数据,又不能按时间直接用detele删(全表扫描),本来想通过清空分区表删,但是分区表又是哈希的。。有没好的办法呢?

    作者回复: 估计下一个月占多少比例,如果比较小就建新表,把数据导过去吧
    如果一个月占比高的话,只能一点点删了。

    时间字段有索引的话,每个分区按时间过滤出来删除

     1
     7
  • 万勇
    2019-01-09
    主备同步延迟,工作中常遇到几种情况:
    1.主库做大量的dml操作,引起延迟
    2.主库有个大事务在处理,引起延迟
    3.对myisam存储引擎的表做dml操作,从库会有延迟。
    4.利用pt工具对主库的大表做字段新增、修改和添加索引等操作,从库会有延迟。

    作者回复: 👍🏿
    你是有故事的😄

    
     7
  • 梁中华
    2019-01-09
    我有一个比较极端一点的HA问题,假设主库的binlog刚写成功还未来得及把binlog同步到从库,主库就掉电了,这时候从库的数据会不完整吗?
    第二个问题,原主库重启加入集群后,那条没有传出去的binlog会如何处理?

    作者回复: 1.可能会丢
    2. 要看重启之后的拓扑结构了,如果还有节点是这个库的从库,还是会拿走的

     3
     7
  • aubrey
    2019-02-14
    semi-sync在网络故障超时的情况下会退化成async,这个时候如果刚好主库掉电了,有些binlog还没有传给从库,从库无法判断数据跟主库是否一致,如果强行切换可能会导致丢数据,在金融业务场景下只能"人工智能"来做切换,服务中断时间长。AliSQL采用双通道复制更容易判断主备数据是否一致,如果一致可以自动切换,如果不一致才需要人工恢复数据。

    作者回复: 👍内行😆

    
     6
  • John
    2019-01-10
    循环复制根本原因是binlog中引入了非当前主机的server id,可以通过ignore server ids过滤,但是一般情况如果出现循环复制,数据的可靠性就值得怀疑了,不管是过滤还是重新找点都很难保证循环的部分完整执行过,最后都要验证数据的状态,属于特别严重故障😂

    作者回复: 你这个方法好👍🏿

    数据问题的话,如果是设置的row 格式的binlog还好,因为insert和delete都会报错,会出现循环的就是update, 然后update都是可重入的

    
     6
  • 崔伟协
    2019-01-11
    发生主从切换的时候,主有的最新数据没同步到从,会出现这种情况吗,出现了会怎么样

    作者回复: 异常切换有可能的

    要根据你的处理策略了,如果不能丢,有几个可选的
    1.不切换(等这个库自己恢复起来)
    2. 使用semi-sync策略
    3. 启动后业务做数据对账(这个一般用得少,成本高)

    
     4
  • 康磊
    2019-01-11
    老师你好,现在一般采用读写分离,读的是从库,那么主从如果出现延迟的话,读库就读的不是最新数据,对这种问题有什么好建议吗?

    作者回复: 第28篇专门讲这个问题,敬请期待🤝

    
     4
  • undifined
    2019-01-09
    问题答案:
    1. 备库在执行复杂查询,导致资源被占用
    2. 备库正在执行一个大事务
    3. DML 语句执行

    老师我的理解对吗
    展开

    作者回复: 1不太准确,明天我会提到哈

    23对的

    
     4
  • Long
    2019-01-09
    老师,您好:

    一直追这个课程,解决了我自己的很多知识盲点,或者更加深入的了解一些知识点,已经在试读留言下推荐了这个课程。

    但是有的时候在分析问题的时候,看很多日志,比如error log中的死锁日志,报错日志中每个字段是什么意思,以及show innodb engine status中每个日志段的意思,比如在将redo log的时候innodb status就会记录,这样就可以结合课程中的log write,page cahce和fsync逻辑到数据库中实际感受到学到的原因,在应用中怎么一一对应。
    比如,show innodb engine status中:
     --------
     FILE I/O
     --------
    ***
    ***
     Pending normal aio reads: 0 [0, 0, 0, 0, 0, 0, 0, 0] , aio writes: 0 [0, 0, 0, 0, 0, 0, 0, 0] ,
      ibuf aio reads: 0, log i/o's: 0, sync i/o's: 0
     Pending flushes (fsync) log: 1; buffer pool: 0
     14321192292 OS file reads, 120057595 OS file writes, 60413577 OS fsyncs
     10 pending preads, 1 pending pwrites
     4648.01 reads/s, 16383 avg bytes/read, 48.09 writes/s, 34.98 fsyncs/s


     ---
     LOG
     ---
     Log sequence number 3893849611607
     Log flushed up to 3893849603096
     Pages flushed up to 3893705803837
     Last checkpoint at 3893705803837
     1 pending log writes, 0 pending chkp writes
     28053287 log i/o's done, 10.15 log i/o's/second

    之前看过网上的一些分析,由于和原理脱离,所以理解的都不深。
    非常期待老师能结合error log一些常见问题分析比如dead lock,常见crash啊之类的,
    以及show innodb engine status中的重点内容!

    多谢

    展开

    作者回复: 嗯,这这个建议很好,我会考虑加的哈🤝

    
     4
  • via
    2019-01-09
    通过 binlog 输出到外部系统,比如 Hadoop 这类...

    文中这个具体是可采用什么工具呢?
     

    作者回复: canal 可以了解下

    
     4
  • 可可
    2019-03-27
    老师,我先来讲个笑话
    昨天去面试另一家公司,问mysql的问题,问罢之后。
    面试官:我看你对mysql了解的还蛮深得,是不是也看了极客时间的。。。~
    我: 没有没有(连忙否认,有一种提前看了考试答案的罪恶感😂😂😂)


    所以最后我有个问题,如果后面还有这样的问题,老师您觉得我应该怎么回答?
    展开

    作者回复: 额。。这个不好说,得看面试官是什么类型的😅

    最好的情况是那种,面试官问你的专栏讲到的知识点你都回答了,
    然后面试官又把问题延伸了,然后你还顺利回答出来了。

    这样就大大方方说学过了, 面试官一定觉得你又好学又勤于思考哟😆

    (先预祝一波顺利拿到offer哈)

    
     3
  • aliang
    2019-02-23
    老师,我有一个问题:(1)seconds_behind_master的计算方法是通过从库的系统时间戳减去sql_thead线程正在执行的binlog_event上的时间戳的差值。当从库系统时间不准时也不会影响seconds的值,因为从库连接到主库时会通过select unix_timestamp()查询主库的系统时间,若发现和从库不一致会在计算seconds这个值时作调整(2)我的疑惑是在主从网络正常时,select unix_timestamp执行的频率和触发条件是怎样的(换句话说(1)中描述的从库连接到主库这个行为是一直存在的还是有其他触发条件?)。如果这个频率不高,那在两次select unix_timestamp期间从库系统时间发生变化,seconds的值岂不是不准了?

    作者回复: 嗯,取时间这个动作只发生在“主从建立连接”的过程中,
    如果已经连着的时候,时间戳改掉,是会不准的

     1
     3
  • cyberty
    2019-01-10
    请问老师,如果备库连接主库之后,主库的系统时间修改了,备库同步的时候是否会自动修正?

    作者回复: 好问题,不会

    
     3
  • WilliamX
    2019-01-09
    大事务导致主从延时的问题,我修改下。
    主库上即使有大事务,但只要影响行数不多,传送到从库时间为t1,完成时间为T3,那这个时间gap和是否大事务没关系吧?

    作者回复: 嗯,你这里说的大事务,是那种“查很多,更新少”,这种没关系的;

    一般我们在说主备延迟的大事务,是指“更新很多行”的

    
     3
  •  JJ
    2019-01-09
    请问老师,主库断电了,怎么把binlog传给从库同步数据,怎么使的SBM为0主从切换呢?

    作者回复: 等应用完就认为是SBM=0

    如果不能接受主库有来不及传的,就使用semi-sync

    
     3
  • xm
    2019-01-10
    一般主从延时多少算是合理的?是秒级别吗?

    作者回复: 一般大于1就不好 ^_^

    
     2
  • 易翔
    2019-01-09
    常见的都讲了,补充几点我遇到过的。

    1,备库做逻辑备份时,有产生MDL锁。然后复制线程刚好被堵塞。。kill掉备份线程,一切都畅快了。。我遇到过,但是感觉那备份期间产生的非共享锁不是短时间就释放的吗?为什么堵的时间那么长,感觉像是遇到死锁。大神讲讲其中原因。

    2,数据库用了共享存储,其它业务的不期待(我们当时是归档程序)占用会导致同样连接该存储上的数据库遇到写入瓶颈,写入不仅仅是应用中继日志产生的数据。还有写中继日志。写中继日志慢,应用日志线程工作却有条不紊。这时候也会产生备库延迟。由于体现没有中继日志滞留,没有想到io问题,当时第一反应是网络带宽被打满了,确认了,没有问题过后。然后找到存储,看存储IOPS。最后定位到归档程序正在批量写入数据。
    展开

    作者回复: 👍

    
     2
  • EAGLE
    2019-01-09
    文中提到“如果一个主库上的语句执行 10 分钟,那这个事务很可能就会导致从库延迟 10 分钟”。这个延迟是针对当前delete事务,还是所有的事务都延迟。

    作者回复: 要看有没有开并行复制,默认是串行,一个堵全部堵

    
     2
我们在线,来聊聊吧