半同步複製,從庫的日常管理和錯誤處理
推薦的清理purge的方法:
>purge binary logs to 'mybin.log000001';
半同步複製
主庫產生binlog到主庫的binlog file,傳到從庫中繼日誌,然後從庫應用。
即:傳輸是非同步的,應用也是非同步的。
半同步複製指的是傳輸同步,應用還是非同步的。
- 好處:保證資料不丟失(本機和遠端都有binlog)
- 壞處:不能保證應用的同步。
半同步複製的原理:
(半同步複製的流程:)
(即 主庫忽然崩了時,從庫雖然說有延遲,但是延遲過後,可以把從庫提升為主庫繼續服務,事後恢復到主庫即可)
(MySQL的非同步複製流程:)
如何實現半同步複製?
半同步複製是一個功能模組,庫要能支援動態載入才能實現半同步複製!
- ①看庫是否支援動態載入(現在一般都支援)
> select @@have_dynamic_loading;
- ②主從庫上分別安裝外掛
在主庫上安裝外掛 semisync_master.so
> install plugin rpl_semi_sync_master soname 'semisync_master.so';
在從庫上安裝 semisync_slave.so
> install plugin rpl_semi_sync_slave soname 'semisync_slave.so' ;
- ③安裝完成後,從plugin表中能夠看到剛才安裝的外掛
select * from mysql.plugin;
- ④分別在主從庫開啟半同步複製(可加到配置檔案裡)
> set @@global.rpl_semi_sync_master_enabled=on;
> set @@global.rpl_semi_sync_slave_enabled=on;
當一主多從
- ⑤重啟一下從庫的IO
> start slave io_thread;
> start slave io_thread;
(stop slave; -->IO和應用執行緒)
- ⑥檢視半同步狀態
> show global status like '%rpl%';
(圖是主庫在壓測的時候的狀態)
Rpl_semi_sync_master_clients
Rpl_semi_sync_master_net_avg_wait_time:網路等待的平均時間
Rpl_semi_sync_master_net_wait_time:網路等待時間
Rpl_semi_sync_master_net_waits
Rpl_semi_sync_master_no_times
Rpl_semi_sync_master_no_tx:大於0就是非同步。半同步是應為0
Rpl_semi_sync_master_status
Rpl_semi_sync_master_timefunc_failures
Rpl_semi_sync_master_tx_avg_wait_time:平均等待時間
Rpl_semi_sync_master_tx_wait_time:總的等待時間
Rpl_semi_sync_master_tx_waits
Rpl_semi_sync_master_wait_pos_backtraverse
Rpl_semi_sync_master_wait_sessions
Rpl_semi_sync_master_yes_tx:大於0就是 同步模式
開啟半同步複製意味著什麼?
在主庫開啟一個事務,這個事務在主庫和遠端的從庫各存一份。此時 Rpl_semi_sync_master_yes_tx 的值加一。忽然斷網時,會有10s的hang住(rpl_semi_sync_master_timeout =10000),然後mysql會自己關閉主從複製。然後變成非同步。此時Rpl_semi_sync_master_yes_tx 值不變了,而Rpl_semi_sync_master_no_tx 的值就開始加一。
- ⑦模擬斷網時的狀態
# iptables -A INPUT -s IP -j DROP
-A:處理INPUT
-s:源地址
-j:處理的策略是DROP
會發現,壓測的trx忽然降低,但不會降低為0。因為此時變成了非同步。但是一會兒之後,mysql會自動恢復到同步。
從庫的日常管理和錯誤處理
- 1、master_connect_retry 引數
mysql> change master to
master_host='192.168.159.131',
master_user='congku',
master_password='123123',
master_log_file='mastera.000028',
master_log_pos=245,
master_connect_retry=10;
#連線主庫失敗時,每隔10s鍾就重新連一下
- 2、log_slave_updates引數
用來配置一級從庫是否寫二進位制日誌。此引數要和–logs-bin 引數一起使用。
- 3、–read-only 引數
用來設定從庫只能接受root的更新操作,限制了應用程式錯誤的對從庫的更新操作。使用後,保證了主從的一致性,從庫的更新就只能來自於主庫的更新了。可在從庫啟動時啟動,也可以加到配置檔案。
# mysqld_safe --defaults-file=/etc/my.cnf --user=root --read-only
- 4、–replicate-do-table 引數
從庫啟動時新增。實現了從庫的分拆,將從庫分拆成多個不一致的從庫,分別同步不同的庫或表。
(例如,讓四個從庫來同步一個主庫,這樣應用延遲就會降低。
主庫的日誌會分4個完整的,傳給4個從庫。然後從庫都接到後,再看是對誰做的操作,例如是對促銷的相關操作。就只有對應的2號從庫更新。)
事務層面:主庫的事務不能跨組操作,只能操作某個組裡面的2個!
此引數使用的限制:
- 5、slave-skip-errors 引數
在複製過程中,從庫可能由於各種原因遇到執行binlog中的SQL出錯的情況(比如主鍵衝突),預設情況從庫將會停止複製程序,等待使用者處理,不再進行同步(hang住)。
此引數的作用就是用來定義複製過程中從庫可以自動跳過的錯誤號。
取值:ddl_exist_errors(具體錯誤號)、all
用法:
#mysqld_safe --slave-skip-errors=1064 --defaults-file=/etc/my.cnf &
PS:1064錯誤,是常見的sql語法不對時出現的錯誤。
從庫如何處理sql應用出現的錯誤?
- ①slave-skip-errors 為all
時,忽略所有錯誤。為ddl_exist_errors(具體錯誤號)時,跳過這一個錯誤。(自動) - ②set global sql_slave_skip_counter=n:n的值為1或2。如果來自主庫的更新語句不使用auto_increment 或 last_insert_id(),n值應為1,否則為2。(手工)然後重啟stop slave;start slave;
上面的這一個sql,會生成2條日誌,如果想在同步時跳過這條sql,n=2即可。
怎麼監控:> show slave status \G #看讀和執行的pos是不是在快速的縮短。
- 6、log event entry exceeded max_allowed_packet 的處理
如果應用中使用大的blog列或者長字串,那麼在從庫上進行恢復的時候,可能會出現”log event entry exceeded max_allowed_packet”錯誤,這是因為含有大文字的記錄無法通過網路進行傳輸導致。解決的辦法就是在主從庫上增加 max_allowed_packet 引數的大小。預設值1MB。可按實際需要修改。
#set global max_allowed_packet =16MB;
Create By LPeng