一.概述 在mysql 5.5之前,mysql 的複製是非同步操作,主庫和從庫的數據之間存在一定的延時,這樣存在一個隱患:當主庫上寫入一個事務並提交成功,而從庫尚未得到主庫推送的Binlog日誌時,主庫down機了,事務Binlog丟失了,此時從庫就缺失了這個事務,從而造成主從不一致。 為瞭解決這個問 ...
一.概述
在mysql 5.5之前,mysql 的複製是非同步操作,主庫和從庫的數據之間存在一定的延時,這樣存在一個隱患:當主庫上寫入一個事務並提交成功,而從庫尚未得到主庫推送的Binlog日誌時,主庫down機了,事務Binlog丟失了,此時從庫就缺失了這個事務,從而造成主從不一致。
為瞭解決這個問題,mysql5.5 引入了半同步複製,在mysql 5.5之前的非同步複製時,主庫執行完Commit提交操作後,在主庫寫入Binlog日誌後即可成功返回客戶端,無需等待Binlog日誌傳送給從庫,非同步複製流程如下圖所示:
對於半同步複製,能保證主庫上的每一個Binlog事務都能被可靠的複製到從庫上,主庫在每次事務成功提交時,並不及時反饋給前端應用用戶,而是等待其中一個從庫也接收到Binlog事務併成功寫入中繼日誌後,主庫才返回Commit操作成功給客戶端。 半同步複製保證了事務成功提交後,至少有兩份日誌記錄,一份在主庫的Binlog日誌上,另一份在至少 一個從庫的中繼日誌relay log上,從而更進一步保證的主從數據的一致性。半同步複製流程如下圖所示:
在半同步複製模式下,假設步驟(1,2,3)的任何一個步驟中主庫宕機,則事務並沒有提交成功,從庫也沒收到事務binlog日誌,所以主從數據是一致的。假如步驟(4)傳送Binlog日誌到從庫時,從庫宕機或者網路故障,導致binlog並沒有及時傳送到從庫上,此時主庫上的事務會等待一段時間(由參數rp1_semi_sync_master_timeout毫秒決定), 如果binlog在這段時間內都無法成功推送到從庫上,則mysql自動調整複製為非同步複製模式。事務正常返回提交結果給客戶端。
二. 半同步(Semi-sync)複製配置步驟
下麵半同步複製的配置步驟是基於前面第二篇 "一主一從搭建(非同步複製)" 基礎之上。半同步模式作為mysql5.5的一個插件來實現的,主庫和從庫使用不同的插件,需要安裝
(1)判斷mysql伺服器是否支持動態增加插件
SELECT @@have_dynamic_loading
(2) 檢查mysql的安裝目錄下是否存在插件,主庫插件是semisync_master.so,從庫插件是semisync_slave.so。
-- 主庫插件位置: SHOW VARIABLES LIKE 'plugin_dir';
-- 從庫插件位置 SHOW VARIABLES LIKE 'plugin_dir';
--在主庫上安裝插件 semisync_master.so,安裝完從plugin表查看 INSTALL PLUGIN rpl_semi_sync_master SONAME 'semisync_master.so' SELECT * FROM mysql.`plugin`
--在從庫上安裝插件 semisync_slave.so ,安裝完從plugin表查看 INSTALL PLUGIN rpl_semi_sync_slave SONAME 'semisync_slave.so' SELECT * FROM mysql.`plugin`
(3) 需要分別在主庫和從庫上配置參數打開半同步semi-sync, 預設半同步設置是打不開的,主庫上配置全局參數。
-- 主庫上配置啟用。設置主庫傳送到從庫的Binlog日誌,最大超時時間。 SET GLOBAL rpl_semi_sync_master_enabled=1; SET GLOBAL rpl_semi_sync_master_timeout=3000; -- 從庫上 SET GLOBAL rpl_semi_sync_slave_enabled=1;
註意之前配置的複製是非同步複製,所以需要重啟一下從庫上的I/O線程。
-- 從庫停掉I/O 線程,再啟動 STOP SLAVE IO_THREAD; START SLAVE IO_THREAD;
(4) 同半步配置完畢後,下麵驗證一下
-- 主庫上查看當前半同步複製的一些狀態值 SHOW STATUS LIKE '%semi_sync%'
在上面的狀態信息中,重點先來瞭解3個狀態值:
Rpl_semi_sync_master_status: 值為ON, 代表半同步複製目前處於打開狀態。
Rpl_semi_sync_master_yes_tx: 值表示主庫當前有多少事務是通過半同步複製到從庫的。
Rpl_semi_sync_master_no_tx: 值表示當前事務不是半同步下從庫及時響應的(主從不同步時體現)。
-- 在主庫上執行一個事務,再檢查主庫複製狀態 UPDATE testbackup2 SET `name`='小李2' WHERE id=12
如上圖所示,此時Rpl_semi_sync_master_yes_tx的值計數增加1,在查從庫時剛修改的數據已同步。
三. 半同步複製參數信息說明
3.1 主庫上semi_sync狀態信息(SHOW STATUS LIKE '%semi_sync%')
狀態名稱 |
狀態值 |
描述 |
Rpl_semi_sync_master_clients |
1 |
有多少個Semi-sync(半同步)的從庫 |
Rpl_semi_sync_master_net_avg_wait_time |
0 |
事務提交後,等待slave響應的平均時間 |
Rpl_semi_sync_master_net_wait_time |
0 |
總的網路等待時間 (等待slave) |
Rpl_semi_sync_master_net_waits |
2 |
等待網路響應的總次數 (等待slave) |
Rpl_semi_sync_master_no_times |
0 |
一共有幾次從Semi-sync跌回普通狀態, 通俗叫:關閉半同步複製的次數 |
Rpl_semi_sync_master_no_tx |
0 |
slave未及時響應的事務數 |
Rpl_semi_sync_master_status |
ON |
主庫上Semi-sync是否正常開啟 |
Rpl_semi_sync_master_timefunc_failures |
0 |
時間函數未正常工作的次數 |
Rpl_semi_sync_master_tx_avg_wait_time |
1222 |
開啟Semi-sync,事務返回需要等待的平均時間 |
Rpl_semi_sync_master_tx_wait_time |
2445 |
事務等待備庫響應的總時間 |
Rpl_semi_sync_master_tx_waits |
2 |
事務等待備庫響應的總次數 |
Rpl_semi_sync_master_wait_pos_backtraverse |
0 |
改變當前等待最小二進位日誌的次數 |
Rpl_semi_sync_master_wait_sessions |
0 |
當前有幾個線程在等備庫響應 |
Rpl_semi_sync_master_yes_tx |
2 |
Semi-sync模式下,成功的事務數。也叫主庫成功接收到slave的回覆的次數。 |
3.2 主庫上semi_sync環境信息(SHOW VARIABLES LIKE '%semi%')
環境名稱 |
值 |
描述 |
rpl_semi_sync_master_enabled |
ON |
是否自動開啟半同步複製 |
rpl_semi_sync_master_timeout |
3000 |
主庫傳送到從庫的Binlog日誌,最大超時時間 |
rpl_semi_sync_master_trace_level |
32 |
用於開啟半同步複製模式時的調試級別,預設是32。 net wait level (more information about network waits) |
rpl_semi_sync_master_wait_for_slave_count |
1 |
至少有N個slave接收到日誌 |
rpl_semi_sync_master_wait_no_slave |
ON |
是否允許master 每個事物提交後都要等待slave的receipt信號。預設為on |
rpl_semi_sync_master_wait_point |
AFTER_SYNC |
控制 master 在哪個環節接收 slave ack,master 接收到 ack 後返回狀態給客戶端。 |
3.3 從庫上semi_sync環境信息(SHOW VARIABLES LIKE '%semi%';)
環境名稱 |
值 |
描述 |
rpl_semi_sync_slave_enabled |
ON |
從庫是否自動開啟半同步複製 |
rpl_semi_sync_slave_trace_level |
32 |
同上 |
3.4 從庫上semi_sync狀態信息(SHOW STATUS LIKE '%semi_sync%')
Rpl_semi_sync_slave_status |
ON |
從庫上Semi-sync是否正常開啟 |