校园春色亚洲色图_亚洲视频分类_中文字幕精品一区二区精品_麻豆一区区三区四区产品精品蜜桃

主頁 > 知識庫 > MySQL5.7并行復(fù)制原理及實現(xiàn)

MySQL5.7并行復(fù)制原理及實現(xiàn)

熱門標(biāo)簽:html地圖標(biāo)注并導(dǎo)航 北京金倫外呼系統(tǒng) 南太平洋地圖標(biāo)注 武漢電銷機器人電話 催天下外呼系統(tǒng) 呂梁外呼系統(tǒng) 400電話變更申請 大豐地圖標(biāo)注app 400電話辦理服務(wù)價格最實惠

稍微了解過一點的數(shù)據(jù)的運維就知道MySQL 5.5以及之前是單SQL線程回放,如果Master QPS稍微高點,從上就有延遲了,5.6是基于庫的并行回放機制,只有當(dāng)多個庫的話才有復(fù)制才有優(yōu)勢,而5.7是基于組的并行回放,同一組的事務(wù)可以并行重放從而解決延遲問題。

MySQL 5.7并行復(fù)制時代

眾所周知,MySQL的復(fù)制延遲是一直被詬病的問題之一,然而在Inside君之前的兩篇博客中(1,2)中都已經(jīng)提到了MySQL 5.7版本已經(jīng)支持“真正”的并行復(fù)制功能,官方稱為為enhanced multi-threaded slave(簡稱MTS),因此復(fù)制延遲問題已經(jīng)得到了極大的改進,甚至在Inside君所在的網(wǎng)易電商應(yīng)用中已經(jīng)完全消除了之前延遲長達幾小時的問題。然而,發(fā)現(xiàn)還是有很多小伙伴并不了解這個足以載入史冊的“偉大”的特性,故作分享。總之,5.7版本后,復(fù)制延遲問題永不存在。

MySQL 5.6并行復(fù)制架構(gòu)

誠然,MySQL 5.6版本也支持所謂的并行復(fù)制,但是其并行只是基于schema的,也就是基于庫的。如果用戶的MySQL數(shù)據(jù)庫實例中存在多個schema,對于從機復(fù)制的速度的確可以有比較大的幫助。MySQL 5.6并行復(fù)制的架構(gòu)如下所示:

在上圖的紅色框框部分就是實現(xiàn)并行復(fù)制的關(guān)鍵所在。在MySQL 5.6版本之前,Slave服務(wù)器上有兩個線程I/O線程和SQL線程。I/O線程負責(zé)接收二進制日志(更準確的說是二進制日志的event),SQL線程進行回放二進制日志。如果在MySQL 5.6版本開啟并行復(fù)制功能,那么SQL線程就變?yōu)榱薱oordinator線程,coordinator線程主要負責(zé)以前兩部分的內(nèi)容:

  • 若判斷可以并行執(zhí)行,那么選擇worker線程執(zhí)行事務(wù)的二進制日志
  • 若判斷不可以并行執(zhí)行,如該操作是DDL,亦或者是事務(wù)跨schema操作,則等待所有的worker線程執(zhí)行完成之后,再執(zhí)行當(dāng)前的日志

這意味著coordinator線程并不是僅將日志發(fā)送給worker線程,自己也可以回放日志,但是所有可以并行的操作交付由worker線程完成。coordinator線程與worker是典型的生產(chǎn)者與消費者模型。

上述機制實現(xiàn)了基于schema的并行復(fù)制存在兩個問題,首先是crash safe功能不好做,因為可能之后執(zhí)行的事務(wù)由于并行復(fù)制的關(guān)系先完成執(zhí)行,那么當(dāng)發(fā)生crash的時候,這部分的處理邏輯是比較復(fù)雜的。從代碼上看,5.6這里引入了Low-Water-Mark標(biāo)記來解決該問題,從設(shè)計上看,其是希望借助于日志的冪等性來解決該問題,不過5.6的二進制日志回放還不能實現(xiàn)冪等性。另一個最為關(guān)鍵的問題是這樣設(shè)計的并行復(fù)制效果并不高,如果用戶實例僅有一個庫,那么就無法實現(xiàn)并行回放,甚至性能會比原來的單線程更差。而單庫多表是比多庫多表更為常見的一種情形。

MySQL 5.7基于組提交的并行復(fù)制

MySQL 5.7才可稱為真正的并行復(fù)制,這其中最為主要的原因就是slave服務(wù)器的回放與主機是一致的即master服務(wù)器上是怎么并行執(zhí)行的slave上就怎樣進行并行回放。

MySQL 5.7并行復(fù)制的思想簡單易懂,一言以蔽之:一個組提交的事務(wù)都是可以并行回放,因為這些事務(wù)都已進入到事務(wù)的prepare階段,則說明事務(wù)之間沒有任何沖突(否則就不可能提交)。

為了兼容MySQL 5.6基于庫的并行復(fù)制,5.7引入了新的變量slave-parallel-type,其可以配置的值有:

  • DATABASE:默認值,基于庫的并行復(fù)制方式
  • LOGICAL_CLOCK:基于組提交的并行復(fù)制方式

支持并行復(fù)制的GTID

如何知道事務(wù)是否在一組中,又是一個問題,因為原版的MySQL并沒有提供這樣的信息。在MySQL 5.7版本中,其設(shè)計方式是將組提交的信息存放在GTID中。那么如果用戶沒有開啟GTID功能,即將參數(shù)gtid_mode設(shè)置為OFF呢?故MySQL 5.7又引入了稱之為Anonymous_Gtid的二進制日志event類型,如:

mysql> SHOW BINLOG EVENTS in 'mysql-bin.000006';
 +------------------+-----+----------------+-----------+-------------+-----------------------------------------------+
 | Log_name | Pos | Event_type | Server_id | End_log_pos | Info |
 +------------------+-----+----------------+-----------+-------------+-----------------------------------------------+
 | mysql-bin.000006 | 4 | Format_desc | 88 | 123 | Server ver: 5.7.7-rc-debug-log, Binlog ver: 4 |
 | mysql-bin.000006 | 123 | Previous_gtids | 88 | 194 | f11232f7-ff07-11e4-8fbb-00ff55e152c6:1-2 |
 | mysql-bin.000006 | 194 | Anonymous_Gtid | 88 | 259 | SET @@SESSION.GTID_NEXT= 'ANONYMOUS' |
 | mysql-bin.000006 | 259 | Query | 88 | 330 | BEGIN |
 | mysql-bin.000006 | 330 | Table_map | 88 | 373 | table_id: 108 (aaa.t) |
 | mysql-bin.000006 | 373 | Write_rows | 88 | 413 | table_id: 108 flags: STMT_END_F |
 .....

這意味著在MySQL 5.7版本中即使不開啟GTID,每個事務(wù)開始前也是會存在一個Anonymous_Gtid,而這GTID中就存在著組提交的信息。

LOGICAL_CLOCK

然而,通過上述的SHOW BINLOG EVENTS,我們并沒有發(fā)現(xiàn)有關(guān)組提交的任何信息。但是通過mysqlbinlog工具,用戶就能發(fā)現(xiàn)組提交的內(nèi)部信息:

# mysqlbinlog mysql-bin.0000006 | grep last_committed
#150520 14:23:11 server id 88 end_log_pos 259 CRC32 0x4ead9ad6 GTID last_committed=0 sequence_number=1
#150520 14:23:11 server id 88 end_log_pos 1483 CRC32 0xdf94bc85 GTID last_committed=0 sequence_number=2
#150520 14:23:11 server id 88 end_log_pos 2708 CRC32 0x0914697b GTID last_committed=0 sequence_number=3
#150520 14:23:11 server id 88 end_log_pos 3934 CRC32 0xd9cb4a43 GTID last_committed=0 sequence_number=4
#150520 14:23:11 server id 88 end_log_pos 5159 CRC32 0x06a6f531 GTID last_committed=0 sequence_number=5
#150520 14:23:11 server id 88 end_log_pos 6386 CRC32 0xd6cae930 GTID last_committed=0 sequence_number=6
#150520 14:23:11 server id 88 end_log_pos 7610 CRC32 0xa1ea531c GTID last_committed=6 sequence_number=7
...

可以發(fā)現(xiàn)較之原來的二進制日志內(nèi)容多了last_committed和sequence_number,last_committed表示事務(wù)提交的時候,上次事務(wù)提交的編號,如果事務(wù)具有相同的last_committed,表示這些事務(wù)都在一組內(nèi),可以進行并行的回放。例如上述last_committed為0的事務(wù)有6個,表示組提交時提交了6個事務(wù),而這6個事務(wù)在從機是可以進行并行回放的。

上述的last_committed和sequence_number代表的就是所謂的LOGICAL_CLOCK。先來看源碼中對于LOGICAL_CLOCK的定義:

class Logical_clock
 {
 private:
 int64 state;
 /*
 Offset is subtracted from the actual "absolute time" value at
 logging a replication event. That is the event holds logical
 timestamps in the "relative" format. They are meaningful only in
 the context of the current binlog.
 The member is updated (incremented) per binary log rotation.
 */
 int64 offset;
 ......

state是一個自增的值,offset在每次二進制日志發(fā)生rotate時更新,記錄發(fā)生rotate時的state值。其實state和offset記錄的是全局的計數(shù)值,而存在二進制日志中的僅是當(dāng)前文件的相對值。使用LOGICAL_CLOCK的場景如下:

class MYSQL_BIN_LOG: public TC_LOG
 {
 ...
 public:
 /* Committed transactions timestamp */
 Logical_clock max_committed_transaction;
 /* "Prepared" transactions timestamp */
 Logical_clock transaction_counter;
 ...

可以看到在類MYSQL_BIN_LOG中定義了兩個Logical_clock的變量:

  • max_c ommitted_transaction:記錄上次組提交時的logical_clock,代表上述mysqlbinlog中的last_committed
  • transaction_counter:記錄當(dāng)前組提交中各事務(wù)的logcial_clock,代表上述mysqlbinlog中的sequence_numbe

并行復(fù)制測試

下圖顯示了開啟MTS后,slave服務(wù)器的QPS。測試的工具是sysbench的單表全update測試,測試結(jié)果顯示在16個線程下的性能最好,從機的QPS可以達到25000以上,進一步增加并行執(zhí)行的線程至32并沒有帶來更高的提升。而原單線程回放的QPS僅在4000左右,可見MySQL 5.7 MTS帶來的性能提升,而由于測試的是單表,所以MySQL 5.6的MTS機制則完全無能為力了。

 

MySQL 5.7并行復(fù)制

并行復(fù)制配置與調(diào)優(yōu)

master_info_repository

開啟MTS功能后,務(wù)必將參數(shù)master_info_repostitory設(shè)置為TABLE,這樣性能可以有50%~80%的提升。這是因為并行復(fù)制開啟后對于元master.info這個文件的更新將會大幅提升,資源的競爭也會變大。在之前InnoSQL的版本中,添加了參數(shù)來控制刷新master.info這個文件的頻率,甚至可以不刷新這個文件。因為刷新這個文件是沒有必要的,即根據(jù)master-info.log這個文件恢復(fù)本身就是不可靠的。在MySQL 5.7中,Inside君推薦將master_info_repository設(shè)置為TABLE,來減小這部分的開銷。

slave_parallel_workers

若將slave_parallel_workers設(shè)置為0,則MySQL 5.7退化為原單線程復(fù)制,但將slave_parallel_workers設(shè)置為1,則SQL線程功能轉(zhuǎn)化為coordinator線程,但是只有1個worker線程進行回放,也是單線程復(fù)制。然而,這兩種性能卻又有一些的區(qū)別,因為多了一次coordinator線程的轉(zhuǎn)發(fā),因此slave_parallel_workers=1的性能反而比0還要差,在Inside君的測試下還有20%左右的性能下降,如下圖所示:

​​​​​MySQL 5.7 并行復(fù)制​​​​​

這里其中引入了另一個問題,如果主機上的負載不大,那么組提交的效率就不高,很有可能發(fā)生每組提交的事務(wù)數(shù)量僅有1個,那么在從機的回放時,雖然開啟了并行復(fù)制,但會出現(xiàn)性能反而比原先的單線程還要差的現(xiàn)象,即延遲反而增大了。聰明的小伙伴們,有想過對這個進行優(yōu)化嗎?

Enhanced Multi-Threaded Slave配置

說了這么多,要開啟enhanced multi-threaded slave其實很簡單,只需根據(jù)如下設(shè)置:

# slave
slave-parallel-type=LOGICAL_CLOCK
slave-parallel-workers=16
master_info_repository=TABLE
relay_log_info_repository=TABLE
relay_log_recovery=ON

并行復(fù)制監(jiān)控

復(fù)制的監(jiān)控依舊可以通過SHOW SLAVE STATUS\G,但是MySQL 5.7在performance_schema架構(gòu)下多了以下這些元數(shù)據(jù)表,用戶可以更細力度的進行監(jiān)控:

mysql> show tables like 'replication%';
 +---------------------------------------------+
 | Tables_in_performance_schema (replication%) |
 +---------------------------------------------+
 | replication_applier_configuration |
 | replication_applier_status |
 | replication_applier_status_by_coordinator |
 | replication_applier_status_by_worker |
 | replication_connection_configuration |
 | replication_connection_status |
 | replication_group_member_stats |
 | replication_group_members |
 +---------------------------------------------+
 8 rows in set (0.00 sec)

總結(jié)

MySQL 5.7推出的Enhanced Multi-Threaded Slave解決了困擾MySQL長達數(shù)十年的復(fù)制延遲問題,再次提醒一些無知的PostgreSQL用戶,不要停留在之前對于MySQL的印象,物理復(fù)制也不一定肯定比邏輯復(fù)制有優(yōu)勢,而MySQL 5.7的MTS已經(jīng)完全可以解決延遲問題了。

Reference:

- http://www.ttlsa.com/mysql/mysql-5-7-enhanced-multi-thread-salve/

- http://moguhu.com/article/detail?articleId=129

- https://www.codercto.com/a/63073.html

- https://dev.mysql.com/doc/refman/5.7/en/replication-options-replica.html#sysvar_slave_preserve_commit_order

到此這篇關(guān)于MySQL5.7并行復(fù)制原理及實現(xiàn)的文章就介紹到這了,更多相關(guān)MySQL5.7并行復(fù)制內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

您可能感興趣的文章:
  • 詳解MySQL主從復(fù)制及讀寫分離
  • MySQL主從復(fù)制斷開的常用修復(fù)方法
  • MySQL復(fù)制問題的三個參數(shù)分析
  • MySql主從復(fù)制機制全面解析
  • MySQL系列之十三 MySQL的復(fù)制

標(biāo)簽:徐州 迪慶 麗水 龍巖 南充 無錫 自貢 西寧

巨人網(wǎng)絡(luò)通訊聲明:本文標(biāo)題《MySQL5.7并行復(fù)制原理及實現(xiàn)》,本文關(guān)鍵詞  MySQL5.7,并行,復(fù)制,原理,;如發(fā)現(xiàn)本文內(nèi)容存在版權(quán)問題,煩請?zhí)峁┫嚓P(guān)信息告之我們,我們將及時溝通與處理。本站內(nèi)容系統(tǒng)采集于網(wǎng)絡(luò),涉及言論、版權(quán)與本站無關(guān)。
  • 相關(guān)文章
  • 下面列出與本文章《MySQL5.7并行復(fù)制原理及實現(xiàn)》相關(guān)的同類信息!
  • 本頁收集關(guān)于MySQL5.7并行復(fù)制原理及實現(xiàn)的相關(guān)信息資訊供網(wǎng)民參考!
  • 推薦文章
    校园春色亚洲色图_亚洲视频分类_中文字幕精品一区二区精品_麻豆一区区三区四区产品精品蜜桃
    91香蕉视频污| 天天综合网天天综合色| 亚洲精品在线电影| 精品电影一区二区三区| 91麻豆精品国产综合久久久久久| 在线中文字幕一区二区| 99re这里都是精品| 91论坛在线播放| 欧美专区在线观看一区| 欧美伦理视频网站| 欧美一级黄色录像| 久久综合狠狠综合久久激情| 国产日韩欧美综合一区| 国产精品久久久久久妇女6080| 国产精品剧情在线亚洲| 自拍偷拍国产亚洲| 亚洲gay无套男同| 久久精品国产精品亚洲红杏 | 色综合天天综合在线视频| 91网址在线看| 欧美精品亚洲一区二区在线播放| 欧美一区日韩一区| 久久久www免费人成精品| 成人免费视频在线观看| 午夜婷婷国产麻豆精品| 国产麻豆精品在线观看| 91网址在线看| 精品美女一区二区| 亚洲天堂a在线| 日本vs亚洲vs韩国一区三区 | a美女胸又www黄视频久久| 在线视频一区二区三| 日韩精品中文字幕在线一区| 国产欧美一区二区精品婷婷| 亚洲一区二区3| 国产激情视频一区二区在线观看| 欧美优质美女网站| 国产日产精品一区| 亚洲v日本v欧美v久久精品| 丁香网亚洲国际| 69久久99精品久久久久婷婷 | 婷婷丁香激情综合| 色综合久久88色综合天天免费| 久久9热精品视频| 国产成人高清在线| 欧美一区午夜精品| 亚洲免费伊人电影| 国产精品18久久久久| 欧美日韩综合一区| 国产精品家庭影院| 久久se精品一区精品二区| 99久久777色| 日本一区二区综合亚洲| 七七婷婷婷婷精品国产| 欧美日韩国产电影| 一级特黄大欧美久久久| 99热在这里有精品免费| 欧美激情在线一区二区| 国产一区二区在线视频| 欧美一区二区成人6969| 五月天亚洲婷婷| 一本色道久久加勒比精品| 亚洲精品国产无天堂网2021 | 欧美日韩精品高清| 亚洲欧洲国产日本综合| 丁香六月久久综合狠狠色| 日韩片之四级片| 免费亚洲电影在线| 欧美色中文字幕| 亚洲一区二区欧美激情| 在线观看日韩一区| 亚洲一区二区三区在线播放| 91麻豆免费在线观看| 亚洲美女区一区| 91在线国产福利| 亚洲精品日日夜夜| 欧美在线短视频| 日精品一区二区三区| 日韩一区二区电影在线| 午夜国产精品一区| 欧美蜜桃一区二区三区| 视频一区视频二区中文| 在线播放国产精品二区一二区四区| 亚洲444eee在线观看| 日韩欧美一二三四区| 国产一区二区三区最好精华液| 精品福利视频一区二区三区| 国产精品影视网| 亚洲日本韩国一区| 欧美日韩aaa| 狠狠色狠狠色综合日日91app| 欧美videossexotv100| 国产精品一区二区x88av| 成人免费视频在线观看| 欧美情侣在线播放| 国产精品一区不卡| 亚洲激情图片一区| 日韩一区二区视频在线观看| 国产成人99久久亚洲综合精品| 亚洲免费在线播放| 欧美成人官网二区| av在线免费不卡| 日本欧美韩国一区三区| 国产清纯在线一区二区www| 91麻豆swag| 久久机这里只有精品| 国产精品美女一区二区三区| 欧美日韩一区小说| 风间由美一区二区av101| 一区二区欧美视频| 精品欧美黑人一区二区三区| 99国产精品国产精品毛片| 日本成人超碰在线观看| 亚洲视频一区二区免费在线观看 | 美国av一区二区| 日韩片之四级片| 91免费国产在线| 国产在线观看一区二区| 亚洲精品高清视频在线观看| 久久久精品tv| 久久久久亚洲蜜桃| 欧美三日本三级三级在线播放| 青青草视频一区| 一区二区三区在线免费视频| 欧美成人a在线| 91麻豆精品国产91久久久久| 91丨九色丨黑人外教| 国产精品456露脸| 婷婷综合另类小说色区| 一区二区国产视频| 国产精品久久久久久久久果冻传媒| 欧美一区二区在线视频| 色诱视频网站一区| 97久久人人超碰| 成人精品鲁一区一区二区| 久久精品国产99国产| 午夜精品久久一牛影视| 亚洲五码中文字幕| 97精品国产97久久久久久久久久久久 | 99国产精品99久久久久久| 久久成人av少妇免费| 午夜久久久久久久久久一区二区| 亚洲色图自拍偷拍美腿丝袜制服诱惑麻豆| 欧美一级日韩免费不卡| 欧美日韩国产电影| 欧美另类久久久品| 欧美久久久久久蜜桃| 欧美色大人视频| 欧美精品久久99久久在免费线| 91搞黄在线观看| 欧美日韩日日骚| 欧美一区二区三区不卡| 日韩三级视频在线观看| 欧美日韩成人在线| 欧美日韩高清在线播放| 欧美日韩高清在线| 日韩欧美自拍偷拍| 亚洲福利电影网| 国产日本欧洲亚洲| 日韩三级伦理片妻子的秘密按摩| 91免费版pro下载短视频| av中文字幕一区| 不卡电影免费在线播放一区| 91在线精品一区二区| 色播五月激情综合网| 欧美日韩一区高清| 日韩欧美一区二区久久婷婷| 久久久久99精品国产片| 中文天堂在线一区| 亚洲国产成人精品视频| 麻豆成人在线观看| 成人黄色电影在线 | 欧美大片免费久久精品三p| 久久综合久久99| 亚洲欧美一区二区三区久本道91 | 欧美精选在线播放| 日韩三级伦理片妻子的秘密按摩| 久久久久久一级片| 亚洲自拍偷拍欧美| 国产一区啦啦啦在线观看| 成人激情校园春色| 欧美性猛交一区二区三区精品| 91精品国产福利| 国产精品欧美一级免费| 亚洲国产欧美另类丝袜| 国产一区二区不卡| 91成人网在线| 欧美中文字幕不卡| 91精品国产综合久久久蜜臀粉嫩 | 蜜桃精品视频在线观看| 国产成人小视频| 欧美日韩精品久久久| 久久男人中文字幕资源站| 国产精品不卡在线观看| 麻豆高清免费国产一区| 欧美在线小视频| 亚洲国产精品成人综合| 欧美aaaaaa午夜精品| 色哟哟一区二区在线观看| 久久久久亚洲综合|