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

一主多從的設置,用于讀寫分離,主庫負責所有的寫入和一部分讀,其他讀請求則由從庫分擔。

一主多從架構下,主庫故障后的主備切換問題。相比于一主一備,多了從庫指向新主庫的過程。
在這里插入圖片描述

基于位點的主備切換同步

把節點B設置為節點A‘的從庫,執行change master命令:

CHANGE MASTER TO
MASTER_HOST = $host_name
MASTER_POST = $port
MASTER_USER = $user_name
MASTER_PASSWORD = $password
MASTER_LOG_FILE = $master_log_name
MASTER_LOG_POS = $master_log_pos
  • MASTER_HOST、MASTER_PORT、MASTER_USER和MASTER_PASSWORD四個參數,分別達標主庫A’的IP、端口、用戶名、密碼

  • MASTER_LOG_FILE和MASTER_LOG_POS是主庫對應的文件名和日志偏移量,就是同步位點

節點B要設置為A‘的從庫,就必須要設置位點參數。

原本節點B是A的從庫,本地記錄的也是A的位點。 但是相同的日志,A的位點于A’的位點不同。所以在切換的時候需要先找同步位點。

(這個不一致造成的原因之一:備庫啟用了并行復制,例如使用了組提交并行(prepare和commit狀態之間事務組可以并行執行),那么這時候在主庫上先執行完成的事務在備庫上就不一定先執行完成了,binlog因此就會有所差異。 )

找同步位點的方法:

1、等待新主庫A‘把中轉日志(relay log)全部同步完成

2、在A’上執行show master status命令,得到當前A’上最新的file和position

3、取原主庫A故障時刻T

4、用mysqlbinlog工具解析A’的file,得到T時刻的位點123

不過這樣并不精確:

假設在T時刻,主庫A已經執行完成了一個insert語句插入一行數據R,并且已經將binlog傳給A‘和B,然后在傳完的瞬間主庫A的主機就掉電了。

此時系統狀態如下:

1、在從庫B上,由于同步了binlog,R這一行已經存在

2、在新主庫A’上,R這一行也已經存在,日志卸載123位置后

3、在從庫B上執行change master命令,指向A’的file文件123位置,會把插入R這一行數據的binlog又同步到從庫B執行,會發生主鍵沖突,然后停止同步

所以在切換主庫的時候要主動跳過一些"重復操作"引起的錯誤,避免切換任務阻塞。

1、在從庫上執行跳過事務命令:

set global sql_slave_skip_counter = 1;
start slave;

每次碰到錯誤就停下來,執行以此跳過命令,直到不再報錯。

2、通過設置slave_skip_errors參數,直接設定跳過指定的錯誤

主備切換時,有兩類錯誤經常遇到:

1062 插入數據時唯一鍵沖突
1032 刪除數據時找不到行

可以把slave_skip_errors設置為"1032,1062",遇到這兩個錯誤直接跳過。

注意,在主備切換過程中,跳過這兩個錯誤是無損的。同步完成后,需要把整個參數設置為空,防止出現主從不一致時也跳過了。

基于GTID的主備切換同步

GTID全稱Global Transaction Identifier ,也就是全局事務ID,是一個事務在提交的時候生成的,是這個事務的唯一標識。格式為:

GTID = server_uuid:gno
  • server_uuid是一個實例第一次啟動時自動生成的,是一個全局唯一的值
  • gno是一個整數,初始值為1,每次提交事務的時候分配給這個事務,并+1

官方格式定義:

GTID = source_id:transaction_id

transaction_id指的是事務id,事務id實在事務執行的過程中分配的,如果這個事務回滾了,transaction_id也會增加,而gno實在事務提交的時候才會分分配,所以使用gno更好。

使用方法:在啟動一個MySQL實例的時候,加上參數gtid_mode = onenforce_gtid_consistency = on

在GTID模式下,每個事務都會和一個GTID對應。

在GTID模式下,備庫B要設置為新主庫A’的從庫:

CHANGE MASTER TO 
MASTER_HOST=$host_name 
MASTER_PORT=$port 
MASTER_USER=$user_name 
MASTER_PASSWORD=$password 
master_auto_position=1 

可以發現,現在不需要指定參數了。

實例A‘的GTID集合記為set_a,實例B的GTID集合記為set_b。

在實例B上執行start slave命令,取binlog:

1、實例B指定主庫A’,基于主備協議建立連接

2、實例B把set_b發給主庫A‘

3、實例A’算出set_a與set_b的差集,也就是所有存在于set_a但是不存在于set_b的GTID集合。

判斷A‘本地是否包含了這個差集需要的binlog事務。

如果不包含,表示A’已經把實例B需要的binlog刪除了,直接返回錯誤

如果確認全部包含,A‘從自己的binlog文件里面,找出第一個不在set_b的事務,發給B

4、從這個事務開始,往后讀文件,按順序取binlog發給B去執行

也就是說,基于GTID的主備關系里,系統認為只要建立主備關系,就必須保證主庫發給備庫的日志是完整的。如果備庫要求的日志不存在,主庫就拒絕把日志發給備庫。

基于位點的主備協議,是由備庫決定的,備庫指定位點,主庫順著位點取log,不做日志完整性判斷。

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

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

相關文章

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

數據科學和統計學統計 (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;有依賴比較麻煩…

《MySQL——恢復數據-誤刪行、表、庫》

目錄誤刪行事前預防誤刪行數據方法誤刪表/庫延遲復制備庫事前預防誤刪庫/表方法傳統的架構不能預防誤刪數據&#xff0c;因為主庫的一個drop table命令&#xff0c;會通過binlog傳給所有從庫和級聯從庫&#xff0c;進而導致整個集群的實例都會執行這個命令。 MySQL相關的誤刪除…

python圖例位置_Python | 圖例位置

python圖例位置Legends are one of the key components of data visualization and plotting. Matplotlib can automatically define a position for a legend in addition to this, it allows us to locate it in our required positions. Following is the list of locations…

Freemarker中遍歷List實例

Freemarker中如何遍歷List摘要&#xff1a;在Freemarker應用中經常會遍歷List獲取需要的數據&#xff0c;并對需要的數據進行排序加工后呈現給用戶。那么在Freemarker中如何遍歷List&#xff0c;并對List中數據進行適當的排序呢&#xff1f;通過下文的介紹&#xff0c;相信您一…

工作總結:文件對話框的分類(C++)

原文地址&#xff1a;http://www.jizhuomi.com/software/173.html 文件對話框分為打開文件對話框和保存文件對話框&#xff0c;相信大家在Windows系統中經常見到這兩種文件對話框。例如&#xff0c;很多編輯軟件像記事本等都有“打開”選項&#xff0c;選擇“打開”后會彈出一個…

《MySQL——Innodb改進LRU算法》

Innodb改進LRU.算法&#xff0c;實質上將內存鏈表分成兩段。 靠近頭部的young和靠近末尾的old&#xff0c;取5/12段為分界。 新數據在一定時間內只能在old段的頭部&#xff0c;當在old段保持了一定的時間后被再次訪問才能升級到young。 實質上是分了兩段lru&#xff0c;這樣做的…

nfc/nfc模式_NFC的完整形式是什么?

nfc/nfc模式NFC&#xff1a;沒有進一步評論 (NFC: No Further Comment) NFC is an abbreviation of "No Further Comment". NFC是“沒有進一步評論”的縮寫 。 It is an expression, which is commonly used in messaging or chatting on social media networking s…