MySQL5.7的組提交與並行複製

来源:http://www.cnblogs.com/shengdimaya/archive/2017/06/09/6972278.html
-Advertisement-
Play Games

從MySQL5.5版本以後,開始引入並行複製的機制,是MySQL的一個非常重要的特性。 MySQL5.6開始支持以schema為維度的並行複製,即如果binlog row event操作的是不同的schema的對象,在確定沒有DDL和foreign key依賴的情況下,就可以實現並行複製。 社區也有 ...


從MySQL5.5版本以後,開始引入並行複製的機制,是MySQL的一個非常重要的特性。 MySQL5.6開始支持以schema為維度的並行複製,即如果binlog row event操作的是不同的schema的對象,在確定沒有DDL和foreign key依賴的情況下,就可以實現並行複製。 社區也有引入以表為維度或者以記錄為維度的並行複製的版本,不管是schema,table或者record,都是建立在備庫slave實時解析row格式的event進行判斷,保證沒有衝突的情況下,進行分發來實現並行。 MySQL5.7的並行複製,multi-threaded slave即MTS,期望最大化還原主庫的並行度,實現方式是在binlog event中增加必要的信息,以便slave節點根據這些信息實現並行複製。 MySQL 5.7的並行複製建立在group commit的基礎上,所有在主庫上能夠完成prepared的語句表示沒有數據衝突,就可以在slave節點並行複製。 關於MySQL5.7的組提交,我們要看下以下的參數:
mysql> show global variables like '%group_commit%';
+-----------------------------------------+-------+
| Variable_name | Value |
+-----------------------------------------+-------+
| binlog_group_commit_sync_delay | 0 |
| binlog_group_commit_sync_no_delay_count | 0 |
+-----------------------------------------+-------+
2 rows in set (0.00 sec)

 

binlog_group_commit_sync_delay這個參數控制著日誌在刷盤前日誌提交要等待的時間,預設是0也就是說提交後立即刷盤,當設置為0以上的時候,就允許多個事物的日誌同事一起提交刷盤,也就是我們說的組提交。組提交是並行複製的基礎,我們設置這個值的大於0就代表打開了組提交的功能。最大值只能設置為1000000微妙。 組提交是個比較好玩的方式,我們根據MySQL的binlog就可以看得到組提交到底是怎麼回事:
[root@mxqmongodb2 log]# mysqlbinlog mysql-bin.000005 |grep last_committed
#170607 11:24:57 server id 353306 end_log_pos 876350 CRC32 0x92093332 GTID last_committed=654 sequence_number=655
#170607 11:24:58 server id 353306 end_log_pos 880406 CRC32 0x344fdf71 GTID last_committed=655 sequence_number=656
#170607 11:24:58 server id 353306 end_log_pos 888700 CRC32 0x4ba2b05b GTID last_committed=656 sequence_number=657
#170607 11:24:58 server id 353306 end_log_pos 890675 CRC32 0xf8a8ad64 GTID last_committed=657 sequence_number=658
#170607 11:24:58 server id 353306 end_log_pos 892770 CRC32 0x127f9cdd GTID last_committed=658 sequence_number=659
#170607 11:24:58 server id 353306 end_log_pos 894757 CRC32 0x518abd93 GTID last_committed=659 sequence_number=660
#170607 11:37:46 server id 353306 end_log_pos 895620 CRC32 0x99174f95 GTID last_committed=660 sequence_number=661
#170607 11:37:51 server id 353306 end_log_pos 895897 CRC32 0xb4ffc341 GTID last_committed=661 sequence_number=662
#170607 11:38:00 server id 353306 end_log_pos 896174 CRC32 0x6bcbc492 GTID last_committed=662 sequence_number=663
#170607 11:39:40 server id 353306 end_log_pos 896365 CRC32 0x1fe16c7c GTID last_committed=663 sequence_number=664

 

上面是沒有開啟組提交的一個日誌,我們可以看得到binlog當中有兩個參數last_committed和sequence_number,我們可以看到,下一個事物的 在主庫配置好組提交以後,從庫我們要加上如下的參數:last_committed永遠都和上一個事物的sequence_number是相等的。這也很容易理解,因為事物是順序提交的,這麼理解起來並不奇怪。 下麵看一下組提交模式的事物:
[root@mxqmongodb2 log]# mysqlbinlog mysql-bin.000008|grep last_commit
#170609 10:11:07 server id 353306 end_log_pos 75629 CRC32 0xd54f2604 GTID last_committed=269 sequence_number=270
#170609 10:13:03 server id 353306 end_log_pos 75912 CRC32 0x43675b14 GTID last_committed=270 sequence_number=271
#170609 10:13:24 server id 353306 end_log_pos 76195 CRC32 0x4f843438 GTID last_committed=270 sequence_number=272

 

我們可以看到最後兩個事物的last_committed是相同的,這意味什麼呢,意味著兩個事物是作為一個組提交的,兩個事物在perpare截斷獲取相同的last_committed而且相互不影響,最終是會作為一個組進行提交。這就是所謂的組提交。
#MTS
slave-parallel-type=LOGICAL_CLOCK
slave-parallel-workers=8 #太多的線程會增加線程間同步的開銷,建議4-8個slave線程
master_info_repository=TABLE
relay_log_info_repository=TABLE
relay_log_recovery=ON
slave-parallel-type有兩個之,DATABASE和LOGICAL_CLOCK,DATABASE: 預設值,相容5.6以schema維度的並行複製, LOGICAL_CLOCK: MySQL 5.7基於組提交的並行複製機制。

綜合來說,MySQL5.7的並行複製是基於主庫的group commit和從庫以下參數的配置:mysql> show variables like '%slave_para%';

+------------------------+---------------+
| Variable_name | Value |
+------------------------+---------------+
| slave_parallel_type | LOGICAL_CLOCK |
| slave_parallel_workers | 8 |
+------------------------+---------------+
2 rows in set (0.01 sec)

要想使用MySQL5.7的並行複製,必須首先主庫設置binlog_group_commit_sync_delay大於0,然後在從庫設置線程數和相關的方式。


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 1.系統信息函數 1.會話信息函數 ...
  • 目錄 一、視圖 二、觸發器 三、函數 四、存儲過程 五、事務 一、視圖 視圖是一個虛擬表(非真實存在),其本質是【根據SQL語句獲取動態的數據集,併為其命名】,用戶使用時只需使用【名稱】即可獲取結果集,並可以將其當作表來使用。 SELECT * FROM ( SELECT nid, NAME FRO ...
  • 在資料庫伺服器異常斷電重啟後,資料庫會進行實例恢復,那麼實例恢復的過程中Oracle做了什麼操作呢?參考官網在這裡做一下解釋,菜鳥水平有限,歡迎勘正。 首先說下實例恢復的定義: Instance recovery is the process of applying records in the o ...
  • 知識重點: 1.extract(day from schedule01::timestamp)=13 Extract 屬於 SQL 的 DML(即資料庫管理語言)函數,同樣,InterBase 也支持 Extract,它主要用於從一個日期或時間型的欄位內抽取年、月、日、時、分、秒數據,因此,它支持其 ...
  • 本文出處:http://www.cnblogs.com/wy123/p/6970721.html 免責聲明: 本文僅供娛樂,從足彩的勝平負觀點出發來分析如何投註來實現收益的“最穩妥”,^O^ 本文不對任何足彩勝平負實際投資組合有任何指導建議,不對任何投資有任何責任。 勝平負的介紹以及組合方案押註 閱 ...
  • 有些hive安裝文檔提到了hdfs dfs -mkdir ,也就是說hdfs也是可以用的,但在2.8.0中已經不那麼處理了,之所以還可以使用,是為了向下相容. 本文簡要介紹一下有關的命令,以便對hadoop的命令有一個大概的影響,併在想使用的時候能夠知道從哪裡可以獲得幫助。 概述 在$HADOOP_ ...
  • 原文鏈接:http://cv-tricks.com/tensorflow-tutorial/save-restore-tensorflow-models-quick-complete-tutorial/ 什麼是tensorflow model 模型訓練完畢之後,你可能需要在產品上使用它。那麼tens ...
  • 創建資料庫對於表的操作需要先進入庫 use 庫名;-- 創建一個名為 inana_db 的資料庫,資料庫字元編碼指定為 utf8create database inana_db character set utf8;drop database inana_db; -- 刪除 庫名為samp_db的庫 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...