真实的国产乱ⅩXXX66竹夫人,五月香六月婷婷激情综合,亚洲日本VA一区二区三区,亚洲精品一区二区三区麻豆

成都創(chuàng)新互聯(lián)網(wǎng)站制作重慶分公司

semi-sync原主庫(kù)加入集群阻塞問(wèn)題分析-創(chuàng)新互聯(lián)

沃趣科技  彭許生


創(chuàng)新互聯(lián)建站 - 服務(wù)器托管德陽(yáng),四川服務(wù)器租用,成都服務(wù)器租用,四川網(wǎng)通托管,綿陽(yáng)服務(wù)器托管,德陽(yáng)服務(wù)器托管,遂寧服務(wù)器托管,綿陽(yáng)服務(wù)器托管,四川云主機(jī),成都云主機(jī),西南云主機(jī),服務(wù)器托管德陽(yáng),西南服務(wù)器托管,四川/成都大帶寬,服務(wù)器機(jī)柜,四川老牌IDC服務(wù)商

前段時(shí)間支持客戶處理問(wèn)題的時(shí)候,發(fā)現(xiàn)一個(gè)semi-sync復(fù)制主從切換原master加入集群時(shí),復(fù)制同步阻塞,無(wú)法繼續(xù)同步數(shù)據(jù)的問(wèn)題,非常有參考意義,整理一下,供大家參考。

問(wèn)題現(xiàn)象

客戶在一個(gè)一主兩從的半同步復(fù)制環(huán)境下做了手工切換,然后嘗試把原主庫(kù)加入集群中,結(jié)果發(fā)現(xiàn)新集群中的數(shù)據(jù)一直無(wú)法同步到slave(原主庫(kù))中來(lái),查看slave(原主庫(kù))同步狀態(tài),IO線程和SQL線程都是YES狀態(tài),但是Seconds_Behind_Master大于0.

  1. mysql> show slave status\G
  2. *************************** 1. row ***************************
  3. Slave_IO_State: Waiting for master to send event
  4. ..............................................
  5. Master_Log_File: mysql-bin.000007
  6. Read_Master_Log_Pos: 540
  7. Relay_Log_File: mysql-relay-bin.000006
  8. Relay_Log_Pos: 367
  9. Relay_Master_Log_File: mysql-bin.000007
  10. ..............................................
  11. Slave_SQL_Running_State: Waiting for semi-sync ACK from slave
  12. 1 row in set (0.00 sec)

查看show processlist狀態(tài), 發(fā)現(xiàn)SQL線程一直處于Waiting for semi-sync ACK from slave狀態(tài),可是這個(gè)slave(原主庫(kù))下已經(jīng)沒(méi)有從庫(kù)了。為什么還需要等待slave返回的ACK呢?

  1. mysql> show processlist;
  2. +----+-------------+-----------+------+---------+------+--------------------------------------+------------------+
  3. | Id | User | Host | db | Command | Time | State | Info |
  4. +----+-------------+-----------+------+---------+------+--------------------------------------+------------------+
  5. | 1 | system user | | NULL | Connect | 540 | | NULL |
  6. | 2 | system user | | NULL | Connect | 2191 | Waiting for master to send event | NULL |
  7. | 4 | root | localhost | test | Query | 0 | starting | show processlist |
  8. +----+-------------+-----------+------+---------+------+--------------------------------------+------------------+
  9. 3 rows in set (0.00 sec)
問(wèn)題分析

從SQL線程等待的的半同步問(wèn)題出發(fā),先查看semi-sync狀態(tài)和設(shè)置

  1. mysql> show global status like 'rpl_semi_sync%';
  2. +--------------------------------------------+-------+
  3. | Variable_name | Value |
  4. +--------------------------------------------+-------+
  5. | Rpl_semi_sync_master_clients | 0 |
  6. | Rpl_semi_sync_master_net_avg_wait_time | 0 |
  7. | Rpl_semi_sync_master_net_wait_time | 0 |
  8. | Rpl_semi_sync_master_net_waits | 0 |
  9. | Rpl_semi_sync_master_no_times | 0 |
  10. | Rpl_semi_sync_master_no_tx | 0 |
  11. |
  12. | Rpl_semi_sync_master_timefunc_failures | 0 |
  13. | Rpl_semi_sync_master_tx_avg_wait_time | 0 |
  14. | Rpl_semi_sync_master_tx_wait_time | 0 |
  15. | Rpl_semi_sync_master_tx_waits | 0 |
  16. | Rpl_semi_sync_master_wait_pos_backtraverse | 0 |
  17. | Rpl_semi_sync_master_wait_sessions | 0 |
  18. | Rpl_semi_sync_master_yes_tx | 0 |
  19. |
  20. +--------------------------------------------+-------+
  21. 15 rows in set (0.00 sec)

通過(guò)上面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ù)制原理:主庫(kù)發(fā)生數(shù)據(jù)變更寫binlog,然后等待從庫(kù)接收并返回ACK,最后在存儲(chǔ)引擎層提交數(shù)據(jù)。這也就是為什么在從庫(kù)(原主庫(kù))一直查不到新主庫(kù)變更后的數(shù)據(jù)原因。在默認(rèn)情況下,半同步復(fù)制只有在等待ACK超出 rpl_semi_sync_master_timeout設(shè)置的時(shí)間才會(huì)自動(dòng)降為異步復(fù)制。

這里slave(原主庫(kù))被認(rèn)為是半同步的master,但是沒(méi)有從庫(kù)連接他,所以一直在等待從庫(kù)返回的ACK。等待的時(shí)間我們查看rpl_semi_sync_master_timeout變量取值

  1. mysql> show global variables like 'rpl_semi_sync%';
  2. +-------------------------------------------+------------+
  3. | Variable_name | Value |
  4. +-------------------------------------------+------------+
  5. |
  6. |
  7. | rpl_semi_sync_master_trace_level | 32 |
  8. | rpl_semi_sync_master_wait_for_slave_count | 1 |
  9. | rpl_semi_sync_master_wait_no_slave | ON |
  10. | rpl_semi_sync_master_wait_point | AFTER_SYNC |
  11. | | rpl_semi_sync_slave_trace_level | 32 |
  12. +-------------------------------------------+------------+
  13. 8 rows in set (0.00 sec)

查看semi-sync參數(shù)發(fā)現(xiàn)從庫(kù)同時(shí)開(kāi)啟了rpl_semi_sync_master_enabled=ON、rpl_semi_sync_slave_enabled=ON和rpl_semi_sync_master_timeout=10000000(1萬(wàn)秒,默認(rèn)10秒)。

客戶竟然把rpl_semi_sync_master_timeout設(shè)置為10萬(wàn)秒,也就是說(shuō),原主庫(kù)要等待10萬(wàn)秒才能自動(dòng)變?yōu)楫惒讲⒓尤爰褐型綌?shù)據(jù),slave(原主庫(kù))無(wú)法從集群中繼續(xù)同步數(shù)據(jù)的根本原因就在這里。

跟客戶溝通后,客戶之所以將rpl_semi_sync_master_timeout設(shè)置這么大的值,是強(qiáng)調(diào)數(shù)據(jù)強(qiáng)一致性,不希望在任何情況下半同步復(fù)制結(jié)構(gòu)降為異步復(fù)制,大限度保證數(shù)據(jù)一致性。

原理分析

前面涉及到幾個(gè)sc 復(fù)制參數(shù),可能有些同學(xué)不太了解,下面給大家簡(jiǎn)單講解一下MySQL semi-sync 復(fù)制安裝配置和原理。
在MySQL 5.7版本里如果要開(kāi)啟半同步復(fù)制,需要在master端安裝semisync_master.so庫(kù)并配置my.cnf

  1. mysql> INSTALL PLUGIN rpl_semi_sync_master SONAME 'semisync_master.so';
  2. mysql> set global rpl_semi_sync_master_enabled=ON;

在slave端安裝semisync_slave.so庫(kù)并配置my.cnf

  1. mysql> INSTALL PLUGIN rpl_semi_sync_slave SONAME 'semisync_slave.so';
  2. mysql> set global rpl_semi_sync_slave_enabled=ON;
  • 在master端看到Rpl_semi_sync_master_status狀態(tài)變量顯示ON狀態(tài),就表示master進(jìn)入半同步復(fù)制模式。
  1. mysql> show global status like 'rpl_semi_sync_master_status';
  2. +-----------------------------+-------+
  3. | Variable_name | Value |
  4. +-----------------------------+-------+
  5. | Rpl_semi_sync_master_status | ON |
  6. +-----------------------------+-------+
  • 此時(shí),在slave端會(huì)看到Rpl_semi_sync_slave_status顯示ON狀態(tài),也就表示slave進(jìn)入半同步復(fù)制模式。
  1. mysql> show global status like 'rpl_semi_sync_slave_status';
  2. +-----------------------------+-------+
  3. | Variable_name | Value |
  4. +-----------------------------+-------+
  5. | Rpl_semi_sync_slave_status | ON |
  6. +-----------------------------+-------+

進(jìn)入半同步復(fù)制,客戶端在master每提交一個(gè)事務(wù),master MySQL將對(duì)應(yīng)事務(wù)寫入binlog,然后等待slave返回的ACK,之后在存儲(chǔ)引擎層提交,最后返回給客戶端寫入成功的消息。
如果slave沒(méi)有返回,master將等待指定超時(shí)時(shí)間;超過(guò)超時(shí)時(shí)間后,會(huì)自動(dòng)降為異步復(fù)制模式。
semi-sync原主庫(kù)加入集群阻塞問(wèn)題分析

  • 如果master在超時(shí)時(shí)間內(nèi)(rpl_semi_sync_master_timeout超時(shí)時(shí)間,默認(rèn)10000毫秒)沒(méi)有收到指定數(shù)量(rpl_semi_sync_master_wait_for_slave_count接收slave返回ACK數(shù)量,默認(rèn)1)的slave的ACK回包,master自動(dòng)降為異步復(fù)制模式。
  • 當(dāng)半同步復(fù)制降為異步復(fù)制模式,在master端可以看到Rpl_semi_sync_master_status=OFF,在save端可以看到Rpl_semi_sync_slave_status=OFF。
  • 上述master等待行為都發(fā)生在rpl_semi_sync_master_wait_no_slave=ON(默認(rèn)值)情況下。如果rpl_semi_sync_master_wait_no_slave設(shè)置為OFF時(shí),連接master的slave的數(shù)量少于rpl_semi_sync_master_wait_for_slave_count設(shè)置的值,master不會(huì)等待超時(shí),立刻自動(dòng)降為異步復(fù)制模式。

    建議

    如果把rpl_semi_sync_master_timeout設(shè)置非常大,在主從切換時(shí)導(dǎo)致原主庫(kù)加入集群時(shí)同步阻塞,建議把rpl_semi_sync_master_wait_no_slave=OFF。


網(wǎng)站標(biāo)題:semi-sync原主庫(kù)加入集群阻塞問(wèn)題分析-創(chuàng)新互聯(lián)
標(biāo)題網(wǎng)址:http://weahome.cn/article/dpeejd.html

其他資訊

在線咨詢

微信咨詢

電話咨詢

028-86922220(工作日)

18980820575(7×24)

提交需求

返回頂部