最近剛做完一個(gè)小項(xiàng)目,涉及到數(shù)據(jù)同步;現(xiàn)在正在進(jìn)行另一個(gè)項(xiàng)目,也涉及到與合作公司系統(tǒng)的數(shù)據(jù)同步。
同一個(gè)領(lǐng)域,同一個(gè)命題,我們常常一遍又一遍換著方式重復(fù)著,是不可重復(fù)的特性讓我們不得不重復(fù),還是我們能力的問題,沒有抓住共性來一勞永逸解決問題呢。我無法回答,無法清楚。
在軟件設(shè)計(jì)與實(shí)現(xiàn)上,正如藝術(shù)領(lǐng)域,你根本不知道什么是最優(yōu)最好的,即不知道盡頭,何況自己技術(shù)水平一般。因而要問還有沒有更好的,別人是怎么做的,網(wǎng)上還有什么現(xiàn)成的解決方案,還有什么開源項(xiàng)目可用。
探討主要的目的,一個(gè)在于記錄和整理自己的解決思路,另一個(gè)在于有做過或見過數(shù)據(jù)同步的同行,能回復(fù)自己的實(shí)際可行的解決方案,以便互相學(xué)習(xí),取長補(bǔ)短。
正式項(xiàng)目性的開發(fā),一定有一個(gè)具體而特定的需求,我碰到的數(shù)據(jù)同步需求,一般有兩類:
1)公司自己系統(tǒng)之間的數(shù)據(jù)同步;
2)本公司系統(tǒng)與合作公司系統(tǒng)之間的數(shù)據(jù)同步。
先分析第一類:公司自己系統(tǒng)之間的數(shù)據(jù)同步。這里也有幾種情況。、
1)數(shù)據(jù)庫的雙機(jī)熱備:
我接觸過政府、公安、國稅、移動(dòng)電信,好大一部分的公司出的方案叫雙機(jī)備份,但是他們把一臺(tái)機(jī)器放到客戶機(jī)房或倉庫里,是關(guān)閉著的,常常叫冷備。這那里是備份方案,那一臺(tái)熱的跨掉了,你那臺(tái)冷的能立即使用嗎?即使軟件都是一樣的,但是數(shù)據(jù)是不一樣的,不懂技術(shù)的人都知道是賣硬件賺錢而已,做政府項(xiàng)目就這樣,大家心知肚明。
若真要在幾分鐘之內(nèi),服務(wù)能立即恢復(fù),很多工作要做,其中之一就是要數(shù)據(jù)庫的雙機(jī)熱備,兩臺(tái)數(shù)據(jù)庫里的數(shù)據(jù)相差無幾。當(dāng)然也有多數(shù)據(jù)庫節(jié)點(diǎn)提供服務(wù)的模式,也是一樣需要數(shù)據(jù)同步,更復(fù)雜。
有人提出云計(jì)算,我不討論這個(gè)新事物,至少我們做不了,我們做項(xiàng)目的,不可能拿錢給云服務(wù)提供商分一杯羔,自己也沒能力也沒必要去搞一個(gè)什么云計(jì)算。我相信很多很多國內(nèi)公司也是一樣,等別人做的成熟了實(shí)施便宜了,中小公司才去做。
從實(shí)現(xiàn)上說,談到數(shù)據(jù)庫,一般它自己都提供復(fù)制的功能,常見的oracle、sqlserver、mysql等都有,但是也沒有那么容易,真的就很完美,我們不用花一分力氣就垂手可得了?
比如mysql,這個(gè)開源數(shù)據(jù)庫我們用最多,因?yàn)椴挥缅X,做政府項(xiàng)目,他們不敢不用正版,但用了oracle、sqlserver正版,光數(shù)據(jù)庫費(fèi)用就把項(xiàng)目錢占光了,公司喝西北風(fēng)啊。
復(fù)制有兩種:1) 主備;2) 主主,即互為主備。
不管網(wǎng)上文章吹的天花亂墜,2)主主復(fù)制的方案,mysql是支持很弱的,至少我不敢直接使用它。
沒有真實(shí)項(xiàng)目實(shí)施經(jīng)驗(yàn)的人,可能直接考慮兩臺(tái)數(shù)據(jù)庫服務(wù)器在正常運(yùn)行的情況下,主主復(fù)制難道有什么問題。沒有問題,我們只考慮這個(gè)就完了,我們要考慮一臺(tái)機(jī)器突然軟件運(yùn)行異常、硬件故障、電源線被人扒掉、網(wǎng)線被人一腳不小心踩掉,在這些情況下,我們系統(tǒng)怎么辦,當(dāng)機(jī)房管理員把網(wǎng)線插好了怎么辦,把壞內(nèi)存條換好了重新開機(jī),你的數(shù)據(jù)能一致嗎?
配置過mysql復(fù)制功能的人知道,它是依靠binlog來做同步的,有一個(gè)同步點(diǎn),是需要你去設(shè)置的,也就是說,你需要機(jī)器修復(fù)之后開機(jī)能自動(dòng)正常同步,你必須自己編寫同步控制程序,自然在unix/linux世界里,shell、perl、python等腳本語言能漂亮解決問題,用不著c/c++和java。
主備復(fù)制模式是不能解決問題的!
我們最終是要考慮給用戶提供連續(xù)不間斷的服務(wù),如果是主備架構(gòu)模式,那么數(shù)據(jù)的寫入,肯定在主數(shù)據(jù)庫服務(wù)器上操作,然后同步復(fù)制同步到備份服務(wù)器上去。那么,當(dāng)主數(shù)據(jù)庫服務(wù)器發(fā)生故障,考慮軟件運(yùn)行異常、硬件故障、電源線被人扒掉、網(wǎng)線被人一腳不小心踩掉,維護(hù)人員沒有處理或處理需要一定時(shí)間,不管他怎么處理,現(xiàn)在要立即提供服務(wù),前端應(yīng)用系統(tǒng)是連接不了主數(shù)據(jù)庫服務(wù)器,要提供服務(wù),只有連接備份服務(wù)器了,只有往備份服務(wù)器寫數(shù)據(jù)了,自然,我們只有把備份服務(wù)器切換為主服務(wù)器角色了,等維護(hù)人員慢慢折騰把那臺(tái)原主服務(wù)器啟動(dòng)起來,那么原主服務(wù)器就要有能力自己自動(dòng)切換為備服務(wù)器,而不是維護(hù)人員手工去處理----這就是我常常采取的自動(dòng)主備切換,是需要使用自己編寫腳本去控制的。
有人可能說為什么不叫維護(hù)人員手工處理下,畢竟人處理是最好的,可是我們一個(gè)項(xiàng)目,在十幾個(gè)物理機(jī)房部署了服務(wù)器,我們只有一兩個(gè)維護(hù)人員偶爾去一下省中心,有時(shí)候某個(gè)市級(jí)機(jī)房里服務(wù)器被人錯(cuò)扒了網(wǎng)線或電源線,當(dāng)我們手機(jī)接收到系統(tǒng)報(bào)警短信后,只能在家里電話叫客戶網(wǎng)管去插線,如果這時(shí)還要手工去切換主備,我們又進(jìn)不了客戶的內(nèi)網(wǎng)網(wǎng)絡(luò),做過政府項(xiàng)目的人知道他們分內(nèi)外網(wǎng),那么我們系統(tǒng)不能自動(dòng)切換主備,我們維護(hù)人員就慘了,需要自己親自進(jìn)入客戶內(nèi)網(wǎng)。當(dāng)然,我們的硬盤壞了,我們必須去換硬盤,還要去具體市級(jí)機(jī)房,但是有了自動(dòng)主備切換,維護(hù)人員就可以慢慢去,過完周末下周一再去上門。
這樣解決沒有缺陷嗎?有,同步復(fù)制總會(huì)在故障點(diǎn)丟失數(shù)據(jù),但絕對不多,如果前端應(yīng)用系統(tǒng)能處理這種數(shù)據(jù)差異,則總體上能解決問題。
總之,比那種需要立即手工處理好很多,比冷備好很多很多。
(待續(xù).....)