mysql半同步復制的實現
mysql半同步復制和異步復制的差別如上述架構圖所示:在 mysql異步復制的情況下,Mysql Master Server將自己的Binary Log通過復制線程傳輸出去以后,Mysql Master Sever就自動返回數據給客戶端,而不管slave上是否接受到了這個二進制日志。在半同步復制的架構下,當master在將自己binlog發給 slave上的時候,要確保slave已經接受到了這個二進制日志以后,才會返回數據給客戶端。對比兩種架構:異步復制對于用戶來說,可以確保得到快速的響應結構,但是不能確保二進制日志確實到達了slave上;半同步復制對于客戶的請求響應稍微慢點,但是他可以保證二進制日志的完整性。
下面來配置一個半同步復制實現的主從架構:
192.168.1.141為mysql的主服務器
192.168.1.142為mysql的從服務器
1.為mysql主服務器提供配置
編輯/etc/my.cnf,提供以下的配置
log_bin=index
server_id=1
在主服務器上授權
mysql> grant replication slave,replication client on user@'192.168.1.142' identified by "123456";
mysql> flush privileges;
2.為mysql從服務提供配置
編輯/etc/my.cnf,提供以下的配置
server_id=10
relay_log=relay
read_only=on
skip-slave-start=1
進入mysql命令行接口
mysql > change master to MASTER_HOST="192.168.1.141",MASTER_USER="user",MASTER_PASSWORD="123456",MASTER_LOG_FILE="index.000004",MASTER_LOG_POS=429;
mysql > start slave;
如果能夠看到Slave_IO_Running: Yes和Slave_SQL_Running:Yes兩行信息的話,證明主從配置已經成功。
要使用mysql的半同步復制功能需要為mysql裝插件,mysql默認支持的插件在/usr/local/mysql/lib/plugin/,里面有兩個semisync_master.so和 semisync_slave.so的共享庫是我們實現mysql半同步復制的關鍵
3.設置半同步復制
在mysql主服務器的命令行接口下執行如下代碼:
mysql > install plugin rpl_semi_sync_master SONAME 'semisync_master.so';
mysql > show variables like "%semi%";(如果看到新增的semi變量的話證明安裝模塊成功)
| rpl_semi_sync_master_enabled | OFF | 是否啟動半同步復制,默認關閉
| rpl_semi_sync_master_timeout | 10000 | 等待從服務器告訴接受到的超時時間,如果時間到了,還沒接受到,自動降級為異步
| rpl_semi_sync_master_trace_level | 32 | 運行級別
| rpl_semi_sync_master_wait_no_slave | ON | 沒有slave的時候是否也需要等待,默認為也需要等待
mysql > set global rpl_semi_sync_master_enabled = 1;
mysql > set global rpl_semi_sync_master_timeout = 1000;
在mysql從服務器的命令行接口下執行如下代碼:
mysql > install plugin rpl_semi_sync_slave SONAME 'semisync_slave.so';
mysql > show variables like "%semi%";(如果看到新增的semi變量的話證明安裝模塊成功)
mysql > set global rpl_semi_sync_slave_enabled = 1;
stop slave;
start slave;
最后把常用的配置參數寫如配置文件中:
192.168.1.141:
[mysqld]
rpl_semi_sync_master_enabled=1
rpl_semi_sync_master_timeout=1000
192.168.1.142:
[mysqld]
rpl_semi_sync_slave_enabled=1
4.查看半同步復制的狀況信息
在192.168.1.141執行如下命令:
mysql> show status like "%semi%";
+-------------------------------------------------------------------+----------+
| Variable_name | Value |
+-------------------------------------------------------------------+----------+
| Rpl_semi_sync_master_clients | 1 | 半同步復制客戶端的個數
| Rpl_semi_sync_master_net_avg_wait_time | 555 | 平均等待時間(默認毫秒)
| Rpl_semi_sync_master_net_wait_time | 1665 | 總共等待時間
| Rpl_semi_sync_master_net_waits | 3 | 等待次數
| Rpl_semi_sync_master_no_times | 0 | 關閉半同步復制的次數
| Rpl_semi_sync_master_no_tx | 0 | 表示沒有成功接收slave提交的次數
| Rpl_semi_sync_master_status | ON | 表示當前是異步模式還是半同步模式,on為半同步
| Rpl_semi_sync_master_timefunc_failures | 0 | 調用時間函數失敗的次數
| Rpl_semi_sync_master_tx_avg_wait_time | 575 | 事物的平均傳輸時間
| Rpl_semi_sync_master_tx_wait_time | 1725 | 事物的總共傳輸時間
| Rpl_semi_sync_master_tx_waits | 3 | 事物等待次數
| Rpl_semi_sync_master_wait_pos_backtraverse | 0 |
| Rpl_semi_sync_master_wait_sessions | 0 | 當前有多少個session因為slave的回復而造成等待
| Rpl_semi_sync_master_yes_tx | 3 | 成功接受到slave事物回復的次數
+-------------------------------------------------------------------+---------+
5.取消半同步復制的插件
192.168.1.141上:
mysql > uninstall plugin rpl_semi_sync_master;
mysql > show status like "%semi%"
192.168.1.142上: