mysql雙主數據一致性_MySQL雙主一致性架構優化 | 架構師之路-阿里云開發者社區...

一、雙主保證高可用

MySQL數據庫集群常使用一主多從,主從同步,讀寫分離的方式來擴充數據庫的讀性能,保證讀庫的高可用,但此時寫庫仍然是單點。

在一個MySQL數據庫集群中可以設置兩個主庫,并設置雙向同步,以冗余寫庫的方式來保證寫庫的高可用。

二、并發引發不一致

數據冗余會引發數據的一致性問題,因為數據的同步有一個時間差,并發的寫入可能導致數據同步失敗,引起數據丟失:

8920604e86937575577c4035efebd7e5.png

如上圖所述,假設主庫使用了auto increment來作為自增主鍵:

兩個MySQL-master設置雙向同步可以用來保證主庫的高可用

數據庫中現存的記錄主鍵是1,2,3

主庫1插入了一條記錄,主鍵為4,并向主庫2同步數據

數據同步成功之前,主庫2也插入了一條記錄,由于數據還沒有同步成功,插入記錄生成的主鍵也為4,并向主庫1也同步數據

主庫1和主庫2都插入了主鍵為4的記錄,雙主同步失敗,數據不一致

三、相同步長免沖突

能否保證兩個主庫生成的主鍵一定不沖突呢?

回答:

設置不同的初始值

設置相同的增長步長

就能夠做到。

dddef72f6fc6d79bd2f4c1496eaefe38.png

如上圖所示:

兩個MySQL-master設置雙向同步可以用來保證主庫的高可用

庫1的自增初始值是1,庫2的自增初始值是2,增長步長都為2

庫1中插入數據主鍵為1/3/5/7,庫2中插入數據主鍵為2/4/6/8,不沖突

數據雙向同步后,兩個主庫會包含全部數據

e8227f9813cf365f7348bb203e59f420.png

如上圖所示,兩個主庫最終都將包含1/2/3/4/5/6/7/8所有數據,即使有一個主庫掛了,另一個主庫也能夠保證寫庫的高可用。

四、上游生成ID避沖突

換一個思路,為何要依賴于數據庫的自增ID,來保證數據的一致性呢?

完全可以由業務上游,使用統一的ID生成器,來保證ID的生成不沖突:

2b91d4c5c819a0c24243ad33890d72a2.png

如上圖所示,調用方插入數據時,帶入全局唯一ID,而不依賴于數據庫的auto increment,也能解決這個問題。

至于如何生成全局唯一,趨勢遞增的ID,參見文章《分布式ID生成算法》。

五、消除雙寫不治本

使用auto increment兩個主庫并發寫可能導致數據不一致,只使用一個主庫提供服務,另一個主庫作為shadow-master,只用來保證高可用,能否避免一致性問題呢?

1d004b5702ea323e92d860c5ee6ac393.png

如上圖所示:

兩個MySQL-master設置雙向同步可以用來保證主庫的高可用

只有主庫1對外提供寫入服務

兩個主庫設置相同的虛IP,在主庫1掛掉或者網絡異常的時候,虛IP自動漂移,shadow master頂上,保證主庫的高可用

這個切換由于虛IP沒有變化,所以切換過程對調用方是透明的,但在極限的情況下,也可能引發數據的不一致:

824107fd8f62af43624bd2d967603d4b.png

如上圖所示:

兩個MySQL-master設置雙向同步可以用來保證主庫的高可用,并設置了相同的虛IP

網絡抖動前,主庫1對上游提供寫入服務,插入了一條記錄,主鍵為4,并向shadow master主庫2同步數據

突然主庫1網絡異常,keepalived檢測出異常后,實施虛IP漂移,主庫2開始提供服務

在主鍵4的數據同步成功之前,主庫2插入了一條記錄,也生成了主鍵為4的記錄,結果導致數據不一致

六、內網DNS探測

虛IP漂移,雙主同步延時導致的數據不一致,本質上,需要在雙主同步完數據之后,再實施虛IP偏移,使用內網DNS探測,可以實現shadow master延時高可用:

使用內網域名連接數據庫,例如:db.58daojia.org

主庫1和主庫2設置雙主同步,不使用相同虛IP,而是分別使用ip1和ip2

一開始db.58daojia.org指向ip1

用一個小腳本輪詢探測ip1主庫的連通性

當ip1主庫發生異常時,小腳本delay一個x秒的延時,等待主庫2同步完數據之后,再將db.58daojia.org解析到ip2

程序以內網域名進行重連,即可自動連接到ip2主庫,并保證了數據的一致性

七、總結

主庫高可用,主庫一致性,一些小技巧:

雙主同步是一種常見的保證寫庫高可用的方式

設置相同步長,不同初始值,可以避免auto increment生成沖突主鍵

不依賴數據庫,業務調用方自己生成全局唯一ID是一個好方法

shadow master保證寫庫高可用,只有一個寫庫提供服務,并不能完全保證一致性

內網DNS探測,可以實現在主庫1出現問題后,延時一個時間,再進行主庫切換,以保證數據一致性

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

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

相關文章

spool導出姓名中文亂碼_MySQL不同字符集轉化標準—7步實現,杜絕亂碼!

引言作為資深的DBA程序員,在工作中是否會遇到更這樣的情況呢?原有數據庫的字符集由于前期規劃不足,隨著業務的發展不能滿足業務的需求。如原來業務系統用的是utf8字符集,后期有存儲表情符號的需求,uft8字符集就不能滿足…

appium和airtest_關于Airtest自動化測試工具

一開始知道Airtest大概是在年初的時候,當時,看了一下官方的文檔,大概是類似Sikuli的一個工具,主要用來做游戲自動化的,通過截圖的方式用來解決游戲自動化測試的難題。最近,移動端測試的同事嘗試用它的poco庫…

easyexcel 設置標題_使用easyexcel完成復雜表頭及標題的導出功能(自定義樣式)

如需客戶端指定excel版本,只需要判斷后綴名然后在controller中的.excelType(ExcelTypeEnum.XLS)做指定輸出內容格式即可***(注意表格行高列寬統一設置是在實體類的類名注解上,如果需要對表格進行精細的寬高設置需要刪除掉這兩個注解,可以在攔截器使用row的方法進行設置)1. ## 引…

mysql distinct兩列_正在檢索兩列,并對MySQL中的每列應用“distinct”

這是一張桌子books----------------------------| author_fname | author_lname |----------------------------| Dan | Harris || Freida | Harris || George | Saunders |----------------------------我知道如果DISTINCT用作SELECT DISTINCT author_fname, author_lname FRO…

mysql笛卡爾積 去重_MySQL入門(函數、條件、連接)

MySQL入門(四)distinct:去重mysql>:create table t1(id int,x int,y int);mysql>: insert into t1 values(1, 1, 1), (2, 1, 2), (3, 2, 2), (4, 2, 2);mysql>: select distinct * from t1; # 全部數據mysql>: select distinct x, y from t1; # 結果 1,…

nmon安裝為什么重啟mysql_Nmon的安裝及使用

一、下載Nmon根據CPU的類型選擇下載相應的版本:二、初始化工具[rootmululu ~]# cd /opt[rootmululu opt]# mkdir nmon[rootmululu opt]# cd nmon[rootmululu nmon]#wget http://sourceforge.net/projects/nmon/files/download/nmon_x86_12a.zip[rootmululu nmon]# u…

mysql join 循環_關于mysql聯表的內嵌循環操作nested loop join中on和where執行順序問題...

mysql的理論依據沒找到,個人理解是先執行where的過濾條件,先關聯再過濾明顯做的是無用功。oracle中倒是能在執行計劃中看到,先執行的是過濾條件(下面代碼中最后一行)。explain plan for SELECT * FROM tmp_t2 t2 LEFT JOIN tmp_t1 t1 ON t2.i…

python非法語句是_python 如何優雅的處理大量異常語句?

bs4的鏈式調用很贊,所以我把soup包裝了一下class MY_SOUP():包裝類def __init__(self,soup):self.soup soupif soup:if soup.string:self.string soup.string.strip()else:self.string Noneelse:self.string Nonedef find(self, *args, **kw):ret self.soup.fi…

Iptables詳解+實例

2019獨角獸企業重金招聘Python工程師標準>>> Iptabels是與Linux內核集成的包過濾防火墻系統,幾乎所有的linux發行版本都會包含Iptables的功能。如果 Linux 系統連接到因特網或 LAN、服務器或連接 LAN 和因特網的代理服務器, 則Iptables有利于…

django ipython shell_通過django的shell_plus編寫ipython腳本

Im writing a shell script which runs a command through ipython with the -c option like this:我正在編寫一個shell腳本,它通過ipython運行一個命令,使用-c選項,如下所示:ipython -c "from blah import myfunct; myfunct()"but…

阿里云服務器安裝onlyoffice_阿里云服務器安裝 JDK 8

歡迎關注“科技毒瘤君”&#xff01;上一期給大家分享了如何申請阿里云的免費云服務器&#xff0c;還沒有看過的小伙伴可以先前往了解 >>阿里云免費服務器<<這一次將會為大家分享如何在服務器上配置 Java環境&#xff0c;這里演示使用的系統為Ubuntu 18.04 64位&am…

js發送請求

1.Chrome控制臺中 net::ERR_CONNECTION_REFUSED js頻繁發送請求&#xff0c;有可能連接被拒絕&#xff0c;可用setTimeout&#xff0c;過幾秒發送&#xff0c;給個緩沖時間 var overlayAnalystService L.supermap.spatialAnalystService(serviceUrl); setTimeout(function () …

據說有99%的人都會做錯的面試題

這道題主要考察了面試者對浮點數存儲格式的理解。另外&#xff0c;請不要討論該題本身是否有意義之類的話題。本題只為了測試面試者相關的知識是否掌握&#xff0c;題目本身并沒有實際的意義。 下面有6個浮點類型變量&#xff0c;其中前三個是float類型的&#xff0c;后三個是d…

php使用mysql5和8的區別_mysql8.0和mysql5.7的區別是什么?

區別&#xff1a;mysql8.0的索引可以被隱藏和顯示&#xff0c;當一個索引隱藏時&#xff0c;他不會被查詢優化器所使用&#xff1b;2、mysql8.0新增了“SET PERSIST”命令&#xff1b;3、從mysql8.0開始&#xff0c;數據庫的缺省編碼將改為utf8mb4&#xff0c;包含了所有emoji字…

mysql pt check sum_percona工具pt-table-checksum

利用pt-table-checksum進行數據庫同步檢查rpm方式#wget percona.com/get/percona-toolkit.rpm源碼方式#wget http://www.percona.com/downloads/percona-toolkit/2.2.1/percona-toolkit-2.2.8.tar.gz#yum install perl perl-CPAN perl-DBD-MySQL perl-Time-HiRes解壓&#xff0…

如何通過BBED找回刪除數據

項目案例&#xff1a;客戶刪除delete了重要數據&#xff0c;無備份&#xff0c;客戶聯系我&#xff0c;要求恢復相應數據。本次通過實驗方式重現客戶現場。備份高于一切&#xff0c;首先備份&#xff0c;再操作 創建表格&#xff1a; create table king(age number,name varcha…

mysql 重置密碼語音_數字語音信號處理學習筆記語音信號的同態處理(2)

5.4 復倒譜和倒譜 定義 設信號x(n)的z變換為X(z) z[x(n)]&#xff0c;其對數為&#xff1a; (1) 那么 的逆z變換可寫成&#xff1a; (2) 取 (1)式則有 (3) 于是式子(2)則可以寫成 (4) 則式子(4)即為信號x(n)的復倒譜 的定義。因為 一般為復數&#xff0c;故稱 為復倒譜。如果對…

NFS 八步神曲

Server:第一步yum install - y nfs*第二步vi /etc/exports第三步/var/testdirs *(rw,all_squash,anonuid99,anongid99,sync)第四步service nfs start第五步chkconfig --level 35 nfs on Client第一步mount 192.168.1.X:/var/www/testdirs /var/www/testdirs第二步vi /et…

mysql權限日志_mysql權限管理、日志管理及常用工具

mysqlbinlog用法如下&#xff1a;mysqbinlog mysql.err 查詢錯誤日志當然可以通過添加參數來查看指定內容,如&#xff1a;mysqlbinlog mysql-bin.000001 -d test 只顯示對test數據庫的二進制日志mysqlbinlog mysql-bin.000001 -o 3 -r result-file 首先忽略前三個操作&…