mysql repilcation troubleshooting基礎知識點

myownstars發表於2013-04-08

所需程式

Master上需要dumpslave需要IOSQL執行緒;

Dump讀取master  binlog併傳送給slave,每個slave對應1個;

Slave端的IO讀取master傳來的內容並寫入relay logsql執行緒讀取relay log並解析成sql應用於slave

 

連線引數

Slave-net-timeout

如超過此時間無相應則slave認定連線超時 ,預設3600s

Master-connect-retry

兩次重連間隔時間,預設60s

Master-retry-count

重連次數 ,預設86400

 

為何引入relay log?

類似oraclestandby redoMysql  replication採用的是非同步機制,slaveevent暫時儲存relay log,而master 無需等待slave同步執行完就可以傳送下一個event

 

何時切換

Master binlog切換一次relay log就隨著切換一次;

IO執行緒重啟;

Flush logs

達到max_relay_log_size限制,如果此值為0,則以max_binlog_size為準;

 

relay-log.info && master-log.info

中繼日誌透過這兩個檔案來跟蹤複製進度;

Master-log.info記錄連線master的資訊(host/user/password/port)以及master log的讀取位置read_master_log_pos

Slave IO啟動時會讀取該檔案內容;

Relay-log.info則由slave sql執行緒維護,包含relay log的基本資訊以及執行位置exec_master_log_pos,由此決定下一個要執行的事件;

這兩個檔案由relay-log-info-file/master-info-file指定,預設名如上;

只有執行start slave,這兩個檔案才會被建立,此後的每次slave重啟,都會從這兩個檔案獲取複製/執行進度;

 

如果relay log丟失但是relay-log.info還在,便可以檢視當前sql執行緒的進度,透過change master toslavemaster重新讀取相應bin log

 

Show salve status

Read_master_log_posI/O程式讀取到masterbinary log的位置

Exec_master_log_possql程式執行到的master binary log位置,如果有延遲則會落後於read_master_log_pos

Seconds_behind_master:即使此引數為0,也不一定意味著slave已經同步,比如主備之間的網路斷開但IO執行緒還未察覺,即slave_net_timeout尚未計時;

 

透過比較read_master_log_posexec_master_log_pos,可以確認是否有事件等待執行;

 

 

Slave上與複製有關的執行緒包括I/O threadsql thread

I/O執行緒錯誤

引數log_warnings=1(預設)會記錄I/O執行緒的錯誤

有幾種常見可能

1

主庫上的user沒有replication slave許可權

2

網路無法連線

使用ping命令檢視OS是否正常;

telnet master_host port檢視mysql是否啟動;

遠端連線mastermysql h host p port  -uUser p檢驗密碼是否正確,成功後查詢select user(), current_user()--避免proxy user或使用其他使用者連線,再執行show grants驗證許可權;

3

頻繁斷線

使用tcpdump/netstat檢查網路

Netstat a| grep port應該能顯示與master建立的連線

Tcpdump I en1 host mast_host port 3306

 

如果lag太大,使用tcpdump或透過複製大檔案的方式檢驗網路

Sql thread只有一個,當master負載繁忙時可能會導致複製延時,當排除以上可能後,只能升級硬體或調優引數,要麼就使用多執行緒sql

 

有時sql 執行緒可能會抱錯delay log corrupted,大部分時候是IO執行緒操作引起的,也有可能masterbinlog

此時應使用mysqlbinlog檢查master binlogdelay log,如果前者出錯,手工應用slavestart slave until ,然後檢查主備庫上的表checksum table test

 

 

SQL執行緒錯誤

最常見的是master/slave表結構不一致

如果show slave status顯示的sql文字不全,則需使用mysqlbinlog檢視masterbinlogslave relaylog

 

Mk-heartbeat

可用於監控replication延遲

首先在master上建立一個名為heartbeat的表,結構如下

CREATE TABLE heartbeat (

    ts                    varchar(26) NOT NULL,

    server_id             int unsigned NOT NULL PRIMARY KEY,

    file                  varchar(255) DEFAULT NULL,    -- SHOW MASTER STATUS

    position              bigint unsigned DEFAULT NULL, -- SHOW MASTER STATUS

    relay_master_log_file varchar(255) DEFAULT NULL,    -- SHOW SLAVE STATUS

    exec_master_log_pos   bigint unsigned DEFAULT NULL  -- SHOW SLAVE STATUS

  );

然後再slave端開啟監控

假定某級聯複製master -> slave1 -> slave2

 

mk-heartbeat --daemonize -D test --update -h master

mk-heartbeat --daemonize -D test --update -h slave1

監控masterslave2的延遲

mk-heartbeat -D test --master-server-id 1 --check slave2

監控 slave1slave2的延遲

mk-heartbeat -D test --master-server-id 2 --check slave2

 

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/15480802/viewspace-757959/,如需轉載,請註明出處,否則將追究法律責任。

相關文章