本文摘抄自沈劍老師的文章心褐,原文地址:https://mp.weixin.qq.com/s/sCjzzi9VXPk-JcWXySfHgw
一、雙主保證高可用
MySQL數(shù)據(jù)庫集群常使用一主多從,主從同步色冀,讀寫分離的方式來擴充數(shù)據(jù)庫的讀性能,保證讀庫的高可用,但此時寫庫仍然是單點。
在一個MySQL數(shù)據(jù)庫集群中可以設(shè)置兩個主庫,并設(shè)置雙向同步趟脂,以冗余寫庫的方式來保證寫庫的高可用。
二例衍、并發(fā)引發(fā)不一致
數(shù)據(jù)冗余會引發(fā)數(shù)據(jù)的一致性問題昔期,因為數(shù)據(jù)的同步有一個時間差,并發(fā)的寫入可能導(dǎo)致數(shù)據(jù)同步失敗佛玄,引起數(shù)據(jù)丟失:
如上圖所述硼一,假設(shè)主庫使用了auto increment來作為自增主鍵:
兩個MySQL-master設(shè)置雙向同步可以用來保證主庫的高可用
數(shù)據(jù)庫中現(xiàn)存的記錄主鍵是1,2梦抢,3
主庫1插入了一條記錄般贼,主鍵為4,并向主庫2同步數(shù)據(jù)
數(shù)據(jù)同步成功之前奥吩,主庫2也插入了一條記錄哼蛆,由于數(shù)據(jù)還沒有同步成功,插入記錄生成的主鍵也為4霞赫,并向主庫1也同步數(shù)據(jù)
主庫1和主庫2都插入了主鍵為4的記錄腮介,雙主同步失敗,數(shù)據(jù)不一致
三端衰、相同步長免沖突
能否保證兩個主庫生成的主鍵一定不沖突呢叠洗?
回答:
設(shè)置不同的初始值
設(shè)置相同的增長步長
就能夠做到。
如上圖所示:
兩個MySQL-master設(shè)置雙向同步可以用來保證主庫的高可用
庫1的自增初始值是1靴迫,庫2的自增初始值是2惕味,增長步長都為2
庫1中插入數(shù)據(jù)主鍵為1/3/5/7,庫2中插入數(shù)據(jù)主鍵為2/4/6/8玉锌,不沖突
數(shù)據(jù)雙向同步后名挥,兩個主庫會包含全部數(shù)據(jù)
如上圖所示,兩個主庫最終都將包含1/2/3/4/5/6/7/8所有數(shù)據(jù)主守,即使有一個主庫掛了禀倔,另一個主庫也能夠保證寫庫的高可用。
四参淫、上游生成ID避沖突
換一個思路救湖,為何要依賴于數(shù)據(jù)庫的自增ID,來保證數(shù)據(jù)的一致性呢涎才?
完全可以由業(yè)務(wù)上游鞋既,使用統(tǒng)一的ID生成器力九,來保證ID的生成不沖突:
如上圖所示,調(diào)用方插入數(shù)據(jù)時邑闺,帶入全局唯一ID跌前,而不依賴于數(shù)據(jù)庫的auto increment,也能解決這個問題陡舅。