您的位置:首页 > 数据库 > MySQL

mysql 主从半同步模式和数据库同步过滤

2015-04-29 12:33 369 查看
在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主从安装

参考:/article/7444988.html

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同步过来,符合逻辑。

还可以对某个数据库的某张表进行控制,此处不再演示。

本文出自 “向天飞” 博客,请务必保留此出处http://crazytechnology.blog.51cto.com/6906973/1640253
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: