mysql数据库半同步复制
1.数据库配置
1.1.半同步复制的概念:
1.当Slave主机连接到Master时,能够查看其是否处于半同步复制的机制。
2.当Master上开启半同步复制的功能时,至少应该有一个Slave开启其功能。此时,一个线程在Master上提交事务将受到阻塞,直到得知一个已开启半同步复制功能的Slave已收到此事务的所有事件,或等待超时。
3.当一个事务的事件都已写入其relay-log中且已刷新到磁盘上,Slave才会告知已收到。
4.如果等待超时,也就是Master没被告知已收到,此时Master会自动转换为异步复制的机制。当至少一个半同步的Slave赶上了,Master与其Slave自动转换为半同步复制的机制。
5.半同步复制的功能要在Master,Slave都开启,半同步复制才会起作用;否则,只开启一边,它依然为异步复制。
1.2.半同步说明
在一主多从的场景中,主服务器会以同步的方式,只等待一台从服务器复制完成并返回成功信息后才停止等待过程,但是在超时后会自动降级为异步模式。
1.3.同步,异步,半同步复制的比较:
同步复制:Master提交事务,直到事务在所有的Slave都已提交,此时才会返回客户端,事务执行完毕。缺点:完成一个事务可能会有很大的延迟。
异步复制:当Slave准备好才会向Master请求binlog。缺点:不能保证一些事件都能够被所有的Slave所接收。
半同步复制:半同步复制工作的机制处于同步和异步之间,Master的事务提交阻塞,只要一个Slave已收到该事务的事件且已记录。它不会等待所有的Slave都告知已收到,且它只是接收,并不用等其完全执行且提交。
1.4.配置
环境:主从同步master1 slave2
Master ip172.16.1.41 slave2 ip :172.16.1.43
查看数据库是否支持半同步,YES代表支持。
mysql> show global variables like'have_dynamic%';
+----------------------+-------+
| Variable_name | Value |
+----------------------+-------+
| have_dynamic_loading | YES |
+----------------------+-------+
1 row in set (0.00 sec)
在主从复制的基础上,只需执行如下操作即可。
# On Master
mysql> INSTALL PLUGINrpl_semi_sync_master SONAME 'semisync_master.so';#插件
mysql> SET GLOBALrpl_semi_sync_master_enabled = 1; #启动模块
mysql> SET GLOBALrpl_semi_sync_master_timeout = 1000; #设置超时时间
# On Slave
mysql> INSTALL PLUGINrpl_semi_sync_slave SONAME 'semisync_slave.so'; #插件
mysql> SET GLOBALrpl_semi_sync_slave_enabled = 1; #启动模块
mysql> STOP SLAVE IO_THREAD; START SLAVEIO_THREAD; #重启进程使其模块生效
2.配置文件配置
如果需要开机时,自动能够实现半同步则需要在Master和Slave的my.cnf中编辑:
# On Master
[mysqld]
rpl_semi_sync_master_enabled=1 #启动模块
rpl_semi_sync_master_timeout=1000 #此单位是毫秒
# On Slave
[mysqld]
rpl_semi_sync_slave_enabled=1
配置完后需要重启服务
3.查看是否成功
查看从服务器上的semi_sync是否开启:
mysql> SHOW GLOBAL STATUS LIKE "rpl_semi%";
+----------------------------+-------+
| Variable_name | Value |
+----------------------------+-------+
| Rpl_semi_sync_slave_status | ON |
+----------------------------+-------+
1 row in set (0.00 sec)
查看主服务器上的semi_sync是否开启,注意clients 变为1 ,证明主从半同步复制连接成功:
Rpl_semi_sync_master_no_tx:查看有多少事务没有用半同步复制的机制进行复制。
Rpl_semi_sync_master_yes_tx:查看有多少事务是通过半同步复制机制成功复制。
rpl_semi_sync_master_timeout:是控制Master等待多长时间被告知Slave已收到,超时时间。
4、证明实践
将超时时间改为0;再测试,这个时候写入库,看看半同步了多少事务,看那些没同步,查看效果,进行比较。
在master1主库上测试:172.16.1.41
mysql> SETGLOBAL rpl_semi_sync_master_timeout = 0;
Query OK, 0 rowsaffected (0.00 sec)
设置到1000毫秒再试
mysql> SETGLOBAL rpl_semi_sync_master_timeout = 1000;
Query OK, 0 rowsaffected (0.00 sec)
mysql> SHOW GLOBAL STATUS LIKE 'rpl_semi%';
5、网友的半同步数据库复制
由于Mysql的复制都是基于异步进行的,在特殊情况下不能保证数据的成功复制,因此在mysql5.5之后使用了来自google补丁,可以将Mysql的复制实现半同步模式。所以需要为主服务器加载对应的插件。在Mysql的安装目录下的lib/plugin/目录中具有对应的插件semisync_master.so,semisync_slave.so,其中semisync_master.so是主服务器上的插件,而semisync_slave.so则是从服务器上的插件。
1、在主服务器的mysql服务器上执行如下命令
mysql>install pluginrpl_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; 超时时间
mysql> show variables like '%semi%'; 查看设置是否成功
2、在从服务器的mysql服务器上执行如下命令
mysql>install pluginrpl_semi_sync_slave soname 'semisync_slave.so'; 安装模块
mysql>set global rpl_semi_sync_slave_enabled = 1; 启用半同步复制从节点
mysql>stop slave io_thread;
mysql>start slave io_thread;
mysql> show variables like '%semi%'; 查看设置是否成功
3、验证半同步复制是否生效
在主服务器上执行如下命令
mysql> show global status like 'rpl_semi%';
4、在主服务器上创建数据库
mysql>use magedudb;
mysql> create table tb1 (id int);
将slave服务器端的IO停掉
mysql>stop slave;
此时再在主服务器上创建表
若第一次连接超时,第二次会自动降级为异步复制
5、上面的设置重启服务后会失效的,为了可以在开机时它还生效,就需要在主配置文件中修改了,在Master和Slave的my.cnf配置文件中编辑
Master:
vim/etc/my.cnf
[mysqld] rpl_semi_sync_master_enabled=1
rpl_semi_sync_master_timeout=1000
Slave:
vim/etc/my.cnf
[mysqld]
rpl_semi_sync_slave_enabled=1
6、也可通过设置全局变量的方式来设置是否启动半同步插件:
Master:
mysql>set global rpl_semi_sync_master_enabled=1
取消加载插件
mysql>uninstall plugin rpl_semi_sync_master;
Slave:
mysql>set global rpl_semi_sync_slave_enabled = 1;
mysql>uninstall plugin rpl_semi_sync_slave;
上面就是半同步复制的过程以下是原文出处博客
http://www.xcoder.cn/html/Database/mysql/2013/0520/7521.html