一、背景
中國(guó)大陸用戶主要分布在南北,南北數(shù)據(jù)一般專線延遲是60~100ms,所以為了提高用戶體驗(yàn)一般設(shè)置南北機(jī)房,整個(gè)架構(gòu)為雙A,兩邊均可寫,可以極大的提升用戶體驗(yàn)。
因此某服務(wù)主要分為南北機(jī)房,每個(gè)機(jī)房都擁有全量數(shù)據(jù),用戶在北方修改數(shù)據(jù)會(huì)同步到南方,南方修改數(shù)據(jù)會(huì)同步到北方。
數(shù)據(jù)主要分為緩存數(shù)據(jù)和DB數(shù)據(jù),這個(gè)數(shù)據(jù)同步就成了問(wèn)題,怎么保證最終一致性呢?強(qiáng)一致性就算了!(強(qiáng)一致性的保證成本過(guò)高,需要特殊場(chǎng)景特殊設(shè)計(jì),我認(rèn)為是很難歸納出通用方案的)
二、通常的架構(gòu)
南北機(jī)房的緩存用mq同步,而DB用otter同步。
otter是阿里巴巴出的數(shù)據(jù)同步方案:https://github.com/alibaba/otter
三、會(huì)出現(xiàn)的問(wèn)題
數(shù)據(jù)同步永遠(yuǎn)都躲不過(guò)的一致性問(wèn)題。
跨機(jī)房的緩存之間不一致
1、mq同步緩存延遲在60~100ms,必定短暫不一致;
2、mq同步會(huì)出現(xiàn)失敗,必定短暫不一致,但是緩存過(guò)期后會(huì)重新拿DB的數(shù)據(jù),這時(shí)候就可以保證一致,就是所謂的最終一致性。
跨機(jī)房的DB之間不一致
1、otter同步一般在700~2000ms之間波動(dòng),因?yàn)閿?shù)據(jù)庫(kù)同步會(huì)受到搶鎖,數(shù)據(jù)校驗(yàn),磁盤IO的影響,那么就會(huì)出現(xiàn)短暫DB數(shù)據(jù)不一致;
2、極小幾率出現(xiàn)otter數(shù)據(jù)同步失敗,otter有對(duì)應(yīng)機(jī)制降低這種錯(cuò)誤幾率。(如果真的不一致只能由業(yè)務(wù)做補(bǔ)償操作)
同機(jī)房的緩存和DB短暫不一致
1、mq同步緩存的時(shí)間比otter同步速度快,短暫時(shí)間內(nèi)不一致,數(shù)據(jù)到達(dá)后保證最終一致;
2、北方緩存同步到了南方,但是緩存過(guò)期了再次獲取DB數(shù)據(jù)的時(shí)候,otter還沒(méi)有同步數(shù)據(jù)過(guò)來(lái),緩存就會(huì)還是拿到了舊數(shù)據(jù),因此也有幾率出現(xiàn)數(shù)據(jù)短暫不一致。(這時(shí)候很需要延遲mq,延遲同步南北緩存,寧愿數(shù)據(jù)跨機(jī)房不一致,也不要同機(jī)房不一致)