欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

淺析MySQL的WriteSet并行復制

 更新時間:2020年12月01日 11:21:23   作者:蔣樂興的技術(shù)隨筆  
這篇文章主要介紹了淺析MySQL的WriteSet并行復制的相關資料,幫助大家更好的理解和學習MySQL,感興趣的朋友可以了解下

【歷史背景】

  歲月更迭中我已經(jīng)從事MySQL-DBA這個工作三個年頭,見證MySQL從“基本可用”,“邊緣系統(tǒng)可以用MySQL”,“哦操!你怎么不用MySQL”;

  正所謂!“一個數(shù)據(jù)庫的境遇既取決于歷史的進程,取決于它的自我奮斗!”,關于“歷史的進程”在此不表,關于“自我奮斗”這里也只想談一下并行復制的幾個關鍵時間結(jié)點

  總的來說MySQL關于并行復制到目前為止經(jīng)歷過三個比較關鍵的時間結(jié)點“庫間并發(fā)”,“組提交”,“寫集合”;真可謂是江山代有人才出,前浪死在沙灘上;總的來說就后面的比前面的不知道高到哪里去了!

【庫間并發(fā)】

  庫間并發(fā)的理論依據(jù)是這樣的 ---- 一個實例內(nèi)可能會有多個庫(schema),不同的庫之間沒有什么依賴關系,所以在slave那邊為每一個庫(schema)單獨起一個SQL線程,這樣就能通過多線程并行復制的方式來提高主從復制的效率。

  這個理論聽起來沒問題,但是事實上一個實例也就一個業(yè)務庫,所以這種庫間并發(fā)就沒什么作用了;也就是說這個方式的適用場景比較少,針對這個不足直到“組提交”才解決!

【組提交】

  組提交的理論依據(jù)是這樣的 --- 如果多個事務他們能在同一時間內(nèi)提交,這個就間接說明了這個幾個事務鎖上是沒有沖突的,也是就說他們各自持有不同的鎖,互不影響;邏輯上我們幾個事務看一個組,在slave以“組”為單位分配給SQL線程執(zhí)行,這樣多個SQL線程就可以并行跑了;而且不在以庫為并行的粒度,效果上要比“庫間并發(fā)”要好一些。

  這個事實上也有一些問題,因為它要求庫上要有一定的并發(fā)度,不然就有可能變成每個組里面只有一個事務,這樣就有串行沒什么區(qū)別了,為了解決這個問題MySQL提供了兩個參數(shù)就是希望在提交時先等一等,盡可能的讓組內(nèi)多一些事務,以提高并行復制的效率。

  “binlog_group_commit_sync_no_delay_count” 設置一個下水位,也就是說一個組要湊足多少個事務再提交;為子防止永遠也湊不足

  那么多個事務MySQL還以時間為維度給出了另一個參數(shù)“binlog_group_commit_sync_delay”這個參數(shù)就是最多等多久,超過這個時間長度后就算沒有湊足也提交。 

  親身經(jīng)歷呀! 這兩個參數(shù)特別難找到合的值,就算今天合適,過幾天業(yè)務上有點變化后,又可能變的不合適了;如果MySQL能自己達到一個自適應的效果就好了;這個自適用要到WriteSet才完成(WriteSet并不是通過自動調(diào)整這兩個參數(shù)來完成,它采用了完全不同的解決思路)。

【W(wǎng)riteSet】

  WriteSet解決了什么問題?當然是解決了“組提交”的問題啦! 說了和沒說一個樣,好下面我們來舉個例子(比較學院派);假設你第一天更新了id == 1 的那一行,第二天你更新了id == 2 的那一行,第三天有個slave過來同步你的數(shù)據(jù)啦! 以“組提交”的尿性,這兩個更新會被打包到不同的“組”,也就是說會有兩個組;由于每個組內(nèi)只有一個事務,所以邏輯上就串行了,起來! 

  身為DBA的你一可以看出來這兩個事實上是可以打包到同一個組里來的,因為他們互不沖突,就算打包到同一個組也不引起數(shù)據(jù)的不一致。 于是你有兩個辦法

  辦法1): 妹妹你大膽的把“binlog_group_commit_sync_no_delay_count”設置成 2,也就是說一個組至少要包含兩個事務,并且把“binlog_group_commit_sync_delay”設置成24小時以上!如果你真的做了,你就可以回家了,你的數(shù)據(jù)庫太慢了(第一條update等了一天),才完成!

  辦法2): 叫MySQL用一本小本子記下它最近改了什么,如果現(xiàn)在要改的數(shù)據(jù)和之前的數(shù)據(jù)不沖突,那么他們就可以把包到同一個組;還是我們剛才的例子,由于第二天改的值的id==2所以它和第一天的不沖突,那么它完全可以把第二天的更新和第一天的更新打包到同一個組。這樣組里面就有兩個事務了,在slave第三天回放時就會有一種并行的效果。

  這本小本子這么牛逼可以做大一點嗎?當然!binlog_transaction_dependency_history_size 這個參數(shù)就小本子的容量了;那我的MySQL有這本小本子嗎? 如果你的mysql比mysql-5.7.22新的話,小本子就是它生來就有的。

  也就是說“WriteSet”是站在“組提交”這個巨人的基礎之間建立起來的,而且是在master上做的自“適應”打包分組,所以你只要在master上新增兩個參數(shù)

binlog_transaction_dependency_tracking = WRITESET     # COMMIT_ORDER   
transaction_write_set_extraction  = XXHASH64

理論說完了,下面我們看一下實踐。

【W(wǎng)riteSet實踐】

   基于WriteSet的并行復制環(huán)境怎么搭建我這里就不說了,也就是比正常的“組提交”在master上多加兩個參數(shù),不講了;我這里想直接給出兩種并行復制方式下的行為變化。

  1): 我們要執(zhí)行的目標SQL如下

create database tempdb;
use tempdb;
create table person(id int not null auto_increment primary key,name int);

insert into person(name) values(1);
insert into person(name) values(2);
insert into person(name) values(3);
insert into person(name) values(5);

  2): 看一下組提交對上面SQL的分組情況

  3): 看write_set的對“組提交”優(yōu)化后的情況

   可以看到各個insert是可以并行執(zhí)行的,所以它們被分到了同個組(last_committed相同);last_committed,sequence_number,這兩個值在binlog里面記著就有,我在解析binlog的時候習慣使用如下選項

mysqlbinlog -vvv --base64-output='decode-rows' mysql-bin.000002  

 【總結(jié)】

  WriteSet是在“組提交”方式上建立起來的,一種新的并行復制實現(xiàn);相比“組提交”來說更加靈活;當然,由于并發(fā)度上去了,相比“組提交”WriteSet在性能上會更加好一些,在一些WriteSet沒有辦法是否沖突時,能平滑過度到“組提交”模式。

以上就是淺析MySQL的WriteSet并行復制的詳細內(nèi)容,更多關于MySQL WriteSet并行復制的資料請關注腳本之家其它相關文章!

相關文章

  • MySQL CPU占用過高的排查指南

    MySQL CPU占用過高的排查指南

    使用關系數(shù)據(jù)庫MySQL版時,如果您的CPU使用率很高或接近100%,會導致數(shù)據(jù)讀寫處理緩慢、連接緩慢、刪除出現(xiàn)報錯等,從而影響業(yè)務正常運行,所以本文給大家介紹了MySQL CPU占用過高的排查指南,需要的朋友可以參考下
    2025-08-08
  • MySQL 億級數(shù)據(jù)導入導出及遷移筆記

    MySQL 億級數(shù)據(jù)導入導出及遷移筆記

    上周被安排做了一個MySQL億級數(shù)據(jù)的遷移,特此記錄一下,導入和導出是兩個過程,本文想詳細的介紹一下具體的使用,感興趣的小伙伴們可以參考一下
    2021-06-06
  • 深入了解MySQL中聚合函數(shù)的使用

    深入了解MySQL中聚合函數(shù)的使用

    這篇文章主要為大家詳細介紹一下MySQL中聚合函數(shù)的使用,文中的示例代碼講解詳細,對我們學習MySQL有一定幫助,需要的可以參考一下
    2022-07-07
  • innodb引擎redo文件維護方法

    innodb引擎redo文件維護方法

    下面小編就為大家?guī)硪黄猧nnodb引擎redo文件維護方法。小編覺得挺不錯的,現(xiàn)在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2017-03-03
  • mysql8重置root用戶密碼的完整步驟

    mysql8重置root用戶密碼的完整步驟

    這篇文章主要給大家分享介紹了關于mysql8重置root用戶密碼的相關資料,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2018-12-12
  • 解決mysql導入還原時亂碼的問題

    解決mysql導入還原時亂碼的問題

    sql文件,直接記事本方式打開,中文顯示正常,還原導入后,發(fā)現(xiàn)中文是亂碼
    2012-12-12
  • MySQL中處理各種重復的一些方法

    MySQL中處理各種重復的一些方法

    這篇文章主要介紹了MySQL中處理各種重復的一些方法,包括對表和查詢結(jié)果的重復的一些處理,需要的朋友可以參考下
    2015-05-05
  • mysql異常占用資源排查

    mysql異常占用資源排查

    本文詳細介紹了通過MySQL的全局變量檢查日志狀態(tài),監(jiān)控連接數(shù)及啟用和調(diào)整慢查詢記錄,以幫助排查數(shù)據(jù)庫性能問題,感興趣的可以了解一下
    2025-07-07
  • mysql的group by函數(shù)使用方法

    mysql的group by函數(shù)使用方法

    MySQL中的GROUP BY子句用于將查詢結(jié)果按一個或多個列進行分組,通常與聚合函數(shù),實現(xiàn)數(shù)據(jù)的分組統(tǒng)計,本文給大家介紹mysql的group by函數(shù)使用方法,感興趣的朋友跟隨小編一起看看吧
    2025-08-08
  • Mysql數(shù)據(jù)庫中數(shù)據(jù)的操作CRUD詳解

    Mysql數(shù)據(jù)庫中數(shù)據(jù)的操作CRUD詳解

    這篇文章主要介紹了Mysql數(shù)據(jù)庫中數(shù)據(jù)的操作(CRUD),詳細描述對Mysql數(shù)據(jù)庫中數(shù)據(jù)的操作(CRUD),包括插入、修改、刪除數(shù)據(jù),還有查詢數(shù)據(jù),包括where、in、like、ifnull、與或非、order by、聚集函數(shù)等,需要的朋友可以參考下
    2025-05-05

最新評論