成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

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

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

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

[[247025]]

為什么主從延時這么大?

答:MySQL使用單線程重放RelayLog。

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

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

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

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

為什么會出現不一致?

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

  1. update account set money=100 where uid=58
  2. update account set money=150 where uid=58
  3. update account set money=200 where uid=58

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

畫外音:***money都將為200。

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

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

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

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

如何做到呢?

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

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

這個方案有什么不足?

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

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

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

  • 非常方便的實例擴展:DBA很容易將不同的庫擴展到不同的實例上;
  • 按照業務進行庫隔離:業務解耦,進行業務隔離,減少耦合與相互影響;
  • 非常方便微服務拆分:每個服務擁有自己的實例就方便了;

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

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

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

解法:基于GTID的并行復制。

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

  1. 從MySQL5.7開始,將組提交的信息存放在GTID中,使用mysqlbinlog工具,可以看到組提交內部的信息: 
  2. 20181014 23:52 server_id 58 XXX GTID last_committed=0 sequence_numer=1 
  3. 20181014 23:52 server_id 58 XXX GTID last_committed=0 sequence_numer=2 
  4. 20181014 23:52 server_id 58 XXX GTID last_committed=0 sequence_numer=3 
  5. 20181014 23:52 server_id 58 XXX GTID last_committed=0 sequence_numer=4 

和原來的日志相比,多了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并行復制;

【本文為51CTO專欄作者“58沈劍”原創稿件,轉載請聯系原作者】

戳這里,看該作者更多好文

責任編輯:趙寧寧 來源: 51CTO專欄
相關推薦

2017-11-27 14:58:01

MySQL高并發優化性能調優

2023-10-30 18:35:47

MySQL主從延時

2025-02-11 12:29:58

2011-08-29 14:00:26

MySQL主從延時

2022-06-01 07:49:43

索引數據Mysql

2015-06-11 10:57:10

2021-03-24 09:06:01

MySQL長連接短連接

2019-05-30 05:19:30

MySQL優化語句執行

2015-06-30 12:53:40

秒殺應用MySQL數據庫優化

2022-12-16 08:21:28

連接池Tomcat策略

2019-05-10 15:30:18

數據庫主從復制MySQL

2018-07-26 14:50:00

數據庫MySQL大表優化

2025-06-03 00:00:06

性能優化性能指標響應時間

2022-12-20 08:46:41

MySQL主從復制

2020-03-12 18:56:06

MySQL主從復制數據庫

2021-11-18 23:08:53

MySQLSQL索引

2025-03-20 12:33:36

2023-01-03 10:06:08

模型計算

2022-12-27 09:22:06

Nest.js框架

2018-04-09 14:25:06

數據庫MySQL索引
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 国产日韩精品一区 | 韩国理论电影在线 | 伊人性伊人情综合网 | 国产 日韩 欧美 在线 | 久久精品亚洲精品国产欧美 | 午夜天堂精品久久久久 | 老司机精品福利视频 | 日韩一区精品 | 欧美中文一区 | 91视频一区| 日韩电影一区二区三区 | 久久91av| 国产在线精品一区二区三区 | 99亚洲 | 中文在线一区二区 | 999久久久国产精品 欧美成人h版在线观看 | 欧美一级毛片免费观看 | 日韩精品区 | 在线免费观看色 | 免费黄色片在线观看 | 91香蕉嫩草| 国产精品久久久久婷婷二区次 | 国产一区二区在线免费 | 日韩在线播放av | 国产福利资源在线 | 日韩视频中文字幕 | 中文字幕在线不卡 | 黑人巨大精品欧美一区二区免费 | 日本久久www成人免 成人久久久久 | 日韩视频免费 | 成人区精品一区二区婷婷 | 国产精品视频区 | 精品一二三区视频 | 福利二区| 中文一区 | 嫩草视频在线 | 罗宾被扒开腿做同人网站 | 国产精品99久久免费观看 | 精品永久 | 亚洲精品免费看 | 亚洲伦理自拍 |