《MySQL——備庫多線程復制策略。》

目錄

    • 備庫并行復制能力
    • MySQL5.6版本 并行復制策略
    • MariaDB 并行復制策略
    • MySQL5.7版本 并行復制策略
    • MySQL5.7.22版本 并行復制策略
    • 總結

備庫并行復制能力

主要涉及兩個方面的并行度:

1、客戶端寫入主庫的能力

2、備庫上sql_thread執行中轉日志relay log

1的并行能力比2強。

主庫上由于InnoDB支持行鎖,對業務并行度的支持比較友好。

備庫上如果用單線程,會導致備庫應用日志不夠快,造成主備延遲。

現在MySQL使用的是多線程復制
在這里插入圖片描述

coordinator 就是原來的sql_thread,不過現在它不再直接更新數據了,只負責讀取中轉日志和分發事務。真正更新日志的,是worker線程。線程個數由slave_parallel_workers決定,一般設置為8~16。

coordinator在分發事務的時候,要遵循兩個要求:

  • 不能造成更新覆蓋。也就是說更新同一行的兩個事務必須被分發到同一個worker中。
  • 同一個事務不能被拆開,必須放到同一個worker中。

MySQL5.6版本 并行復制策略

支持粒度:庫

用于決定分發策略的hash表key值:數據庫名

優勢:

1、構造hash值快;一個實例上的DB數目不會很多。

2、不要求binlog格式。row和statement格式的binlog都可以拿到庫名。

缺點:

1、主庫表在同一個DB中,策略失效

2、不同DB熱點不同,起不到并行效果

MariaDB 并行復制策略

策略:

1、能夠在同一組里提交的事務,一定不會修改同一行

2、主庫上可以并行執行的事務,備庫上一定是可以并行執行的

為了實現該策略,MariaDB實現方法為:

1、在一組里面一起提交的事務,有一個相同的commit_id,下一組就是commit_id+1

2、commit_id直接寫到binlog里

3、傳到備庫應用的時候,相同commit_id的事務分發到多個worker執行

4、一組全部執行完后,coordinator再去取下一批

這個策略目標就是備庫模擬主庫的并行模式。

不過主庫再一組事務commit的時候,下一組事務實際上是處于"執行中"狀態的。

而按照MariaDB策略,在備庫上執行的時候,要等一組事務完全執行完,下一組事務才能開始執行,這樣系統的吞吐量就不夠。

這個策略,對于長事務來說不友好。如果一組里有一個超大事務線程,該組其他線程執行完后要等待這個線程執行完,之后才能切換到下一組。這段時間,只有一個線程進行工作,浪費了資源。

MySQL5.7版本 并行復制策略

策略思想:

1、同時處于prepare狀態的事務,在備庫執行時是可以并行的

2、處于prepare狀態的事務,與處于commit狀態的事務之間,在備庫執行時也是可以并行的

通過調節binlog_group_commit_sync_delaybinlog_group_commit_sync_no_delay_count參數

來來拉長binlog從write到fsync的時間,以此減少binlog’的寫盤次數。同時在并行復制策略里,可以用來制造更多“同時處于prepare階段的事務”。這樣就能增加備庫復制的并行度。

通俗來講,這兩個參數,既可以讓主庫提交慢一點,又可以讓備庫執行快一點。在MySQL5.7處理備庫延遲時,可以調節這兩個參數,達到提升備庫復制并行度的目的。

MySQL5.7.22版本 并行復制策略

新增了一個參數binlog-transaction-dependency-tracking,用來控制是否啟用這個新策略。

可選值:

1、COMMIT_ORDER,表示根據同時進入prepare和commit來判斷是否可以并行

2、WRITESET,表示對于事務涉及更新的每一行,計算出這一行的hash值,組成集合writeset。如果兩個事務沒有操作相同的行,即writeset沒有交集,就可以并行。

3、WRITESET_SESSION,在WRITESET基礎上多了一個約束:在主庫上同一線程先后執行的兩個事務,在備庫執行的時候,要保證相同的先后順序

為了唯一標識,hash通過"庫名+表名+索引名+值"計算。如果表上除了主鍵索引外,還有其他唯一索引,那么對于每個唯一索引,insert語句對應的writeset就要多增加一個hash值。

這個版本的好處在于:

--1、writeset是在主庫生成后直接寫入到binlog里的,在備庫執行的時候,不需要解析binlog內容,節省了備庫計算量
--2、不需要把整個事務的binlog都掃一邊才能決定分發到哪個worker,更加節省內存
--3、備庫的分發策略不依賴于binlog內容,所以binlog是statement格式也是可以的

對于表上沒有主鍵和外鍵約束的場景,WRITSET策略也沒有辦法并行,會暫時退化為單線程模型。 所以,表是否有主鍵,也是影響主備同步延遲原因之一。

總結

單線程復制能力低于多線程復制,對于更新壓力較大的主庫,備庫可能一直追不上主庫。

MySQL備庫并行策略,修改了binlog的內容,也就是說不是向上兼容的,所以需要注意。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/377186.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/377186.shtml
英文地址,請注明出處:http://en.pswp.cn/news/377186.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

人臉是門大生意

我們正處在一個新時代的入口。人有70%的能量是被大腦消耗,大腦90%的能量用來處理視覺信息,人臉則承載了絕大部分的視覺信息。我們要討論的是一個比Google Glass更酷的世界。文/程苓峰-云科技網易郵箱的用戶已經可以用人臉而不是密碼來驗證登陸。安卓4.0實…

【SQL】sql版Split函數。用于拆分字符串為單列表格

【SQL】sql版Split函數。用于拆分字符串為單列表格 功能與.net版string.Split函數類似,只不過.net返回的是數組,這個返回的是一個單列表格,每個拆分出來的子串占一行。可選是否移除空格子串和重復項。市面上類似的函數不算少,但大…

線描算法

線描算法 (Line drawing algorithms) The equation for a straight line is ymxb 直線方程為y mx b In this m represent a slope of a line which can be calculated by the my2-y1/x2-x1 where (x1, y1) are the starting position of the points and (x2, y2) are the end…

為移動端網頁構造快速響應按鈕

背景 在谷歌,我們不斷地推測手機網頁應用的可能性。像HTML5這樣的技術使我們網頁版的應用以及運行在手機設備上的原生應用。而這些技術的成就之一就是我們開發了一種新的創建按鈕的方法,使按鈕的響應時間遠遠快于一般的HTML按鈕。在此之前的按鈕或者其他…

Red Gate系列之一 SQL Compare 10.4.8.87 Edition 數據庫比較工具 完全破解+使用教程

Red Gate系列之一 SQL Compare 10.4.8.87 Edition 數據庫比較工具 完全破解使用教程 Red Gate系列文章: Red Gate系列之一 SQL Compare 10.4.8.87 Edition 數據庫比較工具 完全破解使用教程 Red Gate系列之二 SQL Source Control 3.0.13.4214 Edition 數據庫版本控制…

《MySQL——基于位點orGTID的主備切換協議》

一主多從的設置,用于讀寫分離,主庫負責所有的寫入和一部分讀,其他讀請求則由從庫分擔。 一主多從架構下,主庫故障后的主備切換問題。相比于一主一備,多了從庫指向新主庫的過程。 基于位點的主備切換同步 把節點B設…

數據科學和統計學_數據科學中的統計

數據科學和統計學統計 (Statistics) Statistics are utilized to process complex issues in reality with the goal that Data Scientists and Analysts can search for important patterns and changes in Data. In straightforward words, Statistics can be utilized to ge…

java隨機數生成(固定位數)

隨機生成 a 到 b (不包含b)的整數:(int)(Math.random()*(b-a))a; 隨機生成 a 到 b (包含b)的整數:(int)(Math.random()*(b-a1))a;轉載于:https://www.cnblogs.com/zhwl/p/3624726.html

POJ 3670 Eating Together

POJ_3670 由于遞增和遞減是類似的,下面不妨只討論變成遞增序列的情況。 由于Di只有三個數,所以可以考慮將序列分割成三部分,第一部分全部變成1,第二部分全部變成2,第三部分全部變成3。然后我們枚舉3開始的位置&#xf…

《MySQL——如何解決一主多從的讀寫分離的過期讀問題》

目錄兩種架構兩種架構特點強制走主庫方案Sleep方案判斷主備無延遲方案配合semi-sync等主庫位點方案GTID方案兩種架構 基于一主多從的讀寫分離,如何處理主備延遲導致的讀寫分離問題。 讀寫分離的主要目標:分攤主庫壓力。 有兩種架構: 1、客…

json/ 發送形式_24/7的完整形式是什么?

json/ 發送形式24/7:二十四 (24/7: Twenty-Four Seven) 24/7 or 24-7 service, which generally marked "twenty-four seven" is service that is existing at any time and typically, every day in trade business and industry. Substitute orthograph…

《MySQL tips:并發查詢與并發連接區別》

并發連接與并發查詢,并不是一個概念。 在執行show processlist的結果里,看到了幾千個連接,指的是并發連接。 而"當前正在執行"的語句,才是并發查詢。 并發連接數多影響的是內存。 并發查詢太高對CPU不利。一個機器的…

對上拉下拉電阻的作用作個總結(想了解的過來看看)(轉載)

轉自:http://www.amobbs.com/thread-5475279-1-3.html 一、定義:上拉就是將不確定的信號通過一個電阻嵌位在高電平!電阻同時起限流作用!下拉同理!上拉是對器件注入電流,下拉是輸出電流;弱強只是…

給用戶傳入的變量進行轉義操作

先看代碼實現: /* 對用戶傳入的變量進行轉義操作。*/ if (!get_magic_quotes_gpc()) {if (!empty($_GET)){$_GET addslashes_deep($_GET);}if (!empty($_POST)){$_POST addslashes_deep($_POST);}$_COOKIE addslashes_deep($_COOKIE);$_REQUEST addslashes_…

《MySQL——外部檢測與內部統計 判斷 主庫是否出現問題》

目錄select1判斷查表判斷更新判斷外部檢測弊端內部統計一主一備的雙M架構里,主備切換只需要把客戶端流量切換到備庫。 在一主多從的架構里,主備切換要把客戶端流量切換到備庫,也需要把從庫接到新主庫上。 切換有兩種場景:1、主動…

NIM的完整形式是什么?

NIM:無內部消息 (NIM: No Internal Message) NIM is an abbreviation of "No Internal Message". NIM是“無內部消息”的縮寫。 It is an expression, which is commonly used in the Gmail platform. It is written in the subject of the mail, if the…

[Json] C#ConvertJson|List轉成Json|對象|集合|DataSet|DataTable|DataReader轉成Json (轉載)...

點擊下載 ConvertJson.rar 本類實現了 C#ConvertJson|List轉成Json|對象|集合|DataSet|DataTable|DataReader轉成Json|等功能大家先預覽一下 請看代碼 /// <summary> /// 類說明&#xff1a;Assistant /// 編 碼 人&#xff1a;蘇飛 /// 聯系方式&#xff1a;361983679 …

let 只能在嚴格模式下嗎_LET的完整形式是什么?

let 只能在嚴格模式下嗎LET&#xff1a;今天早早離開 (LET: Leaving Early Today) LET is an abbreviation of "Leaving Early Today". LET是“ Leaveing Today Today”的縮寫 。 It is an expression, which is commonly used in the Gmail platform. It is writt…

js 遮罩層 loading 效果

//調用方法 //關閉事件<button οnclickLayerHide()>關閉</button>&#xff0c;在loadDiv(text)中&#xff0c;剔除出來 //調用LayerShow(text)&#xff0c;text為參數&#xff0c;可以寫入想要寫入的提示語 //本方法在調用時會自動生成一個添加到body的div&#x…

centos6.5安裝配置LDAP服務[轉]

centos6.5安裝配置LDAP服務[轉] 安裝之前查一下 1find / -name openldap*centos6.4默認安裝了LDAP&#xff0c;但沒有裝ldap-server和ldap-client 于是yum安裝 1su root2yum install -y openldap openldap-servers openldap-clients不建議編譯源碼包&#xff0c;有依賴比較麻煩…