Centos7 Mysql 集群--之三(主从复制延迟解决方案)

  1. 查看当前默认配置(MYSQL5.7)
[root@MYSQLB bin]# mysql -uroot -p123456

mysql> show global variables like 'slave_parallel_workers';   #默认是0,即单线程
+------------------------+-------+
| Variable_name          | Value |
+------------------------+-------+
| slave_parallel_workers | 0     |
+------------------------+-------+


mysql> show global variables like '%slave_parallel_type%';#默认是多线程机制是一个线程处理一个库
+---------------------+----------+
| Variable_name       | Value    |
+---------------------+----------+
| slave_parallel_type | DATABASE |
+---------------------+----------+


mysql> show full processlist;
+----+-------------+--------------------+------+-------------+---------+---------------------------------------------------------------+-----------------------+
| Id | User        | Host               | db   | Command     | Time    | State                                                         | Info                  |
+----+-------------+--------------------+------+-------------+---------+---------------------------------------------------------------+-----------------------+
|  9 | repl        | MYSQLA:61254       | NULL | Binlog Dump | 1229510 | Master has sent all binlog to slave; waiting for more updates | NULL                  |
| 10 | system user |                    | NULL | Connect     | 1229504 | Waiting for master to send event                              | NULL                  |
| 11 | system user |                    | NULL | Connect     |     315 | Slave has read all relay log; waiting for more updates        | NULL                  |
| 13 | root        | localhost          | NULL | Sleep       | 1222364 |                                                               | NULL                  |
| 14 | root        | MYSQLA:1652        | test | Sleep       |      15 |                                                               | NULL                  |
| 15 | root        | MYSQLA:1658        | test | Sleep       |      25 |                                                               | NULL                  |
| 16 | root        | MYSQLA:1676        | test | Sleep       |       5 |                                                               | NULL                  |
| 17 | root        | MYSQLB:27432       | test | Sleep       |      27 |                                                               | NULL                  |
| 18 | root        | MYSQLB:27434       | test | Sleep       |       7 |                                                               | NULL                  |
| 19 | root        | MYSQLB:27436       | test | Sleep       |      17 |                                                               | NULL                  |
| 22 | root        | 192.168.40.1:55485 | test | Sleep       |     287 |                                                               | NULL                  |
| 23 | root        | 192.168.40.1:55495 | test | Sleep       |     284 |                                                               | NULL                  |
| 24 | root        | localhost          | NULL | Query       |       0 | starting                                                      | show full processlist |
+----+-------------+--------------------+------+-------------+---------+---------------------------------------------------------------+-----------------------+
13 rows in set (0.00 sec)
  1. 配置从服务器上并行复制的参数(开启 Enhanced Multi-Threaded Slave),双主则两台都配置
[root@MYSQLA ~]# vim /etc/my.cnf
#MySQL 5.7开启Enhanced Multi-Threaded 在Slave的my.cnf配置:
# slave
#变量slave-parallel-type可以有两个值:DATABASE 默认值,基于库的并行复制方式;LOGICAL_CLOCK:基于组提交的并行复制方式
slave-parallel-type=LOGICAL_CLOCK
#提交的事务都是可以并行回放(配合binary log group commit);
slave-parallel-workers=16
#将master.info和relay.info保存在表中,默认是Myisam引擎,官方建议用  
#开启MTS功能后,务必将参数master_info_repostitory设置为TABLE,这样性能可以有50%~80%的提升。这是因为并 行复制开启后对于元master.info这个文件的更新将会大幅提升
master_info_repository=TABLE
relay_log_info_repository=TABLE
#启用relaylog的自动修复功能,避免由于网络之类的外因造成日志损坏,主从停止。
relay_log_recovery=ON
relay_log_purge=ON  
  1. 再次检查配置
[root@MYSQL ~]# service mysqld restart

root@localhost : (none)【10:53:41】 2 SQL->show global variables like 'slave_parallel_workers';
+------------------------+-------+
| Variable_name          | Value |
+------------------------+-------+
| slave_parallel_workers | 16    |
+------------------------+-------+
1 row in set (0.00 sec)

root@localhost : (none)【10:53:46】 3 SQL->show global variables like '%slave_parallel_type%';
+---------------------+---------------+
| Variable_name       | Value         |
+---------------------+---------------+
| slave_parallel_type | LOGICAL_CLOCK |
+---------------------+---------------+
1 row in set (0.01 sec)

root@localhost : (none)【10:54:02】 4 SQL->show full processlist;
+----+-------------+--------------+------+-------------+------+---------------------------------------------------------------+-----------------------+
| Id | User        | Host         | db   | Command     | Time | State                                                         | Info                  |
+----+-------------+--------------+------+-------------+------+---------------------------------------------------------------+-----------------------+
|  1 | system user |              | NULL | Connect     |   59 | Waiting for master to send event                              | NULL                  |
|  2 | system user |              | NULL | Connect     |   59 | Slave has read all relay log; waiting for more updates        | NULL                  |
|  3 | system user |              | NULL | Connect     |   59 | Waiting for an event from Coordinator                         | NULL                  |
|  4 | system user |              | NULL | Connect     |   59 | Waiting for an event from Coordinator                         | NULL                  |
|  5 | system user |              | NULL | Connect     |   59 | Waiting for an event from Coordinator                         | NULL                  |
|  6 | system user |              | NULL | Connect     |   59 | Waiting for an event from Coordinator                         | NULL                  |
|  7 | system user |              | NULL | Connect     |   59 | Waiting for an event from Coordinator                         | NULL                  |
|  9 | system user |              | NULL | Connect     |   59 | Waiting for an event from Coordinator                         | NULL                  |
| 10 | system user |              | NULL | Connect     |   59 | Waiting for an event from Coordinator                         | NULL                  |
| 11 | system user |              | NULL | Connect     |   59 | Waiting for an event from Coordinator                         | NULL                  |
| 12 | system user |              | NULL | Connect     |   59 | Waiting for an event from Coordinator                         | NULL                  |
| 13 | system user |              | NULL | Connect     |   59 | Waiting for an event from Coordinator                         | NULL                  |
| 14 | system user |              | NULL | Connect     |   59 | Waiting for an event from Coordinator                         | NULL                  |
| 15 | system user |              | NULL | Connect     |   59 | Waiting for an event from Coordinator                         | NULL                  |
| 16 | system user |              | NULL | Connect     |   59 | Waiting for an event from Coordinator                         | NULL                  |
| 17 | system user |              | NULL | Connect     |   59 | Waiting for an event from Coordinator                         | NULL                  |
| 18 | system user |              | NULL | Connect     |   59 | Waiting for an event from Coordinator                         | NULL                  |
| 19 | system user |              | NULL | Connect     |   59 | Waiting for an event from Coordinator                         | NULL                  |
| 20 | root        | MYSQLB:29734 | test | Sleep       |    4 |                                                               | NULL                  |
| 21 | root        | localhost    | NULL | Query       |    0 | starting                                                      | show full processlist |
| 22 | root        | MYSQLA:5604  | test | Sleep       |    2 |                                                               | NULL                  |
| 23 | repl        | MYSQLA:5678  | NULL | Binlog Dump |    5 | Master has sent all binlog to slave; waiting for more updates | NULL                  |
+----+-------------+--------------+------+-------------+------+---------------------------------------------------------------+-----------------------+
22 rows in set (0.01 sec)

#查看
mysql> show slave status\G
  1. 说明
情况3:
主库的DDL(alter、drop、repair、create)导致只读节点延迟
   可能1:只读节点与主库的DDL同步是串行进行的,如果DDL操作在主库执行时间很长,那么同样在备库也会消耗同样的时间,比如在主库对一张500W的表添加一个字段耗费了10分钟,那么在只读节点上也同样会耗费10分钟,所以只读节点会延迟600S,其他常见操作比如:

mysql> alter table test add column nn varchar(10);
mysql> alter table test add index(jj);

   可能2:只读节点上有一个执行时间非常长的的查询正在执行,那么这个查询会堵塞来自主库的DDL,读节点表被锁,直到查询结束为止,进而导致了只读节点的数据延迟。在只读节点上可以通过执行show processlist命令查看连接的状态处于: Waiting for table metadata lock

解决办法:
对于可能1,只能说执行操作之前对可能带来的影响要有考量,对于情况2,可以kill掉只读节点上的大查询进行,就可以恢复只读节点与主节点的数据同步

情况4:

主库执行大事务导致延迟
    主库执行了一条insert … select非常大的插入操作,该操作产生了近几百G的binlog文件传输到只读节点,进而导致了只读节点出现应用binlog延迟。

解决办法:
    将大事务拆分成为小事务进行排量提交,这样只读节点就可以迅速的完成事务的执行,不会造成数据的延迟。

情况5:

无主键的表进行DML操作导致延迟
mysql> update test set kk='fafa01';

由于表中没有主键,所以导致了每一个事务条目的更新都是全表扫描,如果表中很很多的数据,则备库执行该更新的事务条目的时候,就会出现很多的全表扫描更新;进一步说明就是,由于表中没有主键,在ROW模式下,每删一条数据都会做全表扫,也就是说一条delete,如果删了10条,会做10次全表扫,所以slave会一直卡住;

拓展:
      主键对于innodb来说,是非常重要的,每张表的设计的时候,都应该把主键默认的加上,不管你需不需要他,而且主键的设计最好选择自增型的主键,这里也可以略提一下自增主键的好处:

a.自增型主键以利于插入性能的提高;
b.自增型主键设计(int,bigint)可以降低二级索引的空间,提升二级索引的内存命中率;
c.自增型的主键可以减小page的碎片,提升空间和内存的使用
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 201,552评论 5 474
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 84,666评论 2 377
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 148,519评论 0 334
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,180评论 1 272
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,205评论 5 363
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,344评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,781评论 3 393
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,449评论 0 256
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,635评论 1 295
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,467评论 2 317
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,515评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,217评论 3 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,775评论 3 303
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,851评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,084评论 1 258
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,637评论 2 348
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,204评论 2 341

推荐阅读更多精彩内容