1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 |
从MYSQL5.5开始,支持半自动复制。之前版本的MySQL Replication都是异步(asynchronous)的,主库在执行完一些事务后,是不会管备库的进度的。如果备库不幸落后,而更不幸的是主库此时又出现Crash(例如宕机),这时备库中的数据就是不完整的。简而言之,在主库发生故障的时候,我们无法使用备库来继续提供数据一致的服务了。 半同步复制(Semi synchronous Replication)则一定程度上保证提交的事务已经传给了至少一个备库。 出发点是保证主从数据一致性问题,安全的考虑。 5.5 出现概念,但是不建议使用,性能太差 5.6 出现group commit 组提交功能,来提升开启半同步复制的性能 5.7 更加完善了,在group commit基础上出现了MGR 5.7 的增强半同步复制的新特性:after commit; after sync; #半同步复制实际上就是mysql的一个插件 优缺点: 1.保证主从数据一致性,实时的 2.性能差,效率低 3.从库sql写入会影响主库的性能 4.半同步复制有一个超时时间,如果超过这个超时时间,那么恢复异步复制 |
1.配置半同步复制(主库)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 |
#登录数据库 [root@db01 ~]# mysql -uroot -p123 #查看是否有动态支持 mysql> show global variables like 'have_dynamic_loading'; #安装自带插件 mysql> INSTALL PLUGIN rpl_semi_sync_master SONAME'semisync_master.so'; #启动插件 mysql> SET GLOBAL rpl_semi_sync_master_enabled = 1; #设置超时 mysql> SET GLOBAL rpl_semi_sync_master_timeout = 1000; #修改配置文件 [root@db01 ~]# vim /etc/my.cnf #在[mysqld]标签下添加如下内容(不用重启库) [mysqld] rpl_semi_sync_master_enabled=1 rpl_semi_sync_master_timeout=1000 #检查安装: mysql> show variables like'rpl%'; mysql> show global status like 'rpl_semi%'; |
2.配置半同步复制(从库)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
#登录数据库 [root@mysql-db02 ~]# mysql -uroot -p123 #安装slave半同步插件 mysql> INSTALL PLUGIN rpl_semi_sync_slave SONAME'semisync_slave.so'; #启动插件 mysql> SET GLOBAL rpl_semi_sync_slave_enabled = 1; #重启io线程使其生效 mysql> stop slave io_thread; mysql> start slave io_thread; #编辑配置文件(不需要重启数据库) [root@mysql-db02 ~]# vim /etc/my.cnf #在[mysqld]标签下添加如下内容 [mysqld] rpl_semi_sync_slave_enabled =1 |
3.参数说明
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 |
rpl_semi_sync_master_timeout=milliseconds 设置此参数值(ms),为了防止半同步复制在没有收到确认的情况下发生堵塞,如果Master在超时之前没有收到任何确认,将恢复到正常的异步复制,并继续执行没有半同步的复制操作。 rpl_semi_sync_master_wait_no_slave={ON|OFF} 如果一个事务被提交,但Master没有任何Slave的连接,这时不可能将事务发送到其它地方保护起来。默认情况下,Master会在时间限制范围内继续等待Slave的连接,并确认该事务已经被正确的写到磁盘上。 可以使用此参数选项关闭这种行为,在这种情况下,如果没有Slave连接,Master就会恢复到异步复制。 mysql> show global status like 'rpl_semi%'; +--------------------------------------------+-------+ | Variable_name | Value | +--------------------------------------------+-------+ | Rpl_semi_sync_master_clients | 0 | #记录支持半同步的slave的个数 | Rpl_semi_sync_master_net_avg_wait_time | 0 | #master 等待slave回复的平均等待时间单位微秒 | Rpl_semi_sync_master_net_wait_time | 0 | #master 总的等待时间 | Rpl_semi_sync_master_net_waits | 0 | #master 等待slave回复的的总的等待次数 | Rpl_semi_sync_master_no_times | 0 | #master 关闭半同步复制的次数 | Rpl_semi_sync_master_no_tx | 0 | #master 没有收到slave的回复而提交的次数 | Rpl_semi_sync_master_status | OFF | #标记master现在是否是半同步复制状态 | Rpl_semi_sync_master_timefunc_failures | 0 | #时间函数未正常工作的次数 | Rpl_semi_sync_master_tx_avg_wait_time | 0 | #开启Semi-sync,事务返回需要等待的平均时间 | Rpl_semi_sync_master_tx_wait_time | 0 | #事务等待备库响应的总时间 | Rpl_semi_sync_master_tx_waits | 0 | #事务等待备库响应的总次数 | Rpl_semi_sync_master_wait_pos_backtraverse | 0 | #改变当前等待最小二进制日志的次数 | Rpl_semi_sync_master_wait_sessions | 0 | #当前有多少个session因为slave的回复而造成等待 | Rpl_semi_sync_master_yes_tx | 0 | #master 成功接收到slave的回复的次数 +--------------------------------------------+-------+ |
4.测试半同步复制
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 |
#创建两个数据库,test1和test2 mysql> create database test1; Query OK, 1 row affected (0.04 sec) mysql> create database test2; Query OK, 1 row affected (0.00 sec) #查看复制状态 mysql> show global status like 'rpl_semi%'; +--------------------------------------------+-------+ | Variable_name | Value | +--------------------------------------------+-------+ | Rpl_semi_sync_master_clients | 1 | | Rpl_semi_sync_master_net_avg_wait_time | 768 | | Rpl_semi_sync_master_net_wait_time | 1497 | | Rpl_semi_sync_master_net_waits | 2 | | Rpl_semi_sync_master_no_times | 0 | | Rpl_semi_sync_master_no_tx | 0 | | Rpl_semi_sync_master_status | ON | | Rpl_semi_sync_master_timefunc_failures | 0 | | Rpl_semi_sync_master_tx_avg_wait_time | 884 | | Rpl_semi_sync_master_tx_wait_time | 1769 | | Rpl_semi_sync_master_tx_waits | 2 | | Rpl_semi_sync_master_wait_pos_backtraverse | 0 | | Rpl_semi_sync_master_wait_sessions | 0 | #此行显示2,表示刚才创建的两个库执行了半同步 | Rpl_semi_sync_master_yes_tx | 2 | +--------------------------------------------+-------+ 14 rows in set (0.06 sec) #从库查看 mysql> show databases; +--------------------+ | Database | +--------------------+ | information_schema | | mysql | | performance_schema | | test | | test1 | | test2 | +--------------------+ #关闭半同步(1:开启 0:关闭) mysql> SET GLOBAL rpl_semi_sync_master_enabled = 0; #查看半同步状态 mysql> show global status like 'rpl_semi%'; +--------------------------------------------+-------+ | Variable_name | Value | +--------------------------------------------+-------+ | Rpl_semi_sync_master_clients | 1 | | Rpl_semi_sync_master_net_avg_wait_time | 768 | | Rpl_semi_sync_master_net_wait_time | 1497 | | Rpl_semi_sync_master_net_waits | 2 | | Rpl_semi_sync_master_no_times | 0 | | Rpl_semi_sync_master_no_tx | 0 | | Rpl_semi_sync_master_status | OFF | #状态为关闭 | Rpl_semi_sync_master_timefunc_failures | 0 | | Rpl_semi_sync_master_tx_avg_wait_time | 884 | | Rpl_semi_sync_master_tx_wait_time | 1769 | | Rpl_semi_sync_master_tx_waits | 2 | | Rpl_semi_sync_master_wait_pos_backtraverse | 0 | | Rpl_semi_sync_master_wait_sessions | 0 | | Rpl_semi_sync_master_yes_tx | 2 | +--------------------------------------------+-------+ 14 rows in set (0.00 sec) #再一次创建两个库 mysql> create database test3; Query OK, 1 row affected (0.00 sec) mysql> create database test4; Query OK, 1 row affected (0.00 sec) #再一次查看半同步状态 mysql> show global status like 'rpl_semi%'; +--------------------------------------------+-------+ | Variable_name | Value | +--------------------------------------------+-------+ | Rpl_semi_sync_master_clients | 1 | | Rpl_semi_sync_master_net_avg_wait_time | 768 | | Rpl_semi_sync_master_net_wait_time | 1497 | | Rpl_semi_sync_master_net_waits | 2 | | Rpl_semi_sync_master_no_times | 0 | | Rpl_semi_sync_master_no_tx | 0 | | Rpl_semi_sync_master_status | OFF | | Rpl_semi_sync_master_timefunc_failures | 0 | | Rpl_semi_sync_master_tx_avg_wait_time | 884 | | Rpl_semi_sync_master_tx_wait_time | 1769 | | Rpl_semi_sync_master_tx_waits | 2 | | Rpl_semi_sync_master_wait_pos_backtraverse | 0 | | Rpl_semi_sync_master_wait_sessions | 0 | #此行还是显示2,则证明,刚才的那两条并没有执行半同步否则应该是4 | Rpl_semi_sync_master_yes_tx | 2 | +--------------------------------------------+-------+ 14 rows in set (0.00 sec) 注:不难发现,在查询半同步状态是,开启半同步,查询会有延迟时间,关闭之后则没有 |