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同步過來,符合邏輯。

       還可以對某個數據庫的某張表進行控制,此處不再演示。

        

        



        

          

            

    

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章