在mysql主从架构中,默认采用的是异步模式,也就是在master中将数据保存在数据库,再将操作写到bin-log中即响应给客户端。至于slave是否同步了二进制文件,是否完成了本地操作,master无从得知。异步模式固然能以最快的速度响应给客户端,减少用户的等待时间,但在一些数据同步、安全性较高的场景,要求slave中的数据要尽最大能力与master保持一致,那么半同步模式就可以用上了。
mysql的半同步模式是以插件的方式由google提供的。主要文件在${mysql_home}/lib/plugin下。文件主要有两个semisync_master.so和semisync_slave.so。由名字可以看出semisync_master.so主要master提供的插件,semisync_slave.so主要为slave提供的插件。下面来实现mysql的半同步模式。
1、环境准备
os:centos 6.4
mysql-version:5.5.28
slave:192.168.1.108
master:192.168.1.101
2、mysql主从安装
参考:http://crazytechnology.blog.51cto.com/6906973/1640197
3、安装semisync_master.so和semisync_slave.so
在master中:
mysql> install plugin rpl_semi_sync_master soname 'semisync_master.so';
查看是否已经安装
mysql> show global variables like '%rpl%';
rpl_semi_sync_master_enbled:是否允许半同步
rpl_semi_sync_master_timeout:等待slave的超时时间
rpl_semi_sync_master_trace_level:追踪级别
rpl_semi_sync_master_wait_no_slave:如果没有slave,是否等待
启动半同步模式
set global rpl_semi_sync_master_enbled = 1;
#如果在永久有效,请将其配置在my.cnf配置文件中
[mysqld]
rpl_semi_sync_master_enbled=1
rpl_semi_sync_master_timeout=1000#设置超时时间为1s
在slave中:
install plugin rpl_semi_sync_slave soname 'semisync_slave.so';
启动半同步模式
set global rpl_semi_sync_slave_enbled = 1;
#如果在永久有效,请将其配置在my.cnf配置文件中
要重启slave的io_thread才会生效
stop slave io_thread;
start slave io_thread;
在master中查看
mysql> show global status like '%rpl%';
可以看到Rpl_semi_sync_master_Clients的值为1,说明已经有一个salve连上来了。
4、测试
在master中
mysql> user leedb;
mysql> create table leetest (id int ,name varchar(16));
可以看到执行sql语句的时间要稍微长一些,主要是由于要等待io_thread将二进制日志同步。
在slave中将io_thread停掉
mysql> stop slave io_thread;
再在master中执行
mysql> create table leetest2 (id int ,name varchar(16));
可以看到此时master处于block状态
等待10s后即完成操作,这10s就是上面设置的超时时间。
有一点要注意的是此时由于slave io_thread停止运行,mysql会自动将半同步模式设置为异步
模式。此时再执行其它建表语句,就会很快了。
mysql的slave-master同样支持数据库、表同步过滤功能。过滤可以在master中设置,也可以slave中进行,但建议是在slave中。因为如果在master中进行库,表过滤的话,那么bin log日志文件就会不完整,在极端情况下部分数据就无法通过bin log进行即时点恢复。
数据库、表过滤主要是通过在slave主要有以下几个设置
relicate-do-db:数据库同步的白名单
replicate-ignore-db:数据库同步的黑名单
replicate-do-table:表同步的白名单
replicate-ignore-table:表同步的黑名单
replicate-wild-do-table:表的白名单(可支持统配符)
replicate-wild-ignore-table:表的黑名单(可支持统配符)
1、在slave的/etc/my.cnf中配置
[msyqld]
relicate-do-db=syncdb
replicate-ignore-db=ignoredb
保存退场,然后重启mysqld进程。
2、在master中创建两个数据库
mysql> create database syncdb;
mysql> create database ignoredb;
在slave中查看:
由此可看到,ingoredb没有被slave同步过来,符合逻辑。
还可以对某个数据库的某张表进行控制,此处不再演示。