最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

MySQL主從同步機(jī)制與同步延時(shí)問題追查過程

 更新時(shí)間:2019年02月15日 09:43:56   作者:趙帥強(qiáng)  
這篇文章主要給大家介紹了關(guān)于MySQL主從同步機(jī)制與同步延時(shí)問題追查的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面來一起學(xué)習(xí)學(xué)習(xí)吧

前言

作為一名DBA,在工作中會(huì)經(jīng)常遇到一些MySQL主從同步延遲的問題,這些同步慢的問題,其實(shí)原因非常多,可能是因?yàn)橹鲝牡木W(wǎng)絡(luò)問題導(dǎo)致,可能是因?yàn)榫W(wǎng)絡(luò)帶寬問題導(dǎo)致,可能是因?yàn)榇笫聞?wù)導(dǎo)致,也可能是因?yàn)閱尉€程復(fù)制導(dǎo)致的延遲。

今天遇到一個(gè)問題,Mysql持續(xù)報(bào)錯(cuò),主從同步延時(shí)數(shù)過大或錯(cuò)誤。所以這篇文章給大家分享下主從同步的機(jī)制原理以及問題排查思路。

故障表現(xiàn)

最直觀的表現(xiàn)為:

mysql> show slave status\G;
 // 狀態(tài)一
 Seconds_Behind_Master: NULL
 // 狀態(tài)二
 Seconds_Behind_Master: 0
 // 狀態(tài)三
 Seconds_Behind_Master: 79

連續(xù)查詢,大部分時(shí)間該屬性值=0,偶發(fā)性出現(xiàn)Null或者79等延時(shí)值。導(dǎo)致觀察主從同步延時(shí)的監(jiān)控持續(xù)報(bào)警。

故障原因及解決方案

多臺(tái)備機(jī)的server-id一致,導(dǎo)致主機(jī)無法長時(shí)間同某一臺(tái)備機(jī)連接,進(jìn)而無法正常同步。

修改server-id后,重啟數(shù)據(jù)庫恢復(fù)。

主從同步機(jī)制

MySQL的主從同步,又稱為復(fù)制(replication),是一種內(nèi)置的高可用高性能集群解決方案,主要功能有:

  • 數(shù)據(jù)分布:同步不需要很大帶寬,可以實(shí)現(xiàn)多數(shù)據(jù)中心復(fù)制數(shù)據(jù)。
  • 讀取的負(fù)載均衡:通過服務(wù)器集群,可以通過DNS輪詢、Linux LVS等GSLB(全局負(fù)載均衡)方式,降低主服務(wù)器的讀壓力。
  • 數(shù)據(jù)庫備份:復(fù)制是備份的一部分,但并不能代替?zhèn)浞?。還需要與快照相結(jié)合。
  • 高可用性和故障轉(zhuǎn)移:從服務(wù)器可以快速切換為主服務(wù)器,減少故障的停機(jī)時(shí)間和恢復(fù)時(shí)間。

主從同步分為3步:

  1. 主服務(wù)器(master)把數(shù)據(jù)更改記錄到二進(jìn)制日志(binlog)中。
  2. 從服務(wù)器(slave)把主服務(wù)器的二進(jìn)制日志復(fù)制到自己的中繼日志(relay log)中。
  3. 從服務(wù)器重做中繼日志中的日志,把更改應(yīng)用到自己的數(shù)據(jù)庫上,達(dá)到數(shù)據(jù)的一致性。

主從同步是一個(gè)異步實(shí)時(shí)的同步,會(huì)實(shí)時(shí)的傳輸,但存在執(zhí)行上的延時(shí),如果主服務(wù)器壓力很大,延時(shí)也會(huì)相應(yīng)擴(kuò)大。

通過上面的圖,可以看到一共需要3個(gè)線程:

  1. 主服務(wù)器的日志傳送線程:負(fù)責(zé)將二進(jìn)制日志增量傳送到備機(jī)
  2. 從服務(wù)器的I/O線程:負(fù)責(zé)讀取主服務(wù)器的二進(jìn)制日志,并保存為中繼日志
  3. 從服務(wù)器的SQL線程,負(fù)責(zé)執(zhí)行中繼日志

查看MySQL線程

我們可以使用show full processlist;命令來查看MySQL的狀態(tài):

主機(jī)的狀態(tài):

備機(jī)的狀態(tài):

可以看到,我的集群架構(gòu)為1臺(tái)主機(jī)、4臺(tái)備機(jī),所以在主機(jī)中有4個(gè)同步線程(已經(jīng)發(fā)送所有的binlog數(shù)據(jù)到備機(jī),等待binlog日志更新),1個(gè)查看命令線程(show full processlist)。在備機(jī)中有1個(gè)查看命令線程,1個(gè)I/O線程(等待主機(jī)發(fā)送同步數(shù)據(jù)事件),1個(gè)SQL線程(已經(jīng)讀取了所有中繼日志,等待I/O線程來更新它)。

查看同步狀態(tài)

因?yàn)橹鲝耐绞钱惒綄?shí)時(shí)的,也就是會(huì)存在延時(shí)的情況,我們可以通過show slave status;來查看備機(jī)上的同步延時(shí):

在主從同步中我們需要關(guān)注的一些屬性,已經(jīng)給大家標(biāo)紅了:

  • Slave_IO_State: 當(dāng)前I/O線程的狀態(tài)
  • Master_Log_File: 當(dāng)前同步的主服務(wù)器的二進(jìn)制文件
  • Read_Master_Log_Pos: 當(dāng)前同步的主服務(wù)器的二進(jìn)制文件的偏移量,單位為字節(jié),如圖中為已經(jīng)同步了12.9M(13630580/1024/1024)的內(nèi)容
  • Relay_Master_Log_File: 當(dāng)前中繼日志同步的二進(jìn)制文件
  • Slave_IO_Running: 從服務(wù)器中I/O線程的運(yùn)行狀態(tài),YES為運(yùn)行正常
  • Slave_SQL_Running: 從服務(wù)器中SQL線程的運(yùn)行狀態(tài),YES為運(yùn)行正常
  • Exec_Master_Log_Pos: 表示同步完成的主服務(wù)器的二進(jìn)制日志偏移量
  • Seconds_Behind_Master: 表示從服務(wù)器數(shù)據(jù)比主服務(wù)器落后的持續(xù)時(shí)長

同樣可以通過show master status;命令來查看主服務(wù)器的運(yùn)行狀態(tài):

正常運(yùn)行的主從同步狀態(tài):

Slave_IO_Running: YES
Slave_SQL_Running: YES
Seconds_Behind_Master: 0

問題排查

在理解了主從同步的機(jī)制后,再來看今天遇到的問題,通過查看備機(jī)狀態(tài),我們觀察在三種狀態(tài)下的幾個(gè)關(guān)鍵屬性值:

mysql> show slave status\G;
#狀態(tài)一:
 Slave_IO_State: Reconnecting after a failed master event read
 Slave_IO_Running: No
 Slave_SQL_Running: Yes
 Seconds_Behind_Master: NULL
#狀態(tài)二:
 Slave_IO_State: Waiting for master to send event
 Slave_IO_Running: Yes
 Slave_SQL_Running: Yes
 Seconds_Behind_Master: 0
#狀態(tài)三:
 Slave_IO_State: Queueing master event to the relay log
 Slave_IO_Running: Yes
 Slave_SQL_Running: Yes
 Seconds_Behind_Master: 636

通過MySQL主從復(fù)制線程狀態(tài)轉(zhuǎn)變,我們可以看到三種狀態(tài)的不同含義:

# 狀態(tài)一
# 線程正嘗試重新連接主服務(wù)器,當(dāng)連接重新建立后,狀態(tài)變?yōu)閃aiting for master to send event。
Reconnecting after a failed master event read
# 狀態(tài)二
# 線程已經(jīng)連接上主服務(wù)器,正等待二進(jìn)制日志事件到達(dá)。如果主服務(wù)器正空閑,會(huì)持續(xù)較長的時(shí)間。如果等待持續(xù)slave_read_timeout秒,則發(fā)生超時(shí)。此時(shí),線程認(rèn)為連接被中斷并企圖重新連接。
Waiting for master to send event

# 狀態(tài)三
# 線程已經(jīng)讀取一個(gè)事件,正將它復(fù)制到中繼日志供SQL線程來處理。
Queueing master event to the relay log

在這里,我們可以猜測,由于某些原因,從服務(wù)器不斷的和主服務(wù)器進(jìn)行斷開并嘗試重連,重連成功后又再次斷開。

我們?cè)倏纯粗鳈C(jī)的運(yùn)行情況:

發(fā)現(xiàn)問題出在10.144.63.*和10.144.68.*兩臺(tái)機(jī)器上,我們查看其中一臺(tái)的錯(cuò)誤日志:

190214 11:33:20 [Note] Slave: received end packet from server, apparent master shutdown:
190214 11:33:20 [Note] Slave I/O thread: Failed reading log event, reconnecting to retry, log 'mysql-bin.005682' at postion 13628070

拿到關(guān)鍵字Slave: received end packet from server, apparent master shutdown: Google搜索一下,在文章Confusing MySQL Replication Error Message中可以看到原因?yàn)閮膳_(tái)備機(jī)的server-id重復(fù)。

One day it happen to me, and took me almost an hour to find that out.
Moving foward I always use a base my.cnf to I copy to any other server and the first thing is to increase the server-id.
Could MySQL just use the servername intead of a numeric value?

問題修復(fù)

定位了問題,我們確認(rèn)下是否重復(fù),發(fā)現(xiàn)兩臺(tái)備機(jī)的該字段確實(shí)相同:

vim my.cnf

#replication
log-bin=mysql-bin
# 這個(gè)隨機(jī)數(shù)字相同導(dǎo)致的
server-id=177230069
sync_binlog=1

更改一個(gè)其他不同的數(shù)字,保存,重啟MySQL進(jìn)程,報(bào)警恢復(fù)。

總結(jié)

最終來看,這個(gè)問題的解決非常簡單,但從剛開始的迷茫到最后的思路清晰,都是我們排查問題所常見的,這篇文章的主要收獲是讓你明白主從同步的機(jī)制和追查問題的思路,希望下次我們都能很快的解決主從同步帶給我們的問題。

好了,以上就是這篇文章的全部內(nèi)容了,希望本文的內(nèi)容對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,如果有疑問大家可以留言交流,謝謝大家對(duì)腳本之家的支持。

參考資料

相關(guān)文章

  • mysql主從服務(wù)器配置特殊問題

    mysql主從服務(wù)器配置特殊問題

    如果修改了主服務(wù)器的配置,記得刪除從服務(wù)器上的master.info文件。否則從服務(wù)器使用的還是老配置,可能會(huì)導(dǎo)致錯(cuò)誤。
    2010-12-12
  • 查看mysql語句運(yùn)行時(shí)間的2種方法

    查看mysql語句運(yùn)行時(shí)間的2種方法

    網(wǎng)站運(yùn)行很慢的時(shí)候,我就特別起知道為什么這么慢,所以我查啊查,數(shù)據(jù)庫絕對(duì)是很重要的一部分,里面運(yùn)行的sql是絕對(duì)不能放過的。平時(shí)做項(xiàng)目的時(shí)候,我也會(huì)注意sql語句的書寫,寫出一些高效的sql來,所以我會(huì)經(jīng)常測試自己寫的sql語句。我把我知道的二個(gè)方法,總結(jié)一下發(fā)出來
    2014-01-01
  • mysql8.0.21安裝教程圖文詳解

    mysql8.0.21安裝教程圖文詳解

    這篇文章主要介紹了mysql8.0.21安裝教程,本文通過圖文并茂的形式給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2020-09-09
  • Mysql?SQL審核平臺(tái)Yearning本地部署方案

    Mysql?SQL審核平臺(tái)Yearning本地部署方案

    Yearning簡單高效的MYSQL 審計(jì)平臺(tái)一款MYSQL SQL語句/查詢審計(jì)工具,為DBA與開發(fā)人員使用.本地部署,注重隱私,簡單高效的MYSQL審計(jì)平臺(tái),下面介紹Linux 簡單部署Yearning 并結(jié)合cpolar 內(nèi)網(wǎng)穿透工具實(shí)現(xiàn)遠(yuǎn)程訪問,破除訪問限制,提高工作效率,感興趣的朋友一起看看吧
    2024-01-01
  • MySQL長字符截?cái)嗟膶?shí)現(xiàn)示例

    MySQL長字符截?cái)嗟膶?shí)現(xiàn)示例

    本文主要介紹了MySQL長字符截?cái)嗟膶?shí)現(xiàn)示例,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2023-03-03
  • 一文教你解決MySQL的深度分頁問題

    一文教你解決MySQL的深度分頁問題

    在 MySQL 中,分頁是一個(gè)常見的功能,但是,當(dāng)出現(xiàn)深度分頁時(shí),因?yàn)閿?shù)據(jù)庫需要掃描和跳過大量記錄,可能會(huì)導(dǎo)致性能問題,下面我們就來看看該如何解決吧
    2024-11-11
  • mysql中的int(5)到底有是多長

    mysql中的int(5)到底有是多長

    這篇文章主要介紹了mysql中的int(5)到底有是多長,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2023-04-04
  • Mysql主從GTID與binlog如何使用

    Mysql主從GTID與binlog如何使用

    MySQL的GTID和binlog是實(shí)現(xiàn)高效數(shù)據(jù)復(fù)制和恢復(fù)的重要機(jī)制,GTID保證事務(wù)的唯一標(biāo)識(shí),避免復(fù)制沖突;binlog記錄數(shù)據(jù)變更,用于主從復(fù)制和數(shù)據(jù)恢復(fù),兩者配合,提高M(jìn)ySQL復(fù)制的準(zhǔn)確性和管理便捷性
    2024-10-10
  • mysql數(shù)據(jù)庫刪除重復(fù)數(shù)據(jù)只保留一條方法實(shí)例

    mysql數(shù)據(jù)庫刪除重復(fù)數(shù)據(jù)只保留一條方法實(shí)例

    這篇文章主要給大家介紹了關(guān)于mysql數(shù)據(jù)庫刪除重復(fù)數(shù)據(jù),只保留一條的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2021-03-03
  • MySQL limit性能分析與優(yōu)化

    MySQL limit性能分析與優(yōu)化

    今天小編就為大家分享一篇關(guān)于MySQL limit性能分析與優(yōu)化,小編覺得內(nèi)容挺不錯(cuò)的,現(xiàn)在分享給大家,具有很好的參考價(jià)值,需要的朋友一起跟隨小編來看看吧
    2019-02-02

最新評(píng)論

石柱| 连云港市| 永顺县| 阳朔县| 巫山县| 庆城县| 道孚县| 邢台县| 洪湖市| 汾西县| 禄丰县| 岳普湖县| 云南省| 德兴市| 思茅市| 本溪| 抚顺县| 瑞昌市| 江陵县| 濮阳市| 彰化市| 维西| 双江| 伊川县| 高密市| 安丘市| 建湖县| 永胜县| 华池县| 剑阁县| 什邡市| 鲁山县| 慈溪市| 军事| 永善县| 莱芜市| 凭祥市| 射阳县| 浪卡子县| 三亚市| 南宁市|