色哟哟视频在线观看-色哟哟视频在线-色哟哟欧美15最新在线-色哟哟免费在线观看-国产l精品国产亚洲区在线观看-国产l精品国产亚洲区久久

0
  • 聊天消息
  • 系統(tǒng)消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會員中心
創(chuàng)作中心

完善資料讓更多小伙伴認識你,還能領取20積分哦,立即完善>

3天內不再提示

MySQL 5.7并行復制實現原理與調優(yōu)

馬哥Linux運維 ? 來源:tlsa.com ? 2022-12-23 14:52 ? 次閱讀

MySQL 5.7并行復制時代

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

MySQL 5.6并行復制架構

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

325f99e0-828c-11ed-8abf-dac502259ad0.png

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

若判斷可以并行執(zhí)行,那么選擇worker線程執(zhí)行事務的二進制日志

若判斷不可以并行執(zhí)行,如該操作是DDL,亦或者是事務跨schema操作,則等待所有的worker線程執(zhí)行完成之后,再執(zhí)行當前的日志 這意味著coordinator線程并不是僅將日志發(fā)送給worker線程,自己也可以回放日志,但是所有可以并行的操作交付由worker線程完成。coordinator線程與worker是典型的生產者與消費者模型。

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

MySQL 5.7并行復制原理

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

MySQL 5.7才可稱為真正的并行復制,這其中最為主要的原因就是slave服務器的回放與主機是一致的即master服務器上是怎么并行執(zhí)行的slave上就怎樣進行并行回放。不再有庫的并行復制限制,對于二進制日志格式也無特殊的要求(基于庫的并行復制也沒有要求)。

從MySQL官方來看,其并行復制的原本計劃是支持表級的并行復制和行級的并行復制,行級的并行復制通過解析ROW格式的二進制日志的方式來完成,WL#4648。但是最終出現給小伙伴的確是在開發(fā)計劃中稱為:MTS: Prepared transactions slave parallel applier,可見:WL#6314。該并行復制的思想最早是由MariaDB的Kristain提出,并已在MariaDB 10中出現,相信很多選擇MariaDB的小伙伴最為看重的功能之一就是并行復制。

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

為了兼容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>SHOWBINLOGEVENTSin'mysql-bin.000006';
+------------------+-----+----------------+-----------+-------------+-----------------------------------------------+
|Log_name|Pos|Event_type|Server_id|End_log_pos|Info|
+------------------+-----+----------------+-----------+-------------+-----------------------------------------------+
|mysql-bin.000006|4|Format_desc|88|123|Serverver:5.7.7-rc-debug-log,Binlogver: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:108flags:STMT_END_F|
.....

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

LOGICAL_CLOCK

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

root@localhost:~#mysqlbinlogmysql-bin.0000006|greplast_committed
#1505201411serverid88end_log_pos259CRC320x4ead9ad6GTIDlast_committed=0sequence_number=1
#1505201411serverid88end_log_pos1483CRC320xdf94bc85GTIDlast_committed=0sequence_number=2
#1505201411serverid88end_log_pos2708CRC320x0914697bGTIDlast_committed=0sequence_number=3
#1505201411serverid88end_log_pos3934CRC320xd9cb4a43GTIDlast_committed=0sequence_number=4
#1505201411serverid88end_log_pos5159CRC320x06a6f531GTIDlast_committed=0sequence_number=5
#1505201411serverid88end_log_pos6386CRC320xd6cae930GTIDlast_committed=0sequence_number=6
#1505201411serverid88end_log_pos7610CRC320xa1ea531cGTIDlast_committed=6sequence_number=7
...

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

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

classLogical_clock
{
private:
int64state;
/*
Offsetissubtractedfromtheactual"absolutetime"valueat
loggingareplicationevent.Thatistheeventholdslogical
timestampsinthe"relative"format.Theyaremeaningfulonlyin
thecontextofthecurrentbinlog.
Thememberisupdated(incremented)perbinarylogrotation.
*/
int64offset;
......

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

classMYSQL_BIN_LOG:publicTC_LOG
{
...
public:
/*Committedtransactionstimestamp*/
Logical_clockmax_committed_transaction;
/*"Prepared"transactionstimestamp*/
Logical_clocktransaction_counter;
...

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

max_c ommitted_transaction:記錄上次組提交時的logical_clock,代表上述mysqlbinlog中的last_committed

transaction_counter:記錄當前組提交中各事務的logcial_clock,代表上述mysqlbinlog中的sequence_number

并行復制測試

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

327667e2-828c-11ed-8abf-dac502259ad0.jpg

并行復制配置與調優(yōu)

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線程進行回放,也是單線程復制。然而,這兩種性能卻又有一些的區(qū)別,因為多了一次coordinator線程的轉發(fā),因此slave_parallel_workers=1的性能反而比0還要差,在Inside君的測試下還有20%左右的性能下降,如下圖所示:

328569e0-828c-11ed-8abf-dac502259ad0.jpg

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

Enhanced Multi-Threaded Slave配置

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

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

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

mysql>showtableslike'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|
+---------------------------------------------+
8rowsinset(0.00sec)

總結

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

審核編輯:湯梓紅

聲明:本文內容及配圖由入駐作者撰寫或者入駐合作網站授權轉載。文章觀點僅代表作者本人,不代表電子發(fā)燒友網立場。文章及其配圖僅供工程師學習之用,如有內容侵權或者其他違規(guī)問題,請聯系本站處理。 舉報投訴
  • SQL
    SQL
    +關注

    關注

    1

    文章

    777

    瀏覽量

    44426
  • 數據庫
    +關注

    關注

    7

    文章

    3868

    瀏覽量

    65024
  • MySQL
    +關注

    關注

    1

    文章

    836

    瀏覽量

    26945
收藏 人收藏

    評論

    相關推薦

    怎么簡單實現由Labview讀取的串口數據自增寫入mysql5.7數據庫中?

    怎么簡單實現由Labview讀取的串口數據自增寫入mysql5.7數據庫中? 已實現:串口數據的接收處理 mysql5.7的安裝(已測試數據庫正常運行) 愿付費解決此問題(QQ:8
    發(fā)表于 01-11 22:05

    0基礎學Mysql:mysql入門視頻教程!

    的性能調優(yōu)技術掌握基于MySQL的架構設計方案課程目錄:第1節(jié) MySQL課程介紹和MySQL的基礎概念(1)第2節(jié)
    發(fā)表于 07-08 10:51

    MySQL的幾種復制配置

    MySQL主從復制、主主復制、雙主多從配置
    發(fā)表于 04-16 09:50

    mysql的主從復制

    mysql 主從復制
    發(fā)表于 04-28 14:30

    如何對電機進行調優(yōu)調優(yōu)的好處是什么?

    如何自動對電機進行調優(yōu)
    的頭像 發(fā)表于 08-22 00:03 ?3220次閱讀

    虛擬機:CentOS 7安裝MySQL5.7的步驟

    虛擬機:CentOS 7安裝MySQL5.7的步驟
    的頭像 發(fā)表于 07-02 18:00 ?3293次閱讀

    MySQL 5.7MySQL 8.0 性能對比

    背景 測試mysql5.7mysql8.0分別在讀寫,選定,只寫模式下不同并發(fā)時的性能(tps,qps) 最早 測試使用版本為mysql5.7.22和mysql8.0.15 sysb
    的頭像 發(fā)表于 11-03 09:26 ?1.8w次閱讀
    <b class='flag-5'>MySQL</b> <b class='flag-5'>5.7</b>與<b class='flag-5'>MySQL</b> 8.0 性能對比

    KeenOpt調優(yōu)算法框架實現對調優(yōu)對象和配套工具的快速適配

    今天, KeenTune 再次帶來開源重磅特性——新增通用的調優(yōu)算法框架:keenopt。有了 keenopt 的加持,KeenTune 不再僅僅是支持靈活擴展調優(yōu)場景的
    的頭像 發(fā)表于 11-11 09:31 ?905次閱讀

    MySQL 5.6并行復制架構及并行復制原理

    ySQL 5.6版本也支持所謂的并行復制,但是其并行只是基于schema的,也就是基于庫的。如果用戶的MySQL數據庫實例中存在多個schema,對于從機復制的速度的確可以有比較大的幫
    發(fā)表于 12-23 14:52 ?565次閱讀

    探討MySQL復制機制實現的方式

    MySQL Replication(主從復制)是指數據變化可以從一個MySQL Server被復制到另一個或多個MySQL Server上,
    的頭像 發(fā)表于 04-12 09:29 ?785次閱讀

    mysql如何實現主從復制的具體流程

    主從復制MySQL數據庫中常用的數據復制技術之一,它的主要目的是將一個數據庫服務器上的數據復制到其他服務器上,以實現數據的備份、高可用和分
    的頭像 發(fā)表于 11-16 14:10 ?856次閱讀

    mysql主從復制主要有幾種模式

    MySQL主從復制MySQL數據庫中常用的一種數據復制方式,用于實現數據的備份、負載均衡、故障恢復等目的。主從
    的頭像 發(fā)表于 11-16 14:15 ?1270次閱讀

    mysql主從復制的原理

    MySQL主從復制是一種數據庫復制技術,它允許將一個MySQL數據庫的更新操作自動復制到其他MySQL
    的頭像 發(fā)表于 11-16 14:18 ?585次閱讀

    mysql主從復制 混合類型的復制

    MySQL主從復制是一種常用的數據復制技術,可以實現數據從一個MySQL服務器(主服務器)復制
    的頭像 發(fā)表于 11-16 14:20 ?665次閱讀

    配置MySQL主從復制和讀寫分離

    配置MySQL主從復制和讀寫分離
    的頭像 發(fā)表于 10-23 11:44 ?594次閱讀
    配置<b class='flag-5'>MySQL</b>主從<b class='flag-5'>復制</b>和讀寫分離
    主站蜘蛛池模板: 成人小视频在线观看 | 亚洲AV永久无码精品澳门 | 中文字幕久精品视频在线观看 | 2020年国产精品午夜福利在线观看 | 伊人久久大香 | 九九热在线观看 | 女人张开腿让男人桶爽免 | 99久久re6热精品首页 | 伊人久久精品AV无码一区 | 精品爽爽久久久久久蜜臀 | 99久久全国免费久久爱 | 亚洲精品动漫免费二区 | 快播苍井空 | 亚洲天堂视频网站 | 老熟风间由美AV在线一区二区 | 最近免费中文字幕MV免费高清 | 久久久无码精品无码国产人妻丝瓜 | 免费特黄一区二区三区视频一 | 国产亚洲AV精品无码麻豆 | 免费果冻传媒2021在线看 | 亚洲大片免费看 | 在线播放毛片 | 欧美精品v欧洲高清 | 亚洲精品无夜久久久久久久久 | 国产精品久久久久久影院 | 狼人射综合 | 国产午夜精品理论片免费观看 | 亚洲三级视频在线观看 | 天天夜夜草草久久亚洲香蕉 | 成年美女黄网站色app | 99久久婷婷国产综合精品青草 | 欧美怡红院视频一区二区三区 | 亚洲欧洲日产国码中学 | 天天躁日日躁狠狠躁午夜剧场 | 两个吃奶一个添下面视频 | 综合亚洲桃色第一影院 | 女人18毛片| 亚洲中文字幕日本在线观看 | 久久AV亚洲精品一区无码网 | 欧美亚洲另类热图 | 日韩中文欧美在线视频 |