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

您的位置:首頁技術文章
文章詳情頁

MySQL5.7并行復制原理及實現

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

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

MySQL 5.7并行復制時代

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

MySQL 5.6并行復制架構

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

MySQL5.7并行復制原理及實現

在上圖的紅色框框部分就是實現并行復制的關鍵所在。在MySQL 5.6版本之前,Slave服務器上有兩個線程I/O線程和SQL線程。I/O線程負責接收二進制日志(更準確的說是二進制日志的event),SQL線程進行回放二進制日志。如果在MySQL 5.6版本開啟并行復制功能,那么SQL線程就變為了coordinator線程,coordinator線程主要負責以前兩部分的內容:

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

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

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

MySQL 5.7基于組提交的并行復制

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

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

MySQL5.7并行復制原理及實現

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

DATABASE:默認值,基于庫的并行復制方式 LOGICAL_CLOCK:基于組提交的并行復制方式支持并行復制的GTID

如何知道事務是否在一組中,又是一個問題,因為原版的MySQL并沒有提供這樣的信息。在MySQL 5.7版本中,其設計方式是將組提交的信息存放在GTID中。那么如果用戶沒有開啟GTID功能,即將參數gtid_mode設置為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,每個事務開始前也是會存在一個Anonymous_Gtid,而這GTID中就存在著組提交的信息。

LOGICAL_CLOCK

然而,通過上述的SHOW BINLOG EVENTS,我們并沒有發現有關組提交的任何信息。但是通過mysqlbinlog工具,用戶就能發現組提交的內部信息:

# 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...

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

上述的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在每次二進制日志發生rotate時更新,記錄發生rotate時的state值。其實state和offset記錄的是全局的計數值,而存在二進制日志中的僅是當前文件的相對值。使用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:記錄當前組提交中各事務的logcial_clock,代表上述mysqlbinlog中的sequence_numbe并行復制測試

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

MySQL5.7并行復制原理及實現

MySQL 5.7并行復制

并行復制配置與調優master_info_repository

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

slave_parallel_workers

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

MySQL5.7并行復制原理及實現 ​​​​​MySQL 5.7 并行復制​​​​​

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

Enhanced Multi-Threaded Slave配置

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

# slaveslave-parallel-type=LOGICAL_CLOCKslave-parallel-workers=16master_info_repository=TABLErelay_log_info_repository=TABLErelay_log_recovery=ON并行復制監控

復制的監控依舊可以通過SHOW SLAVE STATUSG,但是MySQL 5.7在performance_schema架構下多了以下這些元數據表,用戶可以更細力度的進行監控:

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)總結

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

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

到此這篇關于MySQL5.7并行復制原理及實現的文章就介紹到這了,更多相關MySQL5.7并行復制內容請搜索好吧啦網以前的文章或繼續瀏覽下面的相關文章希望大家以后多多支持好吧啦網!

標簽: MySQL 數據庫
相關文章:
日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区
国产精品chinese| 亚洲在线观看| 亚洲高清不卡| 国产日韩中文在线中文字幕| 亚洲成人精品| 欧美亚洲专区| 在线亚洲自拍| 欧美天堂在线| 蜜桃久久久久久| 日本蜜桃在线观看视频| 国产精品主播| 综合激情网...| 欧美 日韩 国产精品免费观看| 国产激情久久| 日本午夜精品一区二区三区电影| 国产女优一区| 亚洲一级影院| 国精品产品一区| 四虎国产精品免费久久| 免播放器亚洲| 99国产成+人+综合+亚洲欧美| 在线看片福利| 日本在线不卡视频一二三区| 国产精品日本| 欧美丝袜一区| 国产理论在线| 久久伊人国产| 久久亚洲国产精品尤物| 国产精品亚洲产品| 欧美在线黄色| 综合激情视频| 亚洲美女91| 蜜臀久久久久久久| 免费观看久久久4p| 久热综合在线亚洲精品| 一区在线视频观看| 美女国产一区| 亚洲精品一区三区三区在线观看| 视频二区不卡| 久久成人一区| 蜜臀a∨国产成人精品| 免费在线观看一区二区三区| 免播放器亚洲一区| 亚洲人成亚洲精品| 在线观看一区| 日韩精品第一| 日韩精品第一| 日本成人在线网站| 国产精品分类| 麻豆中文一区二区| 高清精品久久| 久久美女性网| 国产成人精品亚洲线观看| 美女精品在线观看| 欧美亚洲日本精品| 只有精品亚洲| 亚洲精品一二| 欧美精品影院| 夜夜精品视频| 日本91福利区| 91亚洲国产| 亚洲精品一二三区区别| 国产在线不卡| 黄色亚洲在线| 亚洲精品无吗| 国产亚洲精品精品国产亚洲综合| 日韩国产欧美一区二区三区| 婷婷综合激情| 91九色综合| 国产不卡av一区二区| 成人美女视频| 国产精品婷婷| 欧美+亚洲+精品+三区| 九九久久电影| 久久蜜桃精品| 午夜精品亚洲| 一区二区三区国产在线| 国产精品久一| 99久久久久| 日韩在线黄色| 国产欧美一区二区三区精品酒店| 日韩精品一二区| 红桃视频国产精品| 美女91精品| 久久av免费| 欧美va天堂| 日韩av黄色在线| 亚洲不卡系列| 欧美日韩视频免费看| 成人福利av| 日韩精品成人| 五月激情久久| 国产视频一区二区在线播放| 五月天久久久| 国产精品日韩精品在线播放| 99综合视频| 成人免费电影网址| 亚洲免费一区二区| 成人在线视频中文字幕| 久久国产麻豆精品| 日本精品影院| 久久香蕉网站| 日韩av黄色在线| 午夜精品成人av| 久久精品99国产精品日本| 色吊丝一区二区| 国产探花一区| 亚洲一二av| 婷婷综合激情| 麻豆精品国产91久久久久久| 鲁大师成人一区二区三区| 欧美日韩国产欧| 国产欧美日韩| 激情欧美亚洲| 欧美日韩免费观看视频| 国产亚洲福利| 久久久91麻豆精品国产一区| 久久精品网址| 综合欧美精品| 成人精品亚洲| 欧美二区视频| 三级小说欧洲区亚洲区| 精品深夜福利视频| 成人精品天堂一区二区三区| 日韩va欧美va亚洲va久久| 国产精品亚洲欧美一级在线| 日韩在线卡一卡二| 综合一区av| 日韩中文欧美在线| 嫩呦国产一区二区三区av| 亚洲一二av| 91中文字幕精品永久在线| 精品一级视频| 99久久亚洲精品蜜臀| 欧美成a人片免费观看久久五月天| 欧美午夜精彩| 99tv成人| 日欧美一区二区| 亚洲激精日韩激精欧美精品| 国产欧美一级| 欧美精品国产白浆久久久久| 久久人人精品| 久久婷婷国产| 亚洲在线成人| 久久激情一区| 在线精品一区二区| 免费成人性网站| 国产精品网在线观看| 亚洲69av| 久久蜜桃精品| 欧产日产国产精品视频| 一区二区三区国产盗摄| 合欧美一区二区三区| 国产日韩欧美| 日韩精品三级| 99久久精品网站| 亚洲女同一区| 日本成人在线视频网站| 中文字幕乱码亚洲无线精品一区| 欧美男人天堂| 欧洲毛片在线视频免费观看| 欧美日韩1区| 国产伦理一区| 亚洲一级特黄| aa国产精品| 视频在线不卡免费观看| 成人在线网站| 国产精品yjizz视频网| 精品久久久亚洲| 欧美粗暴jizz性欧美20| 免费成人在线观看| 亚洲激情中文| 三上亚洲一区二区| 91精品国产一区二区在线观看 | 免费精品一区| 视频在线观看91| 国产欧美日韩精品高清二区综合区| 亚洲自拍另类| 免费不卡在线观看| 精品久久电影| 久久国产精品成人免费观看的软件| 91一区二区| 黄色在线网站噜噜噜| 免播放器亚洲一区| 先锋影音国产一区| 中文字幕av一区二区三区人| 在线观看精品| 99久久婷婷| 亚洲综合电影| 亚洲免费专区| av高清不卡| 国产精品igao视频网网址不卡日韩| 欧美日韩中文一区二区| 精品视频免费| 免费精品视频| 国产高清一区| 麻豆中文一区二区| 国产精品调教视频| 免费精品国产的网站免费观看| 久久爱www.|