版權聲明
轉載請與作者聯繫,轉載時請務必標明文章原始出處和作者信息及本聲明。
|
|
|
微信掃瞄二維碼進入 Netkiller 微信訂閲號 QQ群:128659835 請註明“讀者” |
2017-06-16
本文從災備角度出發,並不侷限于災備,而是從多維度讓你看到完成災備需要做哪些工作,解決哪些問題。
災備不僅僅是運維的工作,一個完善的災備系統需要多個部門的努力,網絡拓撲需要做特別的調整,伺服器需要特別的部署,軟件方面需要配合災備做特別的開發,才能滿足災備的需求,最終實現真正的7*24*365災備,並且儘量做到無人值守故障轉移。
隨着各種金融交易的推出,金融市場必將非常活躍,交易量的快速增加對交易系統產生了更大的壓力,如何使交易系統平穩運行,成為金融公司的頭等大事。 隨着客戶風險意識的增強,保證關鍵核心業務系統持續成功運作的需要,將發生風險的損失降到最低,保證企業的核心競爭力,金融公司對交易系統的可靠性提出了更高的要求。 目前金融公司普遍安裝了熱備份系統,達到了一定程度上的備份,但無法應對整個機房或大樓的災難事故,這就需要在異地建立一套金融交易系統,一旦主系統發生問題,且無法啟動熱備的情況下,馬上切換到異地災備系統進行交易。
與簡單地將一部分數據從一台機器拷貝到另一台機器相比,企業內業務數據的複製要複雜的多。災備系統必須滿足以下所有業務需求:
以上的容災方案都顯得過時,這些老舊的容災方案依靠IOE(IBM,Oracle, EMC)提供的解決方案,IOE的方案通常是通用很強,你只能按照他們要求實施,IOE並不清楚我們的業務邏輯,所以方案不一定是最好的,另外一旦使用了IOE產品,就會被他們綁架,金錢投入無休止。
隨着開源軟件技術發展,IOE的產品優勢越來越不明顯,技術固步自封,影響到了用戶甚至成為企業發展的瓶頸,IOE投資回報率沒有性價比,不符合當下互聯網時代。
系統災難恢復有國際標準,我國也有自己的系統災難恢復標準,一般分為六個等級,但我覺得都較為過時,不符合互聯網時代 。
我認為等級劃分應該為
第一級:冷備份
第二級:雙機熱設備份(HA高可用, 通常為 Active Standby)
第三級:雙活互備份(Active-Active 雙機互備)
第四級:負載均衡(隨時新增節點,移除節點,橫向擴展)
第五級:異地災備
第六級:全球負載均衡(分散式災備)
從第二級開始就具備“零數據丟失”,遠遠高於國家標準與國際標準。一級可能需要人工介入,但從第二級開始都是無人值守,到第三級可以達到7*24*365不停機運轉,實現智能故障轉移。
雙機設備已經推出歷史舞台,基于主備的數據中心方案也顯得過時,我只推薦雙活的備份方案。
雙活互備不分主次機房,兩個機房同時對外提供服務,當一方出現故障時才會將用戶自動切換到另一個機房。
在雙活互備方案基礎上,我們還可以進一步擴展,做到三地互備,甚至更多的備份,但考慮到成本一般不會超過三個機房。
兩機房也好,三機房也罷,接入線路一定要選擇不同供應商。
滿足災備前提是網絡暢通無阻,同時網絡拓撲設計能夠支持災備。
供電要求:雙路供電,電力來自不同的發電廠,UPS 後備電源,柴油發電機組
空調要求:通常從地面送風的機房比較好
室內氣體監控:數據中心應該具備氣體監控,室內粉塵,濕度監控
消防:二氧化碳滅火器
機櫃:機櫃有很多規格,雖然都能放入機架伺服器,但有些比較小,沒有提供電源綫與網路槽。220V電源與網綫混在一起可能造成一定的數據丟包。
網絡設備:我常常考察一個機房會看他們的核心出口設備(是否有頂級的Cisio設備)
單機房最大的優勢是網絡連接比較方便,很多公司購買的機櫃相鄰,可能從機柜上方走綫。
雙機熱備這種我認為是過時的技術,常常主系統出現故障時,你會發現備用系統無法工作。所以我設計的系統都是AA(Active-Active)所有節點都對外提供服務,能夠更早的發現問題。
異地災備通常將兩個機房打通,但是由於線路頻寬有限(通常是1G雙絞綫或光纖 )我能做太複雜連接。通常我們將這條綫主要用戶數據複製,狀態同步,其他伺服器獨立工作。
三機房安全級別更高,採用三角路由方案,任何時刻都有兩條鏈路是暢通的,通過路由表優化決定一下跳,而且可以繞過故障節點。
三機房有三個入口,通過智能DNS將用戶解析到距離自己最近的節點上,用戶也可以在交易軟件端手動選擇。
三機房的資料庫採用環形複製
一旦數據中心網絡部分完成,下一步就是部署各種伺服器,同時伺服器的部署必須滿足災備的要求,否則無法實現災備切換與故障轉移。
伺服器與交換機連接,按照伺服器重要程度或者是否具備故障轉移,有兩種方案,如具備分散式部署的伺服器可能只連接一條網綫,有些伺服器無法分散式部署,我們是兩個網卡分別連接兩條網綫到兩台交換機,同時網卡綁定為一個適配器。
網站提供新聞,資訊,開戶,轉帳,活動,報表,在綫客服等等功能
上面是動態頁面方案,分為SSL伺服器,WEB伺服器,API介面伺服器,Admin伺服器。全部具備水平擴展與動態伸縮。下面分別詳細說明他們的功能,為什麼這樣部署。
SSL:負責處理用戶請求的加密與解密,我們將它與WEB分離,這樣能夠更好的伸縮擴展,同時提供故障轉移功能,我們可以部署很多台這樣的伺服器。在不同城市,然後通過智能DNS將用戶解析到距離用戶最近的節點上。
WEB:動態頁面伺服器
API: Service 伺服器,可以通過SOAP, JSON, MQ等等方式訪問,WEB任何操作都要請求API伺服器完成,WEB伺服器不允許直接操作資料庫,全交由API處理。API具有運用層防火牆的功能與ACL訪問控制列表。
Admin:網站後台
HA:負載均衡軟件或設備
與門戶網站不同,我們的網站訪問量並不大,性能瓶頸基本不存在,更多是考慮高可用。
靜態頁面以及CDN部門這裡就不談了,非常簡單,有興趣可能到http://netkiller.github.io/找相關資料。
在交易過程中出現報盤中斷是大忌,我們必須盡一切努力,讓交易系統能源源不斷的接收價格數據。為此我需要重點考慮數據源的災備。
我們設計了一個DataFeed程序,能夠多方接收數據,因為每個數據源提供的產品不同。我們在這裡可以合併,篩選,過濾等等。這個應用可以實現水平擴展,我們可以放在2個以上的機房當中。
接下來在交易伺服器中,設置多個數據源分別指向Data Feed 1,2~n。與Trader相同機房的DataFeed的優先順序總是最高。
數據的部署要考慮幾個問題,我一直不建議主備方案,而是採用雙活方案。所以我們要考慮兩個機房或者三個機房他們數據複製問題,性能瓶頸問題,數據安全問題等等
上圖我的方案中採用了Master-Master雙活方案,同時每個Master都會有一個Slave。Master 主要用於主要的業務,Slave主要用戶數據分析,報表查詢等等非實時,且長時間允許等等查詢服務
資料庫訪問需要經過SLB伺服器,為資料庫提供負載均衡,故障轉移,水平擴展等等功能。
所有的數據操作只能通過API完成,不能直接連接資料庫並通過SQL存取,上面已經提到過,這裡不再多講。
如果資料庫查詢如果出現瓶頸,增加Slave即可。
軟件的設計都要圍繞着災備進行,不能分散式運行,就不合格。
交易軟件通常使用TCP私有協議,與我們常見的HTTP協議不同,HTTP是無狀態,即用戶請求-處理數據-渲染HTML頁面-銷毀並釋放內存,我們很容易開發基于負載均衡的橫向水平擴展的應用程序。 而交易軟件採用的是持久TCP連接,實時傳輸用戶請求,並將結果會送給用戶,中間過程不允許中款,且用戶狀態數據存儲在該交易伺服器的內存中,如果我們採用常規手段做負載均衡,就會出現用戶被分配到另一台伺服器上,而無法繼續交易。
我們首先要做的就是將用戶狀態持久化,有點類似我們在HTTP應用中將Session持久化方法,將這些數據存儲到公共的共享伺服器上。同時該伺服器也需要做高可用等等,保證無單點故障。
第二步,我們解決分散式交易,分散式交易是指可以在交易伺服器上任意一個節點上均可交易。方法有很多,複雜程度也不同。
通常解決分散式運行的方法,無非是同步|互斥排他鎖|共享存儲等等,其實就是兩多綫程的很多技術擴展到了互聯網上。使用節點同步解決共享內存訪問問題,使用遠程鎖解決解決多節點訪問問題等等。
解決掛單問題,通常交易是即時完成的,較難處理的就是掛單。
下面的方案是最簡單的,開發難度最低。
資料庫表中增加一個欄位例如
----------------------------------------- Id | node | status | xxxxx ----------------------------------------- 1 | trader1 | N | xxxxx 2 | trader2 | Y | xxxxx -----------------------------------------
trader1 表示該記錄產生在trader1 必須在Trader 1上完成成交
trader2 表示該記錄產生在trader2 必須在Trader 2上完成成交
Update tab set status=Y where id=1 and node =<my node> …
雙向通知的含義是Trader 1狀態發生改變會通知Trader 2, 反之Trader 2狀態發生改變會通知 Trader 1。
上圖可以看出通知與資料庫持久關係圖,在交易周期內實時接收通知,一旦收到通知,便根據通知中的指令做出反應,改變當前交易伺服器的狀態。
這種設計可以採用日誌複製,然後重做日誌的方式,非常累西資料庫同步技術,缺點是可能有延遲。設計需要考慮進去。如果超過三個節點就要採用環形複製
我曾經想過通過IP組播,廣播技術實現通知發佈,這樣就可以不設置目的地地址,同時增加了部署的靈活性,而且對於廣播節點數量沒有限制。比較適合三個以上的機房部署。
消息對列,即將所有交易伺服器接入到消息隊列中,所有通知均推送進入消息隊列,由消息隊列伺服器統一管理通知消息,同時消息具備持久化。
這種方法將消息交換MQ去處理,免去了自行開發消息中間件,目前MQ技術也比較成熟。
用戶分流是指,不同用戶登錄到不同的伺服器上進行交易。因為我們的交易系統是可以水平擴展的,可以有很多台交易伺服器並且都是Active狀態,任意一台伺服器都能登陸交易,我們可以使用哈希算法基于用戶ID,將用戶分流到指定伺服器。
用戶分流還可以使用智能DNS技術,將用戶分流到距離自己最近的交易伺服器上。
還可以根據路由TTL值與Ping值進行優先順序分配。
交易終端與交易伺服器一旦連接,出現超時中斷,人為退出,下一次連接還應該上一次連接的那台交易伺服器。
如果是交易伺服器無法連接將會重新分配一台,並記錄配置
如果交易伺服器採用的是雙向通知,或者消息隊列技術,可不必記錄登陸伺服器,可能按照最小連連接數算法分配伺服器。
上文反覆提到了API,關於API請參考我的另一邊文章《CVS開發框架》,這裡不再引用。
框架講述的設計思路,你可以使用你最熟悉語言技術重新實現。
我們這個行業不是門戶網站,所以數據量不會非常大,但我們要未雨綢繆,我們在設計階段就將這些問題考慮進去,使將來不會困擾我們。
數據量最大的當屬交易數據,有些金融產品雙向交易,交易時間長,所以交易數據的累積相當可觀。
雖然你可以定時刪除,但我不建議。我認為交易數據需要永久保留,為什麼? 當交易數據積累到一定數量級,我們就可以從多角度數據挖掘,為決策提供數據支持。
第一個階段數據分區存儲,實施規劃是五年之內。五年之內你可以使用分區這種技術存儲數據。分許能夠保持索引的連續,方便複雜的資料庫查詢。
當數據龐大到無論怎麼優化都無法提高查詢性能是,這時你就要考慮資料庫拆分了。
資料庫拆分需要遵循幾個原則,不僅僅是按照年份或月份分庫分表。
傳統方法,將數據日期切分,這回帶來索引的不連續問題,且查詢時必須加帶日期,以便定位到指定的表中。如果需要做數據挖掘,需要統計四年的數據,必須查詢四次,效率大打折扣。
新的拆分方案,通過哈西算法均勻的將用戶分配到指定資料庫中或表中。這樣所有針對該用戶的操作都能在同一個資料庫中完成。
根據不同的功能拆分資料庫或表,也是一種非常不錯選擇。
由於網絡傳輸丟包和延遲等客觀情況,當交易數據量比較大且並發請求過多時,可能導致數據無法同步成功或丟失,造成兩個交易系統數據不一致。 兩個交易資料庫的數據不對等,為瞭解決該問題,可採開發一個數據校對工具,對數據進行比對和修復。確保數據一致性和完整性。
自動化運維保障伺服器快速部署,改善災備的響應速度。尤其是需要重建某些伺服器的時候。
自動化運維可以降低人為因素產生的故障,如誤刪除。
演練的主要目的是,驗證兩個交易系統能夠互備,相互做對方的備份,我們將當前登錄的系統稱為主系統,另一次叫做災備系統(僅僅是觀看的角度)。
另一個目的是,雙活系統能夠自動規避很多小災難,災難沒有擴大前系統已經自動修復了,長此以往系統管理員就會麻木,懶惰,僥倖。當更大的故障發生或雙活不能正常工作時,由於管理員長期不再狀態,就會產生難以預期的後果。
災備原理
災備中心繫統結構(系統部署圖、網絡結構圖)
災備系統運營維護
公司操作流程
切換操作流程
數據檢查與驗證
公司災備應急小組所有成員
其他感興趣員工
確定演練時間
通知參與演練的客戶
通知參與演練的業務部門
做好演練前的數據備份
檢查災備各應用服務狀態
開發部門
測試部門
業務部門
模擬災難: 在演練開始時間,關閉主交易中心的所有的應用,模擬災難發生。此時,公司應完全按照“公司操作流程”和“災備系統切換流程”來切換災備系統。
演練過程: 見“切換操作”和“公司操作流程”
演練的方式有兩種
第一種方式適合災備演練初期,因為各部門都有準備,是在良好的環境下進行,大家都坐在電腦前,看著嚴控數據,有條不紊按部就班。
但故障是隨時都能出現的,是無法預知的。所以我們還需要實行“突擊演練”。“突擊演練”最近接真是故障發生的場景,可能大家會手忙腳亂,打破之前的各種流程。你會接到各部門領導的電話,可能你當時還在睡覺或外出路上,你沒有地方上網,你的腦子一片空白,這才是真實場景。
主要的工作室數據備份,其他工作可能作為演練的一部們,工作流程等各種問題在演練中暴漏出來,才能對後面的工作改進有所幫助。
雙活互備切換操作,要進行兩次,第一次將A機房視為主機房,從A向災備機房B切換。完成後檢查無誤,再反向操作一次。
切換要模擬各種故障,通常採用的手段就是拔網綫,關閉伺服器,關閉應用,使其每條災備鏈路都能跑通。
模擬機房停電,將另一側災備機房關機
接入鏈路故障
防火牆設備故障
交換機故障設備故障
切換過程中,每一次動作,都應該收到來自監控系統的報警並精確描述的故障。這也是完善監控系統絶佳機會。
由於數據實時採集同步存在延時以及線路中斷可能,導致同步時存在數據丟失,故災備系統中的數據與主交易系統的數據可能存在不一致,故客戶端連上災備系統後,需要重新登錄,獲取災備系統中的數據進行確認,在確認正確後,即可重新進行交易。
主庫備庫數據是否一致
介面能否正常工作
網上交易能否正常進行
交易壓力是否正常
委託單是否一致, 委託回報是否完整
成交回報是否完整, 交易記錄是否完整
行情數據是否正確
客戶資金是否正常
當主交易系統切換到災備系統後,必然會有一些影響業務的情況會發生,公司需要事先有所準備,並制定相關應急預案。
由於發生重大事件,可能造成災害發生時切換到災備中心的交易系統無法切換回主交易系統。導致交易需要長時間在災備中心運行,對災備中心形成壓力。對於此情況,公司應該制定詳細的預案,保證災備中心能承擔起正常交易壓力,使用戶交易正常進行。 當確認災備中心無法在短時間切換回主交易中心時,公司應立即啟動預案,並和服務部門聯繫,請求技術支持。通過增加伺服器、增加訪問頻寬、交易數據備份等方式,使災備中心轉換為主交易系統,長期承擔主交易系統交易工作。
當主交易系統需要切換到災備系統時,為避免一部分人仍然連接到主交易系統,一部分人連接到災備系統,切換前必須關閉主交易系統的應用伺服器或者段外網絡。
由於數據同步時,存在延時,故有可能災備系統和主系統之間線路中斷後,有部分已經發生的業務沒有同步到災備系統中,部分業務也會受些影響, 故客戶端切換到災備系統中時需要重新登錄系統,以便重新查詢資料庫中的數據進行核對。
當災備中心承擔交易時,災備系統中的所有交易數據將進行備份,供事後的查詢和備案。公司可以採用熱備系統,備份災備中心的交易數據。並做好災備中心數據及時轉移到安全位置。確保災備中心數據不會丟失。
實現雙活最大的障礙是人,不是技術。你是否有足夠的權限起到很大的作用。
很多企業動不動講流程,跨部門溝通十分困難,甚至設置了很多部門防火牆(無形的牆),部門領導平級更是問題,這樣會無休止爭論下去,無法決策。
另外很多企業管理層不懂技術,無法做決策,有些領導更是怕擔責任。
開發人員都會牴觸你方案,因為在現有的穩定系統上增加改動且他並不理解的工作,後續的測試,驗收都受到影響。
運維也很不情願,只要是生產環境任何調整都存在一定的風險。
如果你的企業向上面一樣,企業已經在走下坡路了,不做事就不出事,拒絶創新.....
總之,裝B的人不在少數。
Many people think they are full of niubility and like to play zhuangbility, which only reflect their shability and erbility.
此文章已發佈,收到很多讀者的提問,雙活就是雙寫那麼怎麼解決同時寫入時的數據衝突問題。
如有下面兩個伺服器,每個伺服器有各自的ID,它們產生的數據類似下面
A伺服器: 1, 3, 5, 7 B伺服器: 2, 4, 6, 8
如果是三地數據中心,將產生類似如下的數據
A伺服器: 1, 4, 7, 10 B伺服器: 2, 5, 8, 11 C伺服器: 3, 6, 9, 12