日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区

您的位置:首頁技術(shù)文章
文章詳情頁

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

瀏覽:29日期:2023-10-02 11:16:08

稍微了解過一點(diǎn)的數(shù)據(jù)的運(yùn)維就知道MySQL 5.5以及之前是單SQL線程回放,如果Master QPS稍微高點(diǎn),從上就有延遲了,5.6是基于庫的并行回放機(jī)制,只有當(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)得到了極大的改進(jìn),甚至在Inside君所在的網(wǎng)易電商應(yīng)用中已經(jīng)完全消除了之前延遲長達(dá)幾小時的問題。然而,發(fā)現(xiàn)還是有很多小伙伴并不了解這個足以載入史冊的“偉大”的特性,故作分享。總之,5.7版本后,復(fù)制延遲問題永不存在。

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

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

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

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

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

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

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

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

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

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

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

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

DATABASE:默認(rèn)值,基于庫的并行復(fù)制方式 LOGICAL_CLOCK:基于組提交的并行復(fù)制方式支持并行復(fù)制的GTID

如何知道事務(wù)是否在一組中,又是一個問題,因?yàn)樵娴腗ySQL并沒有提供這樣的信息。在MySQL 5.7版本中,其設(shè)計方式是將組提交的信息存放在GTID中。那么如果用戶沒有開啟GTID功能,即將參數(shù)gtid_mode設(shè)置為OFF呢?故MySQL 5.7又引入了稱之為Anonymous_Gtid的二進(jìn)制日志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)較之原來的二進(jìn)制日志內(nèi)容多了last_committed和sequence_number,last_committed表示事務(wù)提交的時候,上次事務(wù)提交的編號,如果事務(wù)具有相同的last_committed,表示這些事務(wù)都在一組內(nèi),可以進(jìn)行并行的回放。例如上述last_committed為0的事務(wù)有6個,表示組提交時提交了6個事務(wù),而這6個事務(wù)在從機(jī)是可以進(jìn)行并行回放的。

上述的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在每次二進(jìn)制日志發(fā)生rotate時更新,記錄發(fā)生rotate時的state值。其實(shí)state和offset記錄的是全局的計數(shù)值,而存在二進(jìn)制日志中的僅是當(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個線程下的性能最好,從機(jī)的QPS可以達(dá)到25000以上,進(jìn)一步增加并行執(zhí)行的線程至32并沒有帶來更高的提升。而原單線程回放的QPS僅在4000左右,可見MySQL 5.7 MTS帶來的性能提升,而由于測試的是單表,所以MySQL 5.6的MTS機(jī)制則完全無能為力了。

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

MySQL 5.7并行復(fù)制

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

開啟MTS功能后,務(wù)必將參數(shù)master_info_repostitory設(shè)置為TABLE,這樣性能可以有50%~80%的提升。這是因?yàn)椴⑿袕?fù)制開啟后對于元master.info這個文件的更新將會大幅提升,資源的競爭也會變大。在之前InnoSQL的版本中,添加了參數(shù)來控制刷新master.info這個文件的頻率,甚至可以不刷新這個文件。因?yàn)樗⑿逻@個文件是沒有必要的,即根據(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線程進(jìn)行回放,也是單線程復(fù)制。然而,這兩種性能卻又有一些的區(qū)別,因?yàn)槎嗔艘淮蝐oordinator線程的轉(zhuǎn)發(fā),因此slave_parallel_workers=1的性能反而比0還要差,在Inside君的測試下還有20%左右的性能下降,如下圖所示:

MySQL5.7并行復(fù)制原理及實(shí)現(xiàn) ​​​​​MySQL 5.7 并行復(fù)制​​​​​

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

Enhanced Multi-Threaded Slave配置

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

# slaveslave-parallel-type=LOGICAL_CLOCKslave-parallel-workers=16master_info_repository=TABLErelay_log_info_repository=TABLErelay_log_recovery=ON并行復(fù)制監(jiān)控

復(fù)制的監(jiān)控依舊可以通過SHOW SLAVE STATUSG,但是MySQL 5.7在performance_schema架構(gòu)下多了以下這些元數(shù)據(jù)表,用戶可以更細(xì)力度的進(jìn)行監(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長達(dá)數(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ù)制原理及實(shí)現(xiàn)的文章就介紹到這了,更多相關(guān)MySQL5.7并行復(fù)制內(nèi)容請搜索好吧啦網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持好吧啦網(wǎng)!

標(biāo)簽: MySQL 數(shù)據(jù)庫
相關(guān)文章:
日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区
99精品电影| 日韩av午夜在线观看| 五月婷婷亚洲| 国产欧美日韩一级| 国产女人18毛片水真多18精品| 欧美日韩一区二区三区视频播放| 久久精品中文| 日韩欧美不卡| 亚洲精品99| 亚洲精品看片| 日韩一区二区三区免费视频| 国产精品极品在线观看| 美女视频黄久久| 日韩中文在线播放| 免费国产亚洲视频| 日韩在线a电影| 悠悠资源网久久精品| 亚洲激情二区| 久久国产高清| 色婷婷亚洲mv天堂mv在影片| 999久久久精品国产| 日韩福利一区| 亚洲精品一区二区在线看| 婷婷六月综合| 麻豆9191精品国产| 五月国产精品| 国产日韩欧美中文在线| av日韩中文| 亚洲2区在线| 911亚洲精品| 国产亚洲精品美女久久久久久久久久| 国产精品网站在线看| 粉嫩av一区二区三区四区五区| 日韩一区二区久久| 精品一区二区三区亚洲| 免费国产自线拍一欧美视频| 亚洲精选av| 欧美日韩亚洲在线观看| 91精品福利| 亚洲综合专区| 国产精品宾馆| 日韩精品欧美| 视频一区二区国产| 日韩av中文在线观看| 久久久久久久久丰满| 老鸭窝亚洲一区二区三区| 免费成人在线视频观看| 欧美三级第一页| 91综合网人人| 天使萌一区二区三区免费观看| 亚洲一区二区三区在线免费| 国产欧美日韩综合一区在线播放| 精品欠久久久中文字幕加勒比| 日本精品不卡| 亚洲中字黄色| 欧美日韩亚洲一区| 神马久久午夜| 蜜芽一区二区三区| 欧美激情一区| 欧美美女一区| 日韩高清国产一区在线| 国产精品网在线观看| 蜜臀久久精品| 少妇精品久久久一区二区三区| 久久影院资源站| 黄色精品网站| 免费看一区二区三区| 欧美福利专区| 国产乱人伦丫前精品视频 | 亚洲香蕉网站| 日韩美女国产精品| 国产美女精品视频免费播放软件| 久久精品理论片| 精品一区二区三区在线观看视频| 99精品一区| 亚洲性视频h| 综合日韩av| 五月国产精品| 久久国产日韩| 欧美日韩一区自拍| 99日韩精品| 日本欧美国产| 午夜精品福利影院| 久久久久久久久丰满| 国产欧美另类| 三级在线观看一区二区 | 亚洲日本久久| 亚洲一级少妇| 国产精品久久乐| 视频一区二区国产| 欧美日中文字幕| 美女久久精品| 国产亚洲电影| 在线免费观看亚洲| 精品在线91| sm久久捆绑调教精品一区| 欧美日韩黄网站| 蜜臀久久99精品久久久久宅男 | 日韩不卡一区| 久久激五月天综合精品| 婷婷亚洲五月| 日韩免费在线| 久久超级碰碰| 日本aⅴ免费视频一区二区三区| 九一精品国产| 亚洲午夜天堂| 久久亚州av| 国产欧美综合一区二区三区| 亚洲乱码视频| 亚洲男女自偷自拍| 美女网站一区| 国内激情久久| 1000部精品久久久久久久久| 黄色在线网站噜噜噜| 国产精品igao视频网网址不卡日韩| 好吊视频一区二区三区四区| 91欧美在线| 久久亚洲人体| 另类欧美日韩国产在线| 国产伦精品一区二区三区视频 | 久久av综合| 国产精品一区二区精品视频观看| 色综合视频一区二区三区日韩| 免费一级片91| 亚洲我射av| 国产视频一区欧美| 亚洲一区观看| 99国产精品久久久久久久成人热| 久久精品影视| 亚洲电影有码| 欧美1区2区3区| 99香蕉国产精品偷在线观看| 国产综合视频| 亚洲激情欧美| 久久精品青草| 伊人久久亚洲热| 亚洲中字黄色| 日韩在线观看中文字幕| 日韩高清不卡一区| 国产精品欧美三级在线观看 | 麻豆精品蜜桃| 久久精品91| 午夜影院欧美| 蘑菇福利视频一区播放| 亚洲欧美日韩国产| 蜜臀av在线播放一区二区三区| 久久亚洲电影| 日韩三级视频| 国产日韩一区二区三区在线| 国产精品一级| 在线看片国产福利你懂的| 日韩激情一区| 人人香蕉久久| 国产亚洲毛片在线| 日本不卡视频一二三区| 国产精品三级| 成人福利av| 伊人久久亚洲热| 日本aⅴ亚洲精品中文乱码| 国产乱码精品一区二区三区亚洲人| 麻豆极品一区二区三区| 色乱码一区二区三区网站| 肉色欧美久久久久久久免费看 | 午夜久久av | 亚洲一区二区网站| 日韩av中文字幕一区二区| 精品免费视频| 激情视频一区二区三区| 日韩一区欧美二区| 国产精品magnet| 久久婷婷久久| 中文字幕av亚洲精品一部二部| 国产欧美在线| 久久久久久久久99精品大| 亚洲视频电影在线| 国产精品一站二站| 不卡福利视频| 影音先锋久久精品| 久久香蕉网站| 国产精品视区| 麻豆精品在线观看| 亚洲婷婷免费| 欧美日韩99| 亚洲精品.com| 日韩精品a在线观看91| 精品视频高潮| 老牛影视一区二区三区| 精品一区二区三区中文字幕视频 | 欧美在线网站| 欧美亚洲一级| 99精品一区| 久久精品99国产精品| 91tv亚洲精品香蕉国产一区| 亚洲精品系列| 欧美sss在线视频| 日韩一区二区三区四区五区| 日韩在线中文| 欧美亚洲免费| se01亚洲视频| 欧美伊人久久|