關於雙主的一些說明【91洲際哥的筆記】

  • 2019 年 10 月 4 日
  • 筆記

首先聲明一下,雙主這種架構個人不怎麼喜歡,所以這裡只做簡單說明與吐槽

Ⅰ、雙主架構介紹

M/S(A) <====> S/M(B)

為什麼要這麼做呢?有什麼意義呢?

我也不知道

Ⅱ、雙主搭建

主上操作change masterstart slave機器A  auto_increment_increment  自增值設置為2機器B  auto_increment_increment  自增值設置為2auto_increment_offset     起始值也設置為2tips:session級別的參數,不能用set globalA1 3 5 7B2 4 6 8

這樣就可以雙寫了,帶有自增的insert沒問題

但極力不推薦

Ⅲ、雙寫存在的問題

3.1 不好的第一點

一張表上如果有唯一索引,即使是自增,也會完蛋

A上同步到B,B上寫,就會報duplicate,這還比較好,至少兩邊數據還是一致的

萬一A還沒同步到B,B上插入也成功了,兩邊都成功了複製是失敗的,這咋辦?兩邊數據都不一致了,對不起來

3.2 不好的第二點

解決不了update問題

同一條記錄在兩個節點上更新,前面一個更新的節點數據被覆蓋,就更新丟失了

3.3 相關說明

雙寫存在很多問題

  • 以前做雙主,主從複製關係之前都建立好了,以後做選主的時候就不用建立複製關係了,以前建立複製關係是很煩的一件事情
  • mha不需要做雙主,mmm才是做雙主,5.6開始,只要開啟gtid,選主是很容易的
  • 如果不是5.6,但是用了mha,mha會自動重建複製關係

綜上:所以雙主用來做選主的架構其實也不多了,很落後,雙主做雙寫很危險

應用層控制雙寫,如果能解決上面說的問題就可以用,但是很難

如果做到的話,對寫入的帶寬有很大提升

tips:

①A同步到B,為什麼B不會再推到A,這樣無限循環?

因為同步的記錄是帶有server-id的,檢測到要發送的server-id就是接收過來的server-id就不會發了

②oracle的rac為什麼可以雙寫?

  • 支持共享存儲架構,多個進程共享一個存儲
  • MySQL的M和S存儲是自己管自己
  • oracle這麼用(rac的共享存儲)就是單點

Ⅳ、雙主的一個比較好的方案

拒絕交叉寫入