1. 程式人生 > >半同步複製,從庫的日常管理和錯誤處理

半同步複製,從庫的日常管理和錯誤處理

推薦的清理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