mysql5.7 半同步_MySQL5.7 半同步复制

一、概述

5.5与5.7的半同步复制可能存在差异,从MySQL5.5开始,MySQL以插件的形式支持半同步复制

异步:默认情况下,MySQL复制是异步的。主库在执行完客户端提交的事务后会立即将结果返给给客户端,并不关心从库是否已经接收并处理。此时若是主若是崩溃了,那提交完成的事务可能并没有传到从上,从而导致数据不一致。

全同步:当主库执行完接受到的事务,会等待所有从机执行此事务的返回值,当收到所有从机的返回值时才会返回给客户端。所以对性能的影响严重。

半同步:介于以上两者之间,主库在执行完客户端的事务后,会等待至少一个从机接收到并写入relay log中才会返回给客户端。它提高了数据的安全性, 也造成了一定程度的延迟,这个延迟最少是一个TCP/IP往返的时间。所以,半同步复制最好在低延时的网络中使用。

relay log中继日志:在salve中IO线程会拉去master的二进制到relay log中,然后SQL线程会读取relay-log日志的内容并应用到从服务器。

两个插件实现半同步功能。主端有一个插件,从端有一个插件。

半同步复制必须在主和从都有启用,否则使用异步复制。

只有事件写入中继日志并且刷新到磁盘后,从设备才会确认收到事务的事件。

如果无任何从服务器确认事务的情况下发生超时,主服务器将恢复异步复制。当至少一个半同步丛机赶上,主机将返回到半同步复制。

After_commit(5.6缺省值)

Master将事务写进binlog日志中,传递到slave刷新到relay_log,同时master提交事务。Master等待slave反馈写入了relay log,只有收到sck包后master才会将commit ok结果反馈给客户端

After_sync(5.7缺省值)

master将事务写进binlog中,传到slave刷新到磁盘relay log。Master等待slave收到ack包之后,再提交事务并且返回commit ok结果给客户端,这样即使主库宕机了,也可以保证所有主库上的书屋都已经同步到了slave的relay log上去。

二、半同步复制配置

1.)安装相关插件

master: --安装 semisync_master.so插件

mysql> install plugin rpl_semi_sync_master soname 'semisync_master.so';

slave:  --安装 semisync_slave.so插件

mysql> install plugin rpl_semi_sync_slave soname 'semisync_slave.so';

查看是否安装插件:

mysql> SELECT PLUGIN_NAME, PLUGIN_STATUS FROM INFORMATION_SCHEMA.PLUGINS WHERE PLUGIN_NAME LIKE '%semi%';

+------------------------------+-------------------------+

| PLUGIN_NAME           | PLUGIN_STATUS |

+------------------------------+-------------------------+

| rpl_semi_sync_master | ACTIVE         |

+------------------------------+------------------------ +

2.默认情况下它是禁用的。主端和从端都必须启用插件才能启用半同步复制

开启方式:

1.)更改变量:

master:

SET GLOBAL rpl_semi_sync_master_enabled = {0|1}; #1来启用半同步复制,0来禁用它

SET GLOBAL rpl_semi_sync_master_timeout = N;#该值N以毫秒为单位给出。默认值是10000(10秒)

slave:

SET GLOBAL rpl_semi_sync_slave_enabled = {0|1};

2.)修改配置文件:

[mysqld]

rpl_semi_sync_master_enabled = 1

...

......

如果是在运行的的从站上启用半同步复制,则需要重启I/O线程,使从站重新连接主并注册为半同步丛站。

STOP SLAVE IO_THREAD;

START SLAVE IO_THREAD;

3.监控半同步复制

mysql> SHOW VARIABLES LIKE 'rpl_semi_sync%';

+-------------------------------------------+------------+

| Variable_name | Value |

+-------------------------------------------+------------+

| rpl_semi_sync_master_enabled | ON |

| rpl_semi_sync_master_timeout | 1000 |

| rpl_semi_sync_master_trace_level | 32 |

| rpl_semi_sync_master_wait_for_slave_count | 1 |

| rpl_semi_sync_master_wait_no_slave | ON |

| rpl_semi_sync_master_wait_point | AFTER_SYNC |

+-------------------------------------------+------------+

6 rows in set (0.00 sec)

mysql> SHOW STATUS LIKE 'Rpl_semi_sync%';

+--------------------------------------------+-------+

| Variable_name | Value |

+--------------------------------------------+-------+

| Rpl_semi_sync_master_clients | 1 | 有多少个Semi-sync的备库| Rpl_semi_sync_master_net_avg_wait_time | 0 |事务提交后,等待备库响应的平均时间| Rpl_semi_sync_master_net_wait_time | 0 |等待网络响应的总次数| Rpl_semi_sync_master_net_waits | 7 |总的网络等待时间| Rpl_semi_sync_master_no_times | 0 | 一共有几次从Semi-sync跌回普通状态| Rpl_semi_sync_master_no_tx | 0 |库未及时响应的事务数,如果这个值很大就有问题| Rpl_semi_sync_master_status | ON | 主库上Semi-sync是否正常开启| Rpl_semi_sync_master_timefunc_failures | 0 |时间函数未正常工作的次数| Rpl_semi_sync_master_tx_avg_wait_time | 410 | 开启Semi-sync,事务返回需要等待的平均时间| Rpl_semi_sync_master_tx_wait_time | 2876 |事务等待备库响应的总时间| Rpl_semi_sync_master_tx_waits | 7 |事务等待备库响应的总次数| Rpl_semi_sync_master_wait_pos_backtraverse | 0 |改变当前等待最小二进制日志的次数| Rpl_semi_sync_master_wait_sessions | 0 |当前有几个线程在等备库响应| Rpl_semi_sync_master_yes_tx | 7 | Semi-sync模式下,成功的事务数+--------------------------------------------+-------+

15 rows in set (0.00 sec)

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值