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

淺析MySQL的WriteSet并行復(fù)制

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

【歷史背景】

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

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

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

【庫間并發(fā)】

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

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

【組提交】

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

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

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

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

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

【W(wǎng)riteSet】

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

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

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

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

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

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

binlog_transaction_dependency_tracking = WRITESET     # COMMIT_ORDER   
transaction_write_set_extraction  = XXHASH64

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

【W(wǎng)riteSet實踐】

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

  1): 我們要執(zhí)行的目標(biāo)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的時候習(xí)慣使用如下選項

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

 【總結(jié)】

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

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

相關(guān)文章

  • cmd連接mysql的方法詳解

    cmd連接mysql的方法詳解

    本篇文章是對cmd連接mysql的方法進行了詳細的分析介紹,需要的朋友參考下
    2013-06-06
  • mysql之關(guān)于CST和GMT時區(qū)時間轉(zhuǎn)換方式

    mysql之關(guān)于CST和GMT時區(qū)時間轉(zhuǎn)換方式

    這篇文章主要介紹了mysql之關(guān)于CST和GMT時區(qū)時間轉(zhuǎn)換方式,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
    2023-10-10
  • MySQL中主鍵默認有索引嗎

    MySQL中主鍵默認有索引嗎

    MySQL主鍵默認是有索引的,在MySQL中,主鍵是用來唯一標(biāo)識表中每一行數(shù)據(jù)的字段或字段組合,主鍵的作用是保證數(shù)據(jù)的唯一性,并且可以提高數(shù)據(jù)的查詢效率,需要的朋友可以參考下
    2023-10-10
  • MySQL定時器開啟、調(diào)用實現(xiàn)代碼

    MySQL定時器開啟、調(diào)用實現(xiàn)代碼

    有些新手朋友對MySQL定時器開啟、調(diào)用不是很熟悉,本人整理測試一些,拿出來和大家分享一下,希望可以幫助你們
    2012-12-12
  • MySQL開發(fā)規(guī)范與使用技巧總結(jié)

    MySQL開發(fā)規(guī)范與使用技巧總結(jié)

    今天小編就為大家分享一篇關(guān)于MySQL開發(fā)規(guī)范與使用技巧總結(jié),小編覺得內(nèi)容挺不錯的,現(xiàn)在分享給大家,具有很好的參考價值,需要的朋友一起跟隨小編來看看吧
    2019-03-03
  • 詳解MySQL自增主鍵的實現(xiàn)

    詳解MySQL自增主鍵的實現(xiàn)

    現(xiàn)在大部分的軟件開發(fā)都離不開數(shù)據(jù)庫。而mysql也是經(jīng)常會用到的一個數(shù)據(jù)庫。mysql數(shù)據(jù)庫中有一個主鍵生成規(guī)則,就是自增。也是我們經(jīng)常會用到的。本文就來介紹一下
    2021-09-09
  • 淺談Mysql insert on duplicate key 死鎖問題定位與解決

    淺談Mysql insert on duplicate key 死鎖問

    本文介紹了在并發(fā)場景下的 insert on duplicate key update sql 出現(xiàn)的死鎖,經(jīng)過分析發(fā)現(xiàn)這種sql確實比較容易造成死鎖,這篇文章就從分析死鎖展開,到最終如何解決這樣的問題 分享相應(yīng)的思路,感興趣的可以了解一下
    2022-05-05
  • MySQL錯誤“Data?too?long”的原因、解決方案與優(yōu)化策略

    MySQL錯誤“Data?too?long”的原因、解決方案與優(yōu)化策略

    MySQL作為重要的數(shù)據(jù)庫系統(tǒng),在數(shù)據(jù)插入時可能遇到“Data?too?long?for?column”錯誤,本文探討了該錯誤的原因、解決方案及預(yù)防措施,如調(diào)整字段長度、使用TEXT類型等,旨在優(yōu)化數(shù)據(jù)庫設(shè)計,提升性能和用戶體驗,需要的朋友可以參考下
    2024-09-09
  • MySQL中索引的優(yōu)化的示例詳解

    MySQL中索引的優(yōu)化的示例詳解

    索引是數(shù)據(jù)庫優(yōu)化最常用也是最重要的手段之一,通過索引通??梢詭椭脩艚鉀Q大多數(shù)的MySQL的性能優(yōu)化問題。本文主要來講講索引優(yōu)化的方法,希望對大家有所幫助
    2023-02-02
  • mysql忘記密碼怎么辦

    mysql忘記密碼怎么辦

    mysql忘記密碼怎么辦?這篇文章主要為大家詳細介紹了MySQL忘記密碼的解決辦法,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2017-06-06

最新評論