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