MySQL数据库在线热备(半同步复制)
Posted 锦衣admin
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了MySQL数据库在线热备(半同步复制)相关的知识,希望对你有一定的参考价值。
MySQL的半同步复制
半同步复制介绍
所谓的半同步复制就是master每commit一个事务(简单来说就是做一个改变数据的操作),要确保slave接受完主服务器发送的binlog日志文件并写入到自己的中继日志relay log里,然后会给master信号,告诉对方已经接收完毕,这样master才能把事物成功commit。这样就保证了master-slave的数据绝对的一致(但是以牺牲master的性能为代价).但等待时间也是可以调整的。
- commit 的意思是将增删改的操作写入内存,才叫执行完一个commit
主从复制(AB复制)与半同步复制的区别:
- AB复制只是将master中的bin log 写入到slave 的 relay log 中,至于slave 服务器有没有成功执行并不考虑
- slave 接收完毕后不会返回接受成功的信号
半同步复制的基本实现
第一步:准备一套M-S的主从架构(建议使用基于GTIDs架构设计)
-
搭建完开启slave数据同步
第二步:给MASTER与SLAVE安装plugin插件
- plugin插件的存放位置在
$basedir/lib/plugin/
mastet 安装插件:
semisync_master.so
进入到mysql执行安装命令:
# mysql > install plugin rpl_semi_sync_master soname 'semisync_master.so';
查看插件配置状态:
# mysql > show global variables like 'rpl_semi_sync%';
+-------------------------------------------+------------+
| Variable_name | Value |
+-------------------------------------------+------------+
| rpl_semi_sync_master_enabled | OFF | => 开关状态
| rpl_semi_sync_master_timeout | 10000 | => 超时时间
| 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 |
+-------------------------------------------+------------+
slave 安装插件:
semisync_slave.so
进入到mysql中执行安装命令:
# mysql > install plugin rpl_semi_sync_slave soname 'semisync_slave.so';
查看插件配置状态:
# mysql > show global variables like 'rpl_semi_sync%';
+---------------------------------+-------+
| Variable_name | Value |
+---------------------------------+-------+
| rpl_semi_sync_slave_enabled | OFF | => 开关状态
| rpl_semi_sync_slave_trace_level | 32 | => 级别
+---------------------------------+-------+
第三步:激活MASTER与SLAVE服务器中的半同步复制插件
master 激活插件:
激活插件:
# mysql > set global rpl_semi_sync_master_enabled=on;
查看插件配置状态:
# mysql > show global status like 'rpl_semi_sync%';
+--------------------------------------------+-------+
| Variable_name | Value |
+--------------------------------------------+-------+
| Rpl_semi_sync_master_clients | 0 |
| Rpl_semi_sync_master_net_avg_wait_time | 0 |
| Rpl_semi_sync_master_net_wait_time | 0 |
| Rpl_semi_sync_master_net_waits | 0 |
| Rpl_semi_sync_master_no_times | 0 |
| Rpl_semi_sync_master_no_tx | 0 |
| Rpl_semi_sync_master_status | ON | => ON 表示开启状态
| Rpl_semi_sync_master_timefunc_failures | 0 |
| Rpl_semi_sync_master_tx_avg_wait_time | 0 |
| 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 |
| Rpl_semi_sync_master_yes_tx | 0 |
+--------------------------------------------+-------+
slave 激活插件:
激活插件:
# mysql > set global rpl_semi_sync_slave_enabled=on;
查看插件配置状态:
# mysql > show global variables like 'rpl_semi_sync%';
+---------------------------------+-------+
| Variable_name | Value |
+---------------------------------+-------+
| rpl_semi_sync_slave_enabled | ON | => ON 表示开启状态
| rpl_semi_sync_slave_trace_level | 32 |
+---------------------------------+-------+
第四步:在SLAVE服务器中重启IO线程
slave 上重启IO 线程:
- 重启前需要保证slave是开启的
关闭IO线程:
# mysql > stop slave IO_THREAD;
开启IO线程:
# mysql > start slave IO_THREAD;
第五步:测试验证半同步复制
- 当slave从库的IO_Thread 线程将binlog日志接受完毕后,要给master一个确认,如果超过10s未收到slave的接收确认信号,那么就会自动转换为传统的异步复制模式。
master插入数据查看slave返回信号:
master 插入一条记录,查看slave是否有成功返回
# mysql> insert into bbb values(null,'f');
查看slave是否成功返回信号:
# mysql> show global status like 'rpl_semi_sync%_yes_tx';
+-----------------------------+-------+
| Variable_name | Value |
+-----------------------------+-------+
| Rpl_semi_sync_master_yes_tx | 1 | => slave接受bin log并写入relay log后会返回一个信号
+-----------------------------+-------+
master 再次插入一条sql语句:
# mysql> insert into bbb values(null,'g'),(null,'h');
再次查看slave是否成功返回信号:
# mysql> show global status like 'rpl_semi_sync%_yes_tx';
+-----------------------------+-------+
| Variable_name | Value |
+-----------------------------+-------+
| Rpl_semi_sync_master_yes_tx | 2 | => slave再次返回信号
+-----------------------------+-------+
第六步:slave 模拟服务器故障
模拟slave服务器故障:
模拟slave发生故障:
# service mysqld stop => 直接关闭slave的MySQL服务
master 再次插入数据:
# mysql> insert into bbb values (null,'i');
Query OK, 1 row affected (10.03 sec) => 这里插入需要等待10秒,slave没有返回信号,master才将数据插入数据表
# mysql> insert into bbb values (null,'j');
Query OK, 1 row affected (0.01 sec) => 现在自动转成了原来的异步模式,所以不需要等待
查看slave是否成功返回信号:
# mysql > show global status like 'rpl_semi_sync%_yes_tx';
+-----------------------------+-------+
| Variable_name | Value |
+-----------------------------+-------+
| Rpl_semi_sync_master_yes_tx | 2 | => slave没有返回信号
+-----------------------------+-------+
备注:转成异步模式即原来的GTIDs主从复制
第七步:slave重新启动半同步复制
- master需要等到slave确认后才能提交,如果等不到确认消息,master等待10s种后自动变成异步同步;slave启起来后,master上改变的数据还是会自动复制过来,数据又回到一致。
重新启动半同步复制:
slave 重启MySQL服务:
# service mysql stert
进入MySQL中重新启动插件:
# mysql > star slave; => 因为关闭了MySQL服务主从复制也随之关闭,所以需要先启动slave
# mysql > set global rpl_semi_sync_slave_enabled=on;
重启IO线程:
# mysql > stop slave IO_THREAD;
# mysql > start slave IO_THREAD;
重启后插入一条数据:
# mysql > insert into bbb values (null,'o');
查看slave是否成功返回信号:
# mysql > show global status like 'rpl_semi_sync%_yes_tx';
+-----------------------------+-------+
| Variable_name | Value |
+-----------------------------+-------+
| Rpl_semi_sync_master_yes_tx | 3 | => 重启后slave 返回信号
+-----------------------------+-------+
修改master等待slave返回信号的时间(默认10秒)
rpl_semi_sync_master_timeout
修改等待时间
master 上修改:
修改等待时间:
# mysql > set global rpl_semi_sync_master_timeout=20000; => 修改为20秒
查看修改情况:
# mysql > show global variables like 'rpl_semi_sync%';
+-------------------------------------------+------------+
| Variable_name | Value |
+-------------------------------------------+------------+
| rpl_semi_sync_master_enabled | ON |
| rpl_semi_sync_master_timeout | 20000 | => 修改成功
| 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 |
+-------------------------------------------+------------+
卸载半同步复制插件(不需要时)
slave 卸载半同步插件:
先关闭IO 线程:
# mysql > stop slave IO_THREAD;
查看mysql 所有已经安装的插件与开启状态:
# mysql > select plugin_name,load_option from information_schema.plugins;
卸载半同步复制插件 rpl_semi_sync_slave:
# mysql > uninstall plugin rpl_semi_sync_slave;
master 卸载半同步复制插件:
查看mysql 所有已经安装的插件与开启状态:
# mysql > select plugin_name,load_option from information_schema.plugins;
说明:
FORCE:代表强制开启
ON:代表开启
OFF:代表关闭
卸载半同步复制插件 rpl_semi_sync_master:
# mysql > set global rpl_semi_sync_master_enabled=off; => 需要先关闭插件
# mysql > uninstall plugin rpl_semi_sync_master; => 再卸载
注意:卸载master 半同步复制插件需要先关停IO线程,和卸载slave的半同步复制插件
如果提示现在无法卸载插件“rpl_semi_sync_master”。等待一段时间后再执行就可以了
以上是关于MySQL数据库在线热备(半同步复制)的主要内容,如果未能解决你的问题,请参考以下文章