Mysql 如何保證主從資料一致

2022-02-07 04:38:04 字數 1644 閱讀 2017

要知道,mysql 的主從使用的是 binlog 那樣簡單的 日誌傳輸方式,來完成從庫對主庫的複製,雖然提高了效率,但是主庫和從庫之間並沒有 raft 那樣的協議來保證 主從一致。

有時候主庫宕機,但是 binlog 還沒有發出去,如果直接將從庫切換為主庫,那麼將會主備不一致。

並且從庫是單純告訴主庫,需要從主庫的 binlog 的哪個偏移量開始 ,讓主庫傳送 binlog 過來,所以很有可能因為偏移量不正確,導致從庫得到的 binlog 是以前獲得過的,導致重複的插入或者刪除,使得從庫因為錯誤終止執行。

mysql 5.6 引入了 gtid ,啟動這個模式:啟動引數 + gtid_mode=on和enforce_gtid_consistency=on

global transaction id , 可以唯一表示 乙個集群中的事務(前提是這些集群中的機器的id 要相互不同),格式是 server_id : gno (資料庫例項 id : 事務 id)

前者用來標識機器,後者用來在一台機器中唯一標識事務。

資料庫會維護 乙個 gtid 的集合,標識所有該資料庫例項執行過的事務

於是有一種新的模式,從庫把自己的 gtid 集合傳送給 主庫,主庫檢查 從庫的 gtid 集合 和 自己 gtid 集合的差集,這個差集就是 主庫需要給從庫的 資料。

倘若從庫要求的 gtid 集合在 主庫上沒有,那麼可能是 主庫刪除了對應的 binlog,主庫會報錯(但是如果是從庫自己在 成為從庫前 執行了一些事務,這些事務的 gtid 也會被發給主庫嗎?如果發的話不就必然報錯?)(其實可以 在從庫上使用命令 : set global gtid_purged = '24024e52-bd95-11e4-9c6d-926853670d0b:1 - n';       來告訴從庫,哪些binlog 已經被 purge 了,不要再發給主庫了,不要再向主庫索要了 ,注意上面的 gno 是 1 - n 這種格式 ,只有事務提交了,才能使 gno + 1)

一般的 gtid 是遞增的,gtid_next=automatic 可以設定遞增。

也可以自己設定 set gtid_next='aaaaaaaa-cccc-dddd-eeee-ffffffffffff:10';

這樣的話,被設定的機器 若執行下乙個事務,這個事務 使用的 gtid 就是上面手工設定的 gtid。

假如有 互為 主從的 兩個庫 a b ,現在的寫請求都是打到 a 上的,假如要加索引,又不想影響a 上的效率

1.先 停掉 b 向 a 傳送 binlog

2.在 從庫 b 上,加索引,假設這條 加索引的 ddl 的 gid 是 b:x 

3.在 主庫 a 上,設定 gid_next = a:x , 並且執行乙個空事務(在設定 gid_next = a:x 到執行空事務期間,可不可能有其他的事務搶占,哦,好像就算被搶了也無所謂,反正我們要做的只是讓這個gid 對應的 ddl 不被執行)

4. a 重新認 b 為 主庫,會傳送 a 的 gid 集合(這期間沒有停止 a 向 b 傳送 binlog,所以 b 的 gid 集合應該和 a 一致,所以不會報錯),a 從 b 那裡獲取 b 的 gid 集合,因為之前已經執行過那條 ddl 語句對應事務的 gtid 代表的假事務,所以不會執行 這條 ddl。

把寫請求打到 庫 b 上,並且再來一次剛才的過程,只不過這次反過來,b 是之前的 a ,a 是之前的 b。

5. 最後 a 和 b 上 都有了 索引。

zookpeer如何保證資料一致

zookpeer如何保證資料一致 paxos演算法通過投票來對寫操作進行全域性編號,同一時刻,只有乙個寫操作被批准,同時併發的寫操作要去爭取選票,只有獲得過半數選票的寫操作才會被 批准 所以永遠只會有乙個寫操作得到批准 其他的寫操作競爭失敗只好再發起一輪投票,就這樣,在日復一日年復一年的投票中,所有...

kafka 保證資料一致

先看下kafka的集群架構 kafka生產乙個topic,建立了3個分割槽,每個分割槽都會先有乙個leader,然後在其他機器中,建立自己分割槽的follower 副本 有三個值 下面的場景尺度為乙個parition內 幾個概念 注意 存在這樣兩種故障,offset會需要維護 follower故障後...

如何增強Redis主從一致

之前一篇文章討論了redis原生如何保證主從一致。這是redis為我們提供的方法,但是初次之外我們還可以使用一些工具來增強一致性 不一致性的根本原因是主從同步需要一定的時間,如果此時有讀操作落在從伺服器上就會造成不一致的情況。那解決這個問題最簡單的思路就是使用半同步複製。半同步複製就是,如果有乙個寫...