沃趣科技 彭許生
創(chuàng)新互聯(lián)是一家專業(yè)提供甘南企業(yè)網(wǎng)站建設(shè),專注與成都網(wǎng)站設(shè)計(jì)、網(wǎng)站建設(shè)、外貿(mào)網(wǎng)站建設(shè)、H5頁面制作、小程序制作等業(yè)務(wù)。10年已為甘南眾多企業(yè)、政府機(jī)構(gòu)等服務(wù)。創(chuàng)新互聯(lián)專業(yè)的建站公司優(yōu)惠進(jìn)行中。
前段時間支持客戶處理問題的時候,發(fā)現(xiàn)一個semi-sync復(fù)制主從切換原master加入集群時,復(fù)制同步阻塞,無法繼續(xù)同步數(shù)據(jù)的問題,非常有參考意義,整理一下,供大家參考。
客戶在一個一主兩從的半同步復(fù)制環(huán)境下做了手工切換,然后嘗試把原主庫加入集群中,結(jié)果發(fā)現(xiàn)新集群中的數(shù)據(jù)一直無法同步到slave(原主庫)中來,查看slave(原主庫)同步狀態(tài),IO線程和SQL線程都是YES狀態(tài),但是Seconds_Behind_Master大于0.
- MySQL> show slave status\G
- ***************************1. row***************************
- Slave_IO_State:Waitingfor master to sendevent
- ..............................................
- Master_Log_File: mysql-bin.000007
- Read_Master_Log_Pos:540
- Relay_Log_File: mysql-relay-bin.000006
- Relay_Log_Pos:367
- Relay_Master_Log_File: mysql-bin.000007
- ..............................................
- Slave_SQL_Running_State:Waitingfor semi-sync ACKfrom slave
- 1 rowinset(0.00 sec)
查看show processlist狀態(tài), 發(fā)現(xiàn)SQL線程一直處于Waiting for semi-sync ACK from slave狀態(tài),可是這個slave(原主庫)下已經(jīng)沒有從庫了。為什么還需要等待slave返回的ACK呢?
- mysql> show processlist;
- +----+-------------+-----------+------+---------+------+--------------------------------------+------------------+
- |Id|User|Host| db|Command|Time|State|Info|
- +----+-------------+-----------+------+---------+------+--------------------------------------+------------------+
- |1| system user|| NULL|Connect|540|| NULL|
- |2| system user|| NULL|Connect|2191|Waitingfor master to sendevent| NULL|
- |4| root| localhost| test|Query|0| starting| show processlist|
- +----+-------------+-----------+------+---------+------+--------------------------------------+------------------+
- 3 rowsinset(0.00 sec)
從SQL線程等待的的半同步問題出發(fā),先查看semi-sync狀態(tài)和設(shè)置
- mysql> showglobal status like'rpl_semi_sync%';
- +--------------------------------------------+-------+
- |Variable_name|Value|
- +--------------------------------------------+-------+
- |Rpl_semi_sync_master_clients|0|
- |Rpl_semi_sync_master_net_avg_wait_time|0|
- |Rpl_semi_sync_master_net_wait_time|0|
- |Rpl_semi_sync_master_net_waits|0|
- |Rpl_semi_sync_master_no_times|0|
- |Rpl_semi_sync_master_no_tx|0|
- |
- |Rpl_semi_sync_master_timefunc_failures|0|
- |Rpl_semi_sync_master_tx_avg_wait_time|0|
- |Rpl_semi_sync_master_tx_wait_time|0|
- |Rpl_semi_sync_master_tx_waits|0|
- |Rpl_semi_sync_master_wait_pos_backtraverse|0|
- |Rpl_semi_sync_master_wait_sessions|0|
- |Rpl_semi_sync_master_yes_tx|0|
- |
- +--------------------------------------------+-------+
- 15 rowsinset(0.00 sec)
通過上面semi-sync的狀態(tài)變量,可以發(fā)現(xiàn)semi-sync運(yùn)行狀態(tài)Rpl_semi_sync_master_status=ON、Rpl_semi_sync_slave_status=ON。這里最奇怪的是Rpl_semi_sync_master_status=ON。
根據(jù)半同步復(fù)制原理:主庫發(fā)生數(shù)據(jù)變更寫binlog,然后等待從庫接收并返回ACK,最后在存儲引擎層提交數(shù)據(jù)。這也就是為什么在從庫(原主庫)一直查不到新主庫變更后的數(shù)據(jù)原因。在默認(rèn)情況下,半同步復(fù)制只有在等待ACK超出 rpl_semi_sync_master_timeout設(shè)置的時間才會自動降為異步復(fù)制。
這里slave(原主庫)被認(rèn)為是半同步的master,但是沒有從庫連接他,所以一直在等待從庫返回的ACK。等待的時間我們查看rpl_semi_sync_master_timeout變量取值
- mysql> showglobal variables like'rpl_semi_sync%';
- +-------------------------------------------+------------+
- |Variable_name|Value|
- +-------------------------------------------+------------+
- |
- |
- | rpl_semi_sync_master_trace_level|32|
- | rpl_semi_sync_master_wait_for_slave_count|1|
- | rpl_semi_sync_master_wait_no_slave| ON|
- | rpl_semi_sync_master_wait_point| AFTER_SYNC|
- | | rpl_semi_sync_slave_trace_level|32|
- +-------------------------------------------+------------+
- 8 rowsinset(0.00 sec)
查看semi-sync參數(shù)發(fā)現(xiàn)從庫同時開啟了rpl_semi_sync_master_enabled=ON、rpl_semi_sync_slave_enabled=ON和rpl_semi_sync_master_timeout=10000000(1萬秒,默認(rèn)10秒)。
客戶竟然把rpl_semi_sync_master_timeout設(shè)置為10萬秒,也就是說,原主庫要等待10萬秒才能自動變?yōu)楫惒讲⒓尤爰褐型綌?shù)據(jù),slave(原主庫)無法從集群中繼續(xù)同步數(shù)據(jù)的根本原因就在這里。
跟客戶溝通后,客戶之所以將rpl_semi_sync_master_timeout設(shè)置這么大的值,是強(qiáng)調(diào)數(shù)據(jù)強(qiáng)一致性,不希望在任何情況下半同步復(fù)制結(jié)構(gòu)降為異步復(fù)制,最大限度保證數(shù)據(jù)一致性。
前面涉及到幾個sc 復(fù)制參數(shù),可能有些同學(xué)不太了解,下面給大家簡單講解一下MySQL semi-sync 復(fù)制安裝配置和原理。
在MySQL 5.7版本里如果要開啟半同步復(fù)制,需要在master端安裝semisync_master.so庫并配置my.cnf
- mysql> INSTALL PLUGIN rpl_semi_sync_master SONAME'semisync_master.so';
- mysql>setglobal rpl_semi_sync_master_enabled=ON;
在slave端安裝semisync_slave.so庫并配置my.cnf
- mysql> INSTALL PLUGIN rpl_semi_sync_slave SONAME'semisync_slave.so';
- mysql>setglobal rpl_semi_sync_slave_enabled=ON;
- mysql> showglobal status like'rpl_semi_sync_master_status';
- +-----------------------------+-------+
- |Variable_name|Value|
- +-----------------------------+-------+
- |Rpl_semi_sync_master_status| ON|
- +-----------------------------+-------+
- mysql> showglobal status like'rpl_semi_sync_slave_status';
- +-----------------------------+-------+
- |Variable_name|Value|
- +-----------------------------+-------+
- |Rpl_semi_sync_slave_status| ON|
- +-----------------------------+-------+
進(jìn)入半同步復(fù)制,客戶端在master每提交一個事務(wù),master MySQL將對應(yīng)事務(wù)寫入binlog,然后等待slave返回的ACK,之后在存儲引擎層提交,最后返回給客戶端寫入成功的消息。
如果slave沒有返回,master將等待指定超時時間;超過超時時間后,會自動降為異步復(fù)制模式。
上述master等待行為都發(fā)生在rpl_semi_sync_master_wait_no_slave=ON(默認(rèn)值)情況下。如果rpl_semi_sync_master_wait_no_slave設(shè)置為OFF時,連接master的slave的數(shù)量少于rpl_semi_sync_master_wait_for_slave_count設(shè)置的值,master不會等待超時,立刻自動降為異步復(fù)制模式。
如果把rpl_semi_sync_master_timeout設(shè)置非常大,在主從切換時導(dǎo)致原主庫加入集群時同步阻塞,建議把rpl_semi_sync_master_wait_no_slave=OFF。
文章題目:semi-sync原主庫加入集群阻塞問題分析
網(wǎng)頁URL:http://chinadenli.net/article10/gioego.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供建站公司、網(wǎng)站維護(hù)、云服務(wù)器、企業(yè)網(wǎng)站制作、網(wǎng)站設(shè)計(jì)公司、響應(yīng)式網(wǎng)站
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會在第一時間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時需注明來源: 創(chuàng)新互聯(lián)