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架构设计)

第二步:给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数据库在线热备(半同步复制)的主要内容,如果未能解决你的问题,请参考以下文章

MySQL数据库在线热备(主从复制之AB复制)

MySQL数据库在线热备简介

MySQL数据库在线热备简介

MySQL数据库在线热备(使用MHA搭建高可用架构)

MySQL数据库在线热备(使用MHA搭建高可用架构)

基于半同步复制的MHA高可用MySql集群架构搭建实战