聊一聊讀寫分離
前言
我司在618、雙11等各種大促活動(dòng)的時(shí)候,系統(tǒng)都要面對(duì)大量的訪問量,數(shù)據(jù)節(jié)點(diǎn)的吞吐量也成為整個(gè)系統(tǒng)的瓶頸。
所以為了提升數(shù)據(jù)節(jié)點(diǎn)的吞吐量和可用性,我們不僅僅要做數(shù)據(jù)分片,還需要分析一下同一時(shí)刻的讀寫操作比,對(duì)于讀多寫少的系統(tǒng)來講,可以把數(shù)據(jù)節(jié)點(diǎn)拆分為主節(jié)點(diǎn)和從節(jié)點(diǎn),主節(jié)點(diǎn)負(fù)責(zé)處理事務(wù)性的增刪改操作,從節(jié)點(diǎn)負(fù)責(zé)處理查詢操作(就像公司的產(chǎn)品負(fù)責(zé)談跟業(yè)務(wù)談需求、聊業(yè)務(wù),而開發(fā)人員負(fù)責(zé)具體的業(yè)務(wù)實(shí)現(xiàn)),能夠有效的避免由數(shù)據(jù)更新導(dǎo)致的行鎖,使得整個(gè)系統(tǒng)的查詢性能得到提升。

一主多從
通過一主多從的方式,我們可以將查詢請(qǐng)求均勻地分散到多個(gè)從數(shù)據(jù)節(jié)點(diǎn)上,來提升系統(tǒng)的查詢能力(這里有個(gè)小技巧,從數(shù)據(jù)節(jié)點(diǎn)太多的話,可以從主數(shù)據(jù)節(jié)點(diǎn)先同步到一個(gè)從數(shù)據(jù)節(jié)點(diǎn),再?gòu)倪@個(gè)從數(shù)據(jù)節(jié)點(diǎn)同步到其他的從數(shù)據(jù)節(jié)點(diǎn))。

多主多從
使用多主多從的方式,不但能夠提升系統(tǒng)的吞吐量,還能夠提升系統(tǒng)的可用性,可以做到在任何一個(gè)數(shù)據(jù)節(jié)點(diǎn)宕機(jī)(主數(shù)據(jù)節(jié)點(diǎn)或者從數(shù)據(jù)節(jié)點(diǎn)),甚至所在的服務(wù)器的磁盤物理損壞的情況下系統(tǒng)仍正常運(yùn)行。

與將數(shù)據(jù)根據(jù)分片鍵規(guī)則存放到各個(gè)數(shù)據(jù)節(jié)點(diǎn)的水平分片不同,讀寫分離則是根據(jù)SQL語義的分析,將讀操作和寫操作分別路由至主數(shù)據(jù)節(jié)點(diǎn)與從數(shù)據(jù)節(jié)點(diǎn)(這種處理相對(duì)來說簡(jiǎn)單些)。

讀寫分離的數(shù)據(jù)節(jié)點(diǎn)中的數(shù)據(jù)是一致的,而水平分片的每個(gè)數(shù)據(jù)節(jié)點(diǎn)的數(shù)據(jù)并不相同(因?yàn)閿?shù)據(jù)是根據(jù)分片策略處理的,如果一直的話那就叫做讀寫分離)。將讀寫分離和水平分片一起使用,能夠有效地提升系統(tǒng)性能。
問題
讀寫分離雖然可以提升系統(tǒng)的吞吐量和可用性,但同時(shí)也帶來了數(shù)據(jù)不一致的問題。這包括主節(jié)點(diǎn)與主節(jié)點(diǎn)之間的數(shù)據(jù)一致性,以及主節(jié)點(diǎn)與從節(jié)點(diǎn)之間的數(shù)據(jù)一致性的問題。
讀寫分離也帶來了與數(shù)據(jù)分片同樣的問題,它同樣會(huì)使得開發(fā)人員和運(yùn)維人員對(duì)數(shù)據(jù)庫的操作和運(yùn)維變得更加復(fù)雜。
想想看,數(shù)據(jù)節(jié)點(diǎn)經(jīng)過數(shù)據(jù)分片,然后再經(jīng)過讀寫分離,在單數(shù)據(jù)節(jié)點(diǎn)的時(shí)候,你執(zhí)行一條SQL,有問題的時(shí)候只要看這個(gè)數(shù)據(jù)節(jié)點(diǎn)就可以;但現(xiàn)在這么復(fù)雜的數(shù)據(jù)環(huán)境,你需要知道分片規(guī)則,還要確定主節(jié)點(diǎn)和從節(jié)點(diǎn)數(shù)據(jù)是否一致等等。

寫在最后
好兄弟可以點(diǎn)贊并關(guān)注我的公眾號(hào)“javaAnswer”,全部都是干貨。
