主頁(yè) > 知識(shí)庫(kù) > 淺析MySQL的WriteSet并行復(fù)制

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

熱門標(biāo)簽:石家莊電商外呼系統(tǒng) 日照旅游地圖標(biāo)注 申請(qǐng)外呼電話線路 南通自動(dòng)外呼系統(tǒng)軟件 廣東人工電話機(jī)器人 百度地圖圖標(biāo)標(biāo)注中心 芒果電話機(jī)器人自動(dòng)化 湖南人工外呼系統(tǒng)多少錢 信陽(yáng)穩(wěn)定外呼系統(tǒng)運(yùn)營(yíng)商

【歷史背景】

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

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

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

【庫(kù)間并發(fā)】

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

  這個(gè)理論聽(tīng)起來(lái)沒(méi)問(wèn)題,但是事實(shí)上一個(gè)實(shí)例也就一個(gè)業(yè)務(wù)庫(kù),所以這種庫(kù)間并發(fā)就沒(méi)什么作用了;也就是說(shuō)這個(gè)方式的適用場(chǎng)景比較少,針對(duì)這個(gè)不足直到“組提交”才解決!

【組提交】

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

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

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

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

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

【W(wǎng)riteSet】

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

  身為DBA的你一可以看出來(lái)這兩個(gè)事實(shí)上是可以打包到同一個(gè)組里來(lái)的,因?yàn)樗麄兓ゲ粵_突,就算打包到同一個(gè)組也不引起數(shù)據(jù)的不一致。 于是你有兩個(gè)辦法

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

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

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

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

binlog_transaction_dependency_tracking = WRITESET     # COMMIT_ORDER   
transaction_write_set_extraction  = XXHASH64

理論說(shuō)完了,下面我們看一下實(shí)踐。

【W(wǎng)riteSet實(shí)踐】

   基于WriteSet的并行復(fù)制環(huán)境怎么搭建我這里就不說(shuō)了,也就是比正常的“組提交”在master上多加兩個(gè)參數(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): 看一下組提交對(duì)上面SQL的分組情況

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

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

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

 【總結(jié)】

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

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

您可能感興趣的文章:
  • 淺析MySQL并行復(fù)制
  • 深入淺出講解MySQL的并行復(fù)制
  • MySQL5.7并行復(fù)制原理及實(shí)現(xiàn)

標(biāo)簽:阿里 天津 合肥 公主嶺 呼和浩特 沈陽(yáng) 惠州 牡丹江

巨人網(wǎng)絡(luò)通訊聲明:本文標(biāo)題《淺析MySQL的WriteSet并行復(fù)制》,本文關(guān)鍵詞  淺析,MySQL,的,WriteSet,并行,;如發(fā)現(xiàn)本文內(nèi)容存在版權(quán)問(wèn)題,煩請(qǐng)?zhí)峁┫嚓P(guān)信息告之我們,我們將及時(shí)溝通與處理。本站內(nèi)容系統(tǒng)采集于網(wǎng)絡(luò),涉及言論、版權(quán)與本站無(wú)關(guān)。
  • 相關(guān)文章
  • 下面列出與本文章《淺析MySQL的WriteSet并行復(fù)制》相關(guān)的同類信息!
  • 本頁(yè)收集關(guān)于淺析MySQL的WriteSet并行復(fù)制的相關(guān)信息資訊供網(wǎng)民參考!
  • 推薦文章