日日操夜夜添-日日操影院-日日草夜夜操-日日干干-精品一区二区三区波多野结衣-精品一区二区三区高清免费不卡

公告:魔扣目錄網為廣大站長提供免費收錄網站服務,提交前請做好本站友鏈:【 網站目錄:http://www.ylptlb.cn 】, 免友鏈快審服務(50元/站),

點擊這里在線咨詢客服
新站提交
  • 網站:51998
  • 待審:31
  • 小程序:12
  • 文章:1030137
  • 會員:747

MySQL主從復制,讀寫分離是互聯網常見的數據庫架構,該架構最令人詬病的地方就是,在數據量較大并發量較大的場景下,主從延時會比較嚴重。

為什么主從延時這么大?

MySQL主從延時這么長,要怎么優化?

 

:MySQL使用單線程重放RelayLog。

應該怎么優化,縮短重放時間?

多線程并行重放RelayLog可以縮短時間。

多線程并行重放RelayLog有什么問題?

MySQL主從延時這么長,要怎么優化?

 

:需要考慮如何分割RelayLog,才能夠讓多個數據庫實例多個線程并行重放RelayLog,不會出現不一致。

為什么會出現不一致?

:如果RelayLog隨機的分配給不同的重放線程,假設RelayLog中有這樣三條串行的修改記錄:

update account set money=100 where uid=58;

update account set money=150 where uid=58;

update account set money=200 where uid=58;

如果單線程串行重放:能保證所有從庫與主庫的執行序列一致。

畫外音:最后money都將為200。

如果多線程隨機分配重放:多重放線程并發執行這3個語句,誰最后執行是不確定的,最終從庫數據可能與主庫不同。

畫外音:多個從庫可能money為100,150,200不確定。

如何分配,多個從庫多線程重放,也能得到一致的數據呢?

相同庫上的寫操作,用相同的線程來重放RelayLog;不同庫上的寫操作,可以并發用多個線程并發來重放RelayLog。

MySQL主從延時這么長,要怎么優化?

 

如何做到呢?

:設計一個哈希算法,hash(db-name) % thread-num,庫名hash之后再模上線程數,就能很輕易做到,同一個庫上的寫操作,被同一個重放線程串行執行。

畫外音:不同庫上的重放,是并行的,就起到了加速做用。

這個方案有什么不足?

:很多公司對MySQL的使用是“單庫多表”,如果是這樣的話,仍然只有一個庫,還是不能提高RelayLog的重放速度。

啟示:將“單庫多表”的DB架構模式升級為“多庫多表”的DB架構模式

畫外音:數據量大并發量大的互聯網業務場景,“多庫”模式還具備著其他很多優勢,例如:

(1)非常方便的實例擴展:DBA很容易將不同的庫擴展到不同的實例上;

(2)按照業務進行庫隔離:業務解耦,進行業務隔離,減少耦合與相互影響;

(3)非常方便微服務拆分:每個服務擁有自己的實例就方便了;

“單庫多表”的場景,多線程并行重放RelayLog還能怎么優化?

:即使只有一個庫,事務在主庫上也是并發執行的,既然在主庫上可以并行執行,在從庫上也應該能夠并行執行呀?

新思路:將主庫上同時并行執行的事務,分為一組,編一個號,這些事務在從庫上的回放可以并行執行(事務在主庫上的執行都進入到prepare階段,說明事務之間沒有沖突,否則就不可能提交),沒錯,MySQL正是這么做的。

解法基于GTID的并行復制

從MySQL5.7開始,將組提交的信息存放在GTID中,使用mysqlbinlog工具,可以看到組提交內部的信息:

20181014 23:52 server_id 58 XXX GTID last_committed=0 sequence_numer=1

20181014 23:52 server_id 58 XXX GTID last_committed=0 sequence_numer=2

20181014 23:52 server_id 58 XXX GTID last_committed=0 sequence_numer=3

20181014 23:52 server_id 58 XXX GTID last_committed=0 sequence_numer=4

MySQL主從延時這么長,要怎么優化?

 

和原來的日志相比,多了last_committed和sequence_number。

什么是last_committed?

答:它是事務提交時,上次事務提交的編號,如果具備相同的last_committed,說明它們在一個組內,可以并發回放執行

總結

MySQL并行復制,縮短主從同步時延的方法,體現著這樣的一些架構思想:

  • 多線程是一種常見的縮短執行時間的方法;

畫外音:例如,很多crontab可以用多線程,切分數據,并行執行。

  • 多線程并發分派任務時,必須保證冪等性:MySQL提供了“按照庫冪等”,“按照commit_id冪等”兩種方式,很值得借鑒;

畫外音:例如,群消息,可以按照group_id冪等;用戶消息,可以按照user_id冪等。

具體到MySQL主從同步延時:

  • mysql5.5:不支持并行復制,大伙快升級MySQL版本
  • mysql5.6:按照庫并行復制,建議使用“多庫”架構
  • mysql5.7:按照GTID并行復制;

思路比結論重要,希望大家有收獲。

來源:架構師之路

作者:沈劍

鏈接:https://mp.weixin.qq.com/s/pP2f7CYbT7ftM0tvk9c4mQ

分享到:
標簽:主從 延時 MySQL
用戶無頭像

網友整理

注冊時間:

網站:5 個   小程序:0 個  文章:12 篇

  • 51998

    網站

  • 12

    小程序

  • 1030137

    文章

  • 747

    會員

趕快注冊賬號,推廣您的網站吧!
最新入駐小程序

數獨大挑戰2018-06-03

數獨一種數學游戲,玩家需要根據9

答題星2018-06-03

您可以通過答題星輕松地創建試卷

全階人生考試2018-06-03

各種考試題,題庫,初中,高中,大學四六

運動步數有氧達人2018-06-03

記錄運動步數,積累氧氣值。還可偷

每日養生app2018-06-03

每日養生,天天健康

體育訓練成績評定2018-06-03

通用課目體育訓練成績評定