關於雙主的一些說明【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的共享存儲)就是單點
Ⅳ、雙主的一個比較好的方案
拒絕交叉寫入
