在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同步過來,符合邏輯。
還可以對某個數據庫的某張表進行控制,此處不再演示。