亚洲激情专区-91九色丨porny丨老师-久久久久久久女国产乱让韩-国产精品午夜小视频观看

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

MySQL主從數據庫的同步延遲原理及解決方案

發布時間:2020-04-22 14:51:20 來源:億速云 閱讀:307 作者:三月 欄目:數據庫

下文內容主要給大家帶來MySQL主從數據庫的同步延遲原理及解決方案,所講到的知識,與書籍略有不同,都是億速云專業技術人員在與用戶接觸過程中,總結出來的,具有一定的經驗分享價值,希望給廣大讀者帶來幫助。

MySQL主從數據庫同步延遲問題

                        摘要: MySQL的主從同步是一個很成熟的架構,優點為:①在從云服務器可以執行查詢工作(即我們常說的讀功能),降低主服務器壓力;②在從主服務器進行備份,避免備份期間影響主服務器服務;③當主服務器出現問題時,可以切換到從服務器。 相信大家對于這些好處已經非常了解了,在項目的部署中也采用這種方案。但是MySQL...

MySQL主從數據庫的同步延遲原理及解決方案

MySQL的主從同步是一個很成熟的架構,優點為:①在從服務器可以執行查詢工作(即我們常說的讀功能),降低主服務器壓力;②在從主服務器進行備份,避免備份期間影響主服務器服務;③當主服務器出現問題時,可以切換到從服務器。

相信大家對于這些好處已經非常了解了,在項目的部署中也采用這種方案。但是MySQL的主從同步一直有從庫延遲的問題,那么為什么會有這種問題。這種問題如何解決呢?

1. MySQL數據庫主從同步延遲原理。

2. MySQL數據庫主從同步延遲是怎么產生的。

3. MySQL數據庫主從同步延遲解決方案。

 

1. MySQL數據庫主從同步延遲原理。

答:談到MySQL數據庫主從同步延遲原理,得從mysql的數據庫主從復制原理說起,mysql的主從復制都是單線程的操作,主庫對所有DDL和 DML產生binlog,binlog是順序寫,所以效率很高,slave的Slave_IO_Running線程到主庫取日志,效率很比較高,下一步, 問題來了,slave的Slave_SQL_Running線程將主庫的DDL和DML操作在slave實施。DML和DDL的IO操作是隨即的,不是順 序的,成本高很多,還可能可slave上的其他查詢產生lock爭用,由于Slave_SQL_Running也是單線程的,所以一個DDL卡主了,需要 執行10分鐘,那么所有之后的DDL會等待這個DDL執行完才會繼續執行,這就導致了延時。有朋友會問:“主庫上那個相同的DDL也需要執行10分,為什 么slave會延時?”,答案是master可以并發,Slave_SQL_Running線程卻不可以。

2. MySQL數據庫主從同步延遲是怎么產生的。

答:當主庫的TPS并發較高時,產生的DDL數量超過slave一個sql線程所能承受的范圍,那么延時就產生了,當然還有就是可能與slave的大型query語句產生了鎖等待。

3. MySQL數據庫主從同步延遲解決方案

答:最簡單的減少slave同步延時的方案就是在架構上做優化,盡量讓主庫的DDL快速執行。還有就是主庫是寫,對數據安全性較高,比如 sync_binlog=1,innodb_flush_log_at_trx_commit = 1 之類的設置,而slave則不需要這么高的數據安全,完全可以講sync_binlog設置為0或者關閉binlog,innodb_flushlog也 可以設置為0來提高sql的執行效率。另外就是使用比主庫更好的硬件設備作為slave。

mysql-5.6.3已經支持了多線程的主從復制。原理和丁奇的類似,丁奇的是以表做多線程,Oracle使用的是以數據庫(schema)為單位做多線程,不同的庫可以使用不同的復制線程。

 

基于局域網的master/slave機制在通常情況下已經可以滿足'實時'備份的要求了。如果延遲比較大,就先確認以下幾個因素: 
1. 網絡延遲
2. master負載
3. slave負載
一般的做法是,使用多臺slave來分攤讀請求,再從這些slave中取一臺專用的服務器,只作為備份用,不進行其他任何操作,就能相對最大限度地達到'實時'的要求了

slave_net_timeout單位為秒 默認設置為 3600秒

參數含義:當slave從主數據庫讀取log數據失敗后,等待多久重新建立連接并獲取數據

master-connect-retry單位為秒 默認設置為 60秒

參數含義:當重新建立主從連接時,如果連接建立失敗,間隔多久后重試。

通常配置以上2個參數可以減少網絡問題導致的主從數據同步延遲

 

判斷主從延時,通常有兩個方法:

1. Seconds_Behind_Master  vs  2. mk-heartbeat,下面具體說下兩者在實現功能的差別。

可以通過監控show slave status\G命令輸出的Seconds_Behind_Master參數的值來判斷,是否有發生主從延時。
其值有這么幾種:
NULL - 表示io_thread或是sql_thread有任何一個發生故障,也就是該線程的Running狀態是No,而非Yes.
0 - 該值為零,是我們極為渴望看到的情況,表示主從復制良好,可以認為lag不存在。
正值 - 表示主從已經出現延時,數字越大表示從庫落后主庫越多。
負值 - 幾乎很少見,只是聽一些資深的DBA說見過,其實,這是一個BUG值,該參數是不支持負值的,也就是不應該出現。

Seconds_Behind_Master是通過比較sql_thread執行的event的timestamp和io_thread復制好的 event的timestamp(簡寫為ts)進行比較,而得到的這么一個差值。我們都知道的relay-log和主庫的bin-log里面的內容完全一 樣,在記錄sql語句的同時會被記錄上當時的ts,所以比較參考的值來自于binlog,其實主從沒有必要與NTP進行同步,也就是說無需保證主從時鐘的 一致。你也會發現,其實比較真正是發生在io_thread與sql_thread之間,而io_thread才真正與主庫有關聯,于是,問題就出來了, 當主庫I/O負載很大或是網絡阻塞,io_thread不能及時復制binlog(沒有中斷,也在復制),而sql_thread一直都能跟上 io_thread的腳本,這時Seconds_Behind_Master的值是0,也就是我們認為的無延時,但是,實際上不是,你懂得。這也就是為什 么大家要批判用這個參數來監控數據庫是否發生延時不準的原因,但是這個值并不是總是不準,如果當io_thread與master網絡很好的情況下,那么 該值也是很有價值的。(就好比:媽–兒子–媳婦的關系,媽與兒子親人,媳婦和兒子也親人,不見得媳婦與媽就很親。開個玩笑:-)之前,提到 Seconds_Behind_Master這個參數會有負值出現,我們已經知道該值是io_thread的最近跟新的ts與sql_thread執行到 的ts差值,前者始終是大于后者的,唯一的肯能就是某個event的ts發生了錯誤,比之前的小了,那么當這種情況發生時,負值出現就成為可能。

方法2. mk-heartbeat,Maatkit萬能工具包中的一個工具,被認為可以準確判斷復制延時的方法。

mk-heartbeat的實現也是借助timestmp的比較實現的,它首先需要保證主從服務器必須要保持一致,通過與相同的一個NTP server同步時鐘。它需要在主庫上創建一個heartbeat的表,里面至少有id與ts兩個字段,id為server_id,ts就是當前的時間戳 now(),該結構也會被復制到從庫上,表建好以后,會在主庫上以后臺進程的模式去執行一行更新操作的命令,定期去向表中的插入數據,這個周期默認為1 秒,同時從庫也會在后臺執行一個監控命令,與主庫保持一致的周期去比較,復制過來記錄的ts值與主庫上的同一條ts值,差值為0表示無延時,差值越大表示 延時的秒數越多。我們都知道復制是異步的ts不肯完全一致,所以該工具允許半秒的差距,在這之內的差異都可忽略認為無延時。這個工具就是通過實打實的復 制,巧妙的借用timestamp來檢查延時,贊一個!

對于以上關于MySQL主從數據庫的同步延遲原理及解決方案,如果大家還有更多需要了解的可以持續關注我們億速云的行業推新,如需獲取專業解答,可在官網聯系售前售后的,希望該文章可給大家帶來一定的知識更新。

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

根河市| 尖扎县| 咸宁市| 柘荣县| 上思县| 滨州市| 萍乡市| 政和县| 西青区| 旺苍县| 中方县| 土默特左旗| 德惠市| 红河县| 昌平区| 揭阳市| 昌吉市| 安吉县| 廉江市| 彰化县| 宝丰县| 普宁市| 宜君县| 兴仁县| 冀州市| 常山县| 梅河口市| 吉安市| 城口县| 泾川县| 闻喜县| 澜沧| 白朗县| 博爱县| 敖汉旗| 锡林郭勒盟| 广丰县| 鸡西市| 陇西县| 宜都市| 洪洞县|