溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

mysql 基于組提交的并發復制小結

發布時間:2020-08-09 20:19:07 來源:ITPUB博客 閱讀:370 作者:賀子_DBA時代 欄目:MySQL數據庫
一:MySQL 5.7并行復制初理解
我們知道MySQL 5.7并行復制引入了兩個值last_committed和sequence_number。last_committed表示事務提交的時候,上次事務提交的編號,在主庫上同時提交的事務設置成相同的last_committed。如果事務具有相同的last_committed,表示這些事務都在一組內,可以進行并行的回放。
查看組提交的事務個數,其中9892是last_commited的值,相同的last_commited值,后面的sequnen ce_number是可以并行復制的事務的一個序列號,新的binlog文件是從1開始的,給gtid的xid沒有關系!
cat  binlog.log | grep GTID | grep  last_committed | grep  19408
mysql 基于組提交的并發復制小結
二:造成延遲的原因:
表沒有主鍵,事務太大,并行力度不夠,參數設置不合適,從庫硬件差

二:Mysql 5.7并行復制相關的參數
一般主從延遲太大,要不是沒有主鍵,要不是配置的不合理
依次介紹些這些參數的作用,以及設置途徑
binlog_group_commit_sync_delay
binlog_group_commit_sync_no_delay_count
max_allowed_packet
slave_max_allowed_packet
slave_preserve_commit_order
slave_pending_jobs_size_max
一:binlog_group_commit_sync_delay   :
Property
Value
Command-Line Format
--binlog-group-commit-sync-delay=#
System Variable
binlog_group_commit_sync_delay
Scope
Global
Dynamic
Yes
Type
Integer
Default Value
0
Minimum Value
0
Maximum Value
1000000
1)該參數控制mysql 組提交之前等待的微秒數,設置該參數可以讓組提交的每個組里面的事務數更多(因為他等待了n微妙),因為每個組里面的事務可以在從庫并行的去重放,所以設置該參數大于0,有助于提高從庫應用日志的速度,減少從庫延遲
設置binlog_group_commit_sync_delay可以增加從庫的并行提交事務數,因此可以增加復制從屬服務器上的并行執行能力。要受益于此效果,從屬服務器必須設置slave_parallel_type=LOGICAL_CLOCK,并且在還設置binlog_transaction_dependency_tracking=COMMIT_ORDER時效果更顯著。在調整binlog_group_commit_sync_delay的設置時,必須同時考慮主設備的吞吐量和從設備的吞吐量。
2)但是設置binlog_group_commit_sync_delay會增加主服務器上事務的延遲,這可能會影響客戶端應用程序。此外,在 高度并發的工作負載上,可能會增加爭用,從而降低吞吐量,導致數據庫性能降低,還能在錯誤日志中看到很多RECORD LOCK信息,
3)當設置sync_binlog=0或sync_binlog=1時,binlog_group_commit_sync_delay指定的延遲將作用于每個事務組提交。當sync_binlog設置為大于1的值n時,該參數的延遲作用于每n個二進制日志提交組提交之間;
建議:該參數設置一定要結合實際情況,評估出mysql的并發量,計算出單位時間內的并發量,然后合理設置binlog_group_commit_sync_delay和binlog_group_commit_sync_no_delay_count(單位時間每組的事務數) ,一定要限制每個組的事務個數,因為如果不設置的話,如果你的實際并發量挺大,這就會導致你的每個組的事務數可能非常多,然后我們知道組提交的commit階段是分三個步驟的,每個階段都是有隊列的,如果每個組太多事務,就會導致內存隊列不夠用,而使用臨時文件,這樣就降低了commit的性能,造成更多的延遲, 所以要使用 binlog_group_commit_sync_no_delay_count 來限制你的每個組的事務數,這樣就能盡可能多的把同一個組的事務數增多,但是也不至于太多,限制在一個合理的范圍,這些事務可以在從庫并發執行,而如果不設置的話,那么這些事務可能有很多是串行的, 也有可能事務太多導致性能降低而產生更多的延遲!
拓展參數 binlog_transaction_depandency_tracking:
控制檢測是不是可以并行復制的方式,
基于主鍵的沖突檢測(binlog_transaction_depandency_tracking = COMMIT_ORDERE|WRITESET|WRITESET_SESSION, 修改的row的主鍵或非空唯一鍵沒有沖突,即可并行)
5.7.22 也支持了 write-set 機制
事務依賴關系: binlog_transaction_depandency_tracking = COMMIT_ORDERE|WRITESET|WRITESET_SESSION
COMMIT_ORDERE: 繼續基于組提交方式
WRITESET: 基于寫集合決定事務依賴(有問題?。?/div>
WRITESET_SESSION: 基于寫集合,但是同一個session中的事務不會有相同的last_committed
事務檢測算法: transaction_write_set_extraction = OFF| XXHASH64 | MURMUR32
MySQL會有一個變量來存儲已經提交的事務HASH值,所有已經提交的事務所修改的主鍵(或唯一鍵)的值經過hash后都會與那個變量的集合進行對比,來判斷改行是否與其沖突,并以此來確定依賴關系
這里說的變量,可以通過這個設置大?。?binlog_transaction_dependency_history_size
這樣的粒度,就到了 row級別了,此時并行的粒度更加精細,并行的速度會更快,某些情況下,說slave的并行度超越master也不為過(master是單線程的寫,slave也可以并行回放)

二:binlog_group_commit_sync_no_delay_count
Property
Value
Command-Line Format
--binlog-group-commit-sync-no-delay-count=#
System Variable
binlog_group_commit_sync_no_delay_count
Scope
Global
Dynamic
Yes
Type
Integer
Default Value
0
Minimum Value
0
Maximum Value
1000000
該參數必須和binlog_group_commit_sync_delay一起使用才有意義,當已經處于延遲的事務個數達到該參數設置的數的時候,就終止了binlog_group_commit_sync_delay參數設置的微妙延遲(不需要一定要延遲參數binlog_group_commit_sync_delay設置的微妙數),也就是該參數保證同一個組提交的組里面的事務數不能太多!

三:slave_preserve_commit_order
Property
Value
Command-Line Format
--slave-preserve-commit-order[={OFF|ON}]
System Variable
slave_preserve_commit_order
Scope
Global
Dynamic
Yes
Type
Boolean
Default Value
OFF
1)對于多線程從機,此變量的設置1確保事務在主庫提交的順序與它們在從庫中繼日志中顯示的順序相同,并防止從庫中繼日志執行的事務序列中出現間隙。此變量對未啟用多線程的從機沒有影響。請注意,slave_preserve_commit_order=1不保留非事務性DML更新的順序,因此這些更新可能在中繼日志中它們之前的事務之前提交,這可能會導致間隙;
2)slave_preserve_commit_order=1要求在從機上啟用--log bin和 --log-slave-updates ,并且slave_parallel_type設置為 LOGICAL_CLOCK。在更改此變量之前,必須停止所有復制線程(如果使用多個復制通道,則為所有復制通道)
3)在啟用slave_preserve_commit_order的情況下,sql線程在提交之前等待所有以前的事務提交,
當從線程等待其他工作線程提交其事務時,它會將其狀態報告為:Waiting for preceding transaction to commit,所以如果啟用該參數,那么可能會加劇主從延遲!
4)如果設置slave_preserve_commit_order=0,則slave并行應用的事務可能會無序提交。因此,檢查最近執行的事務并不能保證來自主服務器的所有以前的事務都在從服務器上已經執行(也就是說某你在從庫看到的不是當前的狀態,這不是延遲導致的,而是提交順序不一樣導致的不一致狀態)。在從機的中繼日志中執行的事務序列中可能存在間隙。這對使用多線程應用的從庫的日志記錄和恢復有影響。
四:binlog_order_commits
Property
Value
Command-Line Format
--binlog-order-commits[={OFF|ON}]
System Variable
binlog_order_commits
Scope
Global
Dynamic
Yes
Type
Boolean
Default Value
ON
該參數控制:
當在復制主機上啟用此變量(這是默認設置)時,向存儲引擎發出的事務提交指令將使用單個線程串行的提交,以便事務始終按寫入二進制日志的相同順序提交。禁用此變量允許使用多個線程發出事務提交指令。 與二進制日志組提交結合使用,可以防止單個事務的提交速率成為吞吐量的瓶頸,因此可能會提高性能(主從都設置)
當所有涉及的存儲引擎都已確認事務已準備好提交時,事務將寫入二進制日志。然后,二進制日志組提交邏輯在二進制日志寫入之后提交一組事務。當binlog_order_commits被禁用時,由于此進程使用多個線程,提交組中的事務可能會以不同于二進制日志中事務順序的順序提交。(來自單個客戶機的事務總是按時間順序提交)在許多情況下,這無關緊要,因為既然組提交中的事務可以并行復制,說明這些事務分開執行是會產生一致性的結果的,否則不能并行復制只能單獨的事務執行了;
建議:在一些不重要的從庫上,可以關閉該參數來提高從庫的復制性能!
五:關于packet 數據包的大?。?/span>
1.slave_pending_jobs_size_max的用途:
在多線程復制時,在隊列中Pending(等待)的事件所占用的最大內存,默認為16M,如果內存富余,或者延遲較大時,可以適當調大; 注意這個值要比主庫的max_allowed_packet大,并且這個參數需要重啟restart slave才能生效,也就是stop slave,start slave才能生效
查看主庫的max_allowed_packet參數!
mysql > show variables like 'max_allowed_packet';   -- 134217728 即128M + --------------------+-----------+ | Variable_name       | Value     | + --------------------+-----------+ | max_allowed_packet | 134217728 | + --------------------+-----------+
2.max_allowed_packet
Property
Value
Command-Line Format
--max-allowed-packet=#
System Variable
max_allowed_packet
Scope
Global, Session
Dynamic
Yes
Type
Integer
Default Value
4194304
Minimum Value
1024
Maximum Value
1073741824
該參數控制mysql限制server接受的數據包大小,需要注意應該設置成正1024的整數倍的k,  因為有些服務器下的mysql由于某些原因可能無法將M轉為k。默認是4m;最大是1g,
該參數設置過大,可能會導致由于某個事務過大,導致主從延遲加??!
set global max_allowed_packet = 2*1024*1024*10  (20m)
3.slave_max_allowed_packet參數
此變量設置slave 的SQL和I/O線程的最大數據包大小,不會因為復制更新超過了允許的最大數據包數,而導致基于行的復制的大型更新失敗。設置此變量將立即對所有復制通道生效,包括正在運行的通道。
此全局變量的值始終是1024的正整數倍;如果將其設置為非正整數倍,則該值將向下舍入到1024的下一個最大倍數,以便存儲或使用;將slave_max_allowed_packet設置為0將使用1024。(在所有這些情況下都會發出截斷警告。)默認值和最大值為1073741824(1 GB);最小值為1024
Property
Value
Command-Line Format
--slave-max-allowed-packet=#
System Variable
slave_max_allowed_packet
Scope
Global
Dynamic
Yes
Type
Integer
Default Value
1073741824
Minimum Value
1024
Maximum Value
1073741824


向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

亚洲午夜精品一区二区_中文无码日韩欧免_久久香蕉精品视频_欧美主播一区二区三区美女