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

        在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%';

            wKioL1VAVGmjcuNEAAESmxEcZG8419.jpg


        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%';

            wKiom1VAVQ-iloSNAAIevrly8sQ590.jpg


            可以看到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状态

            wKioL1VAWKLD3l_3AABhyjvb6mM777.jpg

            等待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;

            wKiom1VAXcvRlPDJAABqwxzb6yQ416.jpg

            在slave中查看:

            wKioL1VAX02xVeZYAACGZ0Hnu7M821.jpg


           由此可看到,ingoredb没有被slave同步过来,符合逻辑。

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

        

        



        

          

            

    

你可能感兴趣的:(mysql,主从复制,半同步)