存儲雙活的基本架構及原理
企業容災架構中,通過存儲實現雙活復制的架構相對比較常見。一般從應用訪問到底層存儲的縱向維度會分為網絡層、應用層、數據庫層、存儲網關層以及存儲陣列等四層關鍵層。談及存儲雙活架構的容災切換場景,重點關注存儲網關層以及存儲陣列層的分析。以存儲網關模式的雙活架構為例,如圖1所示,通常存儲雙活架構由兩個相距較近的數據中心(百公里以內)的存儲網關層、存儲層、仲裁中心以及相互之間的以太網絡和存儲網絡組成。
?
??
?
圖1 存儲雙活典型架構圖
如圖1所示,H1&H2表示主機節點,從主機節點到存儲網關的訪問路徑,我們不做詳細分析。
SG1&SG2表示存儲網關,雙中心的存儲網關通過存儲網絡組成一組存儲網關集群,提供AA服務。
SA1&SA2表示底層存儲磁盤陣列,通過存儲網絡分別與SG1和SG2相連接。
Q表示SG1和SG2組成集群的仲裁中心,分別以以太網絡與兩個存儲網關相連接。
存儲雙活架構正常讀寫原理分析如下:
首先,兩個數據中心的主機節點將讀寫請求通過存儲網絡發送到存儲網關層,兩邊的主機H1&H2看到的存儲空間是一個經過了鏡像組合的邏輯磁盤D,具體執行物理讀寫的時候可以通過SG1執行,也可以通過SG2執行(具體要看存儲雙活AA策略的粒度,以存儲卷為單位還是以每次IO的BLOCK為單位)。
然后,存儲網關SG1或者SG2在接收到上層應用發來的寫請求之后,直接在其本地將IO鏡像為兩個同時進行的事務分配到SA1&SA2上,這樣主機層發送到邏輯磁盤D上的單次IO在存儲網關層就被復制為兩個完全相同的IO,從而實現了數據的副本保護機制。
最后,待SA1&SA2兩個存儲陣列的緩存寫完成之后,將ACK結果反饋給SG1或者SG2,當兩邊的ACK結果都順利完成之后,最終宣告應用層的數據寫完成。
存儲雙活架構下的容災切換場景
表 1 存儲雙活容災故障切換場景分析
?
??
?
故障仲裁機制
基于第一部分的架構圖,如果C1、C2、L2-1-2、L2-2-2出現同時的故障疊加,那會出現什么樣的情況?在這種情況下,存儲雙活架構的健壯性安全性如何考慮?事實上,故障的疊加問題一般屬于二次故障,在容災架構設計當中是不需要做考慮的。一般情況下我們只考慮一次故障,因為二次或者多次故障的場景已經超過了容災的正常RTO&RPO技術標準約束。但是在以上問題當中所考慮的故障點比較特殊,根據常規判斷來講,如果我們雙中心之間的連接完全走的是唯一路由的場景下,這幾個點出現同時故障的可能性非常高。因此它也是我們在考慮雙活過程當中非常重要的故障切換場景。
當C1出現故障的時候,如果是數據庫雙活集群(例如Oracle RAC),那么兩個節點在網絡上失去的仲裁資源是同等的,接下來需要判斷的是雙活所持存儲仲裁資源的狀況。但是問題來了,這個時候C2、L2-1-2、L2-2-2同時發生故障,存儲層也處于需要仲裁的狀態,而存儲的仲裁需要根據Q的判斷來完成。也就是說當仲裁中心仲裁之后,存儲的狀態才會到達正常穩定的狀態,磁盤資源情況才會明確。當磁盤資源情況明確之后,上層數據庫集群的磁盤仲裁資源才可以作為判斷依據,然后數據庫集群才會有仲裁的可能性,最終整個容災系統才有可能到正常穩定狀態。
因此,在這種架構模式下,數據庫集群和存儲集群的疊加必然會帶來以上所描述的仲裁復雜性的問題。理論上存儲雙活的仲裁和數據庫的仲裁都是有時間參數可以控制他們的觸發時間和仲裁時間,只要保證時間順序按照上述邏輯有序可循就可以了,但是實際容災場景下的仲裁是否可以如理論所描述的順利?是否會有更復雜的場景導致理論上的偏差?這些都是未知的。
簡言之,如果希望存儲雙活架構的健壯性和安全性更有保障,就不建議在上層應用方面做更復雜的架構進行疊加使用。
社區專家主張
趙海主編:基于前面的共識,某金融機構架構師李威、江西農信運維技術經理鄧毓、某股份制銀行系統架構師老谷分別主張本議題下的相關關鍵點,幾位專家的主張在寧夏銀行技術經理陳明福及我的復議下,各位專家的主張最終形成一定的共識供同行參考。
李威 某金融機構架構師:
不談業務的雙活很大程度上就是耍流氓!雙活數據中心架構的另一重點設計是在更高維度的雙活數據中心存儲(數據核心層)與雙活應用(業務核心層)的聯動,只有縱向完成閉環切換才能保障業務的連續性。
說到基于存儲的雙活數據中心架構時,人們很可能在下意識里第一個想到便是“存儲”,是某一款存儲產品,亦或是某款存儲雙活架構的方案。在如今信息化浪潮下,筆者認為對此處“存儲”的理解應該更加精準一些,可以總結為一個基本點和兩個方向:一個基本點,指的是基于通用型存儲產品實現;兩個方向,分別是同步復制和異步復制兩種雙活方式。
?
??
?
圖2 Active-Active雙活模式數據寫入
集中式存儲產品構建的雙活數據中心,會根據企業對雙活數據中心的建設目標及雙活要求制定方案。若以高性能高可靠為目標,存儲多以Active-Active(如圖2)同步復制模式配置雙活,通過見證仲裁服務,對IO進行拆分,同步寫入多端存儲,高權重單向讀取,確保底層存儲數據強一致的同時業務效率也能達到高性能水準。在Active-Active模式下,既要保證IO效率又要保障多端數據的一致性,因此必須有一種處理機制來保駕護航——IO鎖機制,這是同步復制的核心也是雙活安全的前提。縱觀主流存儲產品同步復制IO鎖核心機制實現,我們根據何時返回IO ACK信標大致可以劃分為兩個方向:1. 將源端IO數據完全同步到遠端后向上層應用返回IO結果。2. 源端存儲加鎖后便向上層應用返回IO結果。兩種鎖機制各有利弊,前者需要更高質量的通信鏈路去保證IO效率,后者需要控制器及仲裁服務更加精準穩定,稍后我們會有詳細的分析和介紹。
?
??
?
圖3 Active-Passive雙活模式數據寫入
另一種構建雙活數據中心的方式,則是通過存儲異步復制實現。本地業務讀寫請求由本端存儲響應,通過特定時間間隔從源端存儲到遠端存儲復制,一定程度上保障多端存儲的一致性和高可靠性。相對于上文的Active-Active存儲雙活,異步復制多以Active-Passive(如圖3)模式進行,在實際雙活數據中心實踐中,生產服務端存儲承擔Active角色,絕大多數業務請求讀寫均在生產端,遠端存儲承擔Passive角色,僅實現少量業務查詢或統計類業務,只有在生產端存儲宕機、切換到遠端存儲的情況下才進行在線業務的生產支撐。同時,異步復制的實現基礎相對較低,僅需滿足完全復制增量數據的鏈路帶寬即可,建設成本低廉。
基于存儲產品構建的雙活數據中心,始終會面臨鏈路質量、數據一致性與可靠性兩大類問題的考驗。企業通常采用光纖鏈路進行數據同步,由于兩個數據中心之間天然存在物理距離,隨著距離的增長鏈路的延遲也會增大,理論上每增加100KM,會增加1ms的RTT(往返延遲時間),鏈路的建設成本也呈指數級增長。而在主流高端存儲雙活實踐中,兩地距離鏈路延遲必須小于3ms,極大地限制雙活數據中心的物理選址。同時對于TB級別的業務,鏈路帶寬要求通常在8GB及以上,保障業務波峰期雙端存儲雙活的高可靠性。如何平衡鏈路質量與持續建設成本是雙活數據中心建設中一個持久話題。
其次,存儲數據一致性與可靠性保障也是一大難關。對于同步復制而言,鎖機制是一大關鍵,因為有鎖機制的存在,多端存儲才能保持數據的一致性,若鎖機制被破壞,雙活的意義也蕩然無存。在鎖機制的實現上,“如何保障數據的時序一致性”的難題首當其沖。在AB雙活數據中心, A端應用向A端存儲卷寫入數據,當這份更新數據還未完全同步到B端存儲卷之前,B端某應用如果發起針對同一個目標地址的讀寫操作,這時B端存儲卷就不能響應此次IO,B端存儲卷該目標地址的數據仍是舊數據,與A端該目標地址存在數據差異。在存儲鎖機制的驅動下,A端應用向A端存儲卷寫入數據前應鎖住B端對應的目標地址空間后再執行數據寫入,若B端加鎖不成功,A端IO則懸掛直至B端加鎖成功。B端存儲被鎖期間均不能響應該目標地址的讀寫IO,必須等待A端的IO數據同步到B端且更新完成才能響應IO請求。
鎖機制不僅復雜,在保障時序一致性的前提下還要克服第二個現實難題,即“如何克服鏈路延遲導致的IO性能降低”。在上面的示例中,AB雙活數據中心因為距離存在鏈路延遲,那A端存儲應該何時返回IO結果給A端應用呢?是B端加鎖成功后還是B端成功更新A端該目標地址的全部新數據后?如果是前者,B端加鎖成功A端應用即可獲得IO結果,B端存儲后續還存在同步更新的操作,應用層IO效率雖然得以提升,但加大了丟失數據的風險,一旦B端還未完全同步更新數據時出現鏈路中斷或者A端存儲宕機,B端承接業務時整體數據呈不一致的狀態,對業務的傷害不言而喻。如果是后者,即傳統的同步復制方式,因為需要等到B端存儲完全同步更新數據,所以整體IO效率受鏈路傳輸質量影響而降低,但鮮少出現AB端數據不一致的情況。存儲的高效性能和數據的強一致性保障,魚和熊掌不可兼得。
克服時序一致性問題,對于異步復制而言則輕松許多。主流存儲廠商通常采取周期性復制、連續性復制兩種手段實現。周期性復制相對主流,也是較為便捷的一種方式,在雙端存儲完成初始化同步后,每間隔一段時間源端存儲進行一次快照,對比并記錄相近的兩份快照間的差異數據,并將差異數據拆分成多個IO流片段,同步至遠端存儲應用更新。若IO流傳輸過程中或遠端存儲更新數據時出現失敗,則回滾至上一次快照狀態,等待下一次同步周期再進行數據更新。若鏈路質量不佳持續出現多次失敗,源端存儲和遠端存儲的數據差異將越來越大,雙活RPO顯著降低。而連續復制則是不斷地向遠端進行數據復制,主流存儲廠商大部分采用基于日志序列的連續復制。源端存儲會開辟一塊獨立的日志空間,在進行IO時寫入一份記錄到日志空間中,按照順序將所有IO操作記錄下來形成日志流,然后不斷同步日志流至遠端應用更新。連續復制的弊端也顯而易見,倘若存儲同步鏈路中斷或者負載壓力持續走高,日志空間可能會被迅速填滿,必須借助其他手段緩解壓力,若故障長時間持續下去,連續復制的效果會大打折扣甚至中斷。
至此,我們可以對基于存儲的雙活數據中心架構進行一個總結:在雙活數據中心架構里,存儲同步鏈路質量很大程度上影響雙活的穩定性與可靠性。對于高性能高可靠的雙活要求,存儲同步復制實現是不錯的選擇,若項目預算有限或者雙活要求不高,則可以選擇存儲異步復制的方式。
我們討論了基于存儲的雙活數據中心架構的存儲架構形態、雙活機制、問題與挑戰,但討論依舊淺薄,僅局限于存儲產品層面。存儲數據的RPO與RTO,和業務系統的RPO與RTO是一個概念嗎?NO!不談業務的雙活很大程度上就是耍流氓。在企業雙活數據中心架構中,存儲端同步復制的RPO一定等于0嗎?現實往往與理想相悖,在同步復制的場景下通常會出現兩種可能性:業務系統能夠啟動起來,RPO≈0;業務系統啟不起來,RPO=RTO=∞,可能永遠都啟不起來。這就引申出了一個更有意思的話題,雙活數據中心架構下應用層雙活容災如何聯動數據中心存儲,利用存儲的生態、發揮存儲雙活的優勢去提升雙活的RPO、RTO等級呢?不妨讓我們等到應用雙活架構再來一探究竟。
鄧毓 江西農信運維技術經理:
構建既健壯又安全的存儲雙活解決方案,需同時具有靜態優先級模式和仲裁服務器模式兩種故障仲裁機制,這樣才能覆蓋所有災難場景,才是完整的雙活仲裁解決方案。
存儲雙活解決方案必須要具備足夠充分的高可用特性和合理的容災保護與仲裁機制,以應對各種各樣復雜的的災難故障場景,以極短的故障恢復時間和幾乎為零的故障恢復目標,解決可能遇到的故障災難。存儲雙活模式下,通常而言具有以下兩種故障仲裁機制:
1. 靜態優先級模式:主要應用在無第三方仲裁服務器的場景,在發生鏈路中斷腦裂現象時,強制使優先的存儲節點繼續提供服務。
2. 仲裁服務器模式:應用在有第三方仲裁服務器的場景,將仲裁服務器部署于第三方站點,在這種模式下,可同時設置靜態優先模式,實現雙仲裁保護能力。
靜態優先級模式:
如圖4所示為靜態優先模式仲裁示意圖,列舉了三個故障場景和對應的仲裁處理結果:
?
??
?
圖4 靜態優先模式仲裁示意圖
1)當兩個站點間鏈路出現故障時,靜態優先模式設置H1站點為靜態優先站點,此時H1站點將繼續對外提供讀寫服務,H2站點將停止讀寫服務,在主機端I/O訪問策略設置為優選陣列模式時,H1站點的主機將繼續本地讀寫H1站點存儲,H2站點主機既無法讀寫H2站點存儲也無法通過切換跨站點鏈路訪問H1站點存儲;
2)當非靜態優先的站點H2存儲出現故障時,H1站點存儲同樣繼續提供讀寫服務,但H2站點主機可通過配置的多路徑I/O策略,通過跨站點鏈路繼續讀寫H1站點存儲;
3)當靜態優先的站點H1存儲出現故障時,H1和H2站點均不再對外提供讀寫服務,兩個站點主機的讀寫將完全中斷,此時,只能通過人工的方式,將H2站點的存儲激活,繼續提供讀寫服務。
仲裁服務器模式(單故障場景):
如圖5所示,QS為仲裁服務器,S1為靜態優先仲裁方。有以下幾種故障場景:
?
??
?
圖5 單故障場景處理示意圖
1)當仲裁服務器本身出現故障時,S1和S2存儲能夠持續對外提供讀寫服務,主機業務無任何影響,此時由于缺少了仲裁服務器,將自動進入靜態優先模式;
2)當S1或S2存儲出現故障時,仲裁服務器能夠及時探測到故障存儲,停止故障存儲的讀寫,全部讀寫均由存活存儲提供,在主機端I/O訪問策略設置為優選陣列模式時,存活存儲所在站點的主機可以繼續本地讀寫存活存儲,而遠端主機則將自動切換至跨站點I/O路徑繼續讀寫存活存儲;
3)當S1和S2存儲間的鏈路出現故障時,等同于單站點存儲故障場景,均需要仲裁服務器進行仲裁,判定某個站點存儲失效,全部讀寫服務由一個存儲提供,只有存活的存儲所在站點的主機能夠讀寫存活存儲,而遠端站點主機由于鏈路故障,無法通過跨站點I/O路徑繼續讀寫存活存儲。在該場景下,存活的存儲將通過劃分的額外空間來記錄鏈路故障期間,存儲間的數據差異,待鏈路恢復后,通過差異數據增量同步配置和數據;
4)當S1或S2存儲與仲裁服務器間的鏈路中斷時,雙活存儲間鏈路正常,不做任何仲裁判斷,兩端主機正常讀寫雙活存儲。
仲裁服務器模式(雙故障場景):
如圖6所示,QS為仲裁服務器,S1為靜態優先仲裁方。有以下幾種故障場景:
?
??
?
圖6 雙故障場景處理示意圖
1)當S1存儲與仲裁服務器,S2存儲與仲裁服務器間的鏈路同時或者先后中斷時,由于S1和S2間的鏈路完全正常,主機正常讀寫雙活存儲,并且由于缺失了仲裁服務器響應,雙活存儲將自動進入靜態優先模式;
2)當S1和S2存儲,其中單個存儲與仲裁服務器間的鏈路同時或者先后中斷時,此時仲裁服務器將介入仲裁,判定與仲裁服務器通信正常的存儲存活,并對外提供讀寫服務,且只有存活存儲所在站點的主機才能繼續訪問存活存儲;
3)當單個存儲出現故障,另一個存儲仲裁勝利后,存活存儲與仲裁服務器間的鏈路再出現故障時,由于已經仲裁完成,選舉了獲勝存儲,只要不是該存活存儲故障,其他仲裁服務器故障和鏈路故障都不再影響獲勝站點主機的讀寫訪問;
4)當仲裁服務器出現故障后,單個存儲也隨后出現故障。該場景下,仲裁服務器故障將使得仲裁模式進入靜態優先模式,由S1存儲繼續提供服務,當故障的存儲為非靜態優先存儲時,即S2存儲故障,此時S1存儲可繼續對外讀寫,S1和S2站點的主機均可通過多路徑訪問S1存儲。當故障的存儲為靜態優先存儲時,即S1存儲故障,此時無法繼續仲裁,所有存儲讀寫訪問中斷;
5)當仲裁服務器出現故障,存儲間的鏈路也也隨后中斷,此時由于仲裁服務器故障將進入靜態優先模式,存儲間鏈路中斷不會影響優先站點存儲繼續提供讀寫服務,但只有優先站點的主機才能讀寫該存活存儲。
老谷 某股份制銀行系統架構師:
構建基于存儲的AA雙活架構,本人主張免網關的解決方案,提倡縱向上越精簡越有效,切換減少一秒,雙活成功一倍!
存儲層雙活技術路線的對比選擇:
基于遠程卷管理雙活技術架構
典型的技術為AIX LVM、IBM GPFS、OracleASM。
?
?
??
?
以IBM GPFS為例(如圖7、圖8),原理如下:
GPFS SAN網絡模式架構的跨站點雙活方案通過應用負載均衡地把服務請求分發至SiteA和SiteB兩個站點,兩個站點的所有節點均提供應用服務,SiteA節點的應用在本地對GPFS文件系統讀寫,SiteB節點的應用跨站點對GPFS文件系統讀寫。另外,SiteA節點既作為GPFS Servers,同時又擔任Application Node,而SiteB節點既可按照容災方案的第一種方式作為GPFS客戶端,又可按照容災方案的第二種方式作為GPFS的服務端。簡單總結這種方式來說,兩個站點的節點GPFS I/O讀寫路徑和性能存在些許差異。
將SiteA的NSD Server與Application Node分置于不同節點,SiteA和SiteB節點全部作為GPFS客戶端,兩個站點的節點GPFS I/O讀寫路徑和性能一致。
上述兩種雙活方案均是建立在容災方案的基礎之上,SiteA和SiteB的所有節點均加入一個GPFS集群中,利用存儲到存儲的同步復制功能,SiteA的TiebreakerDisk仲裁,需要自動探測與自動切換腳本。
通過操作系統內的 GPFS 文件系統實現,最大程度不改變傳統的物理拓撲,增加整體方案的安全性、可用性;
在操作系統層次,通過 GPFS 文件系統的failure group 功能模塊將生產、災備兩個中心的兩臺存儲虛擬為一臺存儲使用。
通過軟件雙活方案,雙活實現需要依靠主機實現,會造成服務器額外性能開銷,對于操作系統,應用程序版本敏感,版本升級操作復雜,性能調優復雜,需對集群中所有計算和存儲節點性能調優。
基于存儲網關
以EMC VPLEX為例(如圖9),原理如下:
?
??
?
圖9 EMC VPLEX 雙活架構
EMC Vplex存儲雙活方案是基于Vplex網關產品實現,能夠將EMC和其他廠商存儲異構整合,虛擬化為統一的存儲資源池,實現異構存儲雙活。Vplex雙活方案由兩個站點的兩套Vplex集群系統組成,每個站點的Vplex集群都有自己專屬的本地存儲陣列,通過創建分布式鏡像卷為跨集群的鏡像卷,提供Vplex Access Anywhere功能,兩個站點的Vplex集群各有一個卷,兩個卷的ID一樣。
主機與Vplex集群間訪問、Vplex集群與后端存儲數據傳輸、Vplex集群間通信網絡全部隔離,為保證最高級別的高可用性,每個Vplex Director前端I/O模塊、主機和SAN光纖交換機之間多通過冗余的物理連接,實現多條路徑交叉訪問。當主機與本地Vplex集群連接中斷時,為保證主機能夠跨站點訪問另一端Vplex集群,主機需要和其他站點的Vplex集群建立連接,可通過PowerPath多路軟件來配置ACTIVE/PASSIVE路徑來保證主機優先訪問本地的Vplex集群。后端存儲陣列通過SAN交換機或者直接連接Vplex引擎的后端IO模塊,不需要配置到其他Vplex集群的跨站點連接路徑;根據需要選用Witness作仲裁,Witness需部署于兩個Vplex集群不同的故障域中(第三方站點)。
增加網關設備,成本提高,主機與存儲的交互通過網關進行轉發。增加了IO鏈路長度和復雜度,引入了額外的延時。
Vplex作為網關設備,帶讀緩存,可以把經常訪問的數據從存儲的cache里讀到vplex的cache里,這樣能降低讀響應時間,提升讀的性能。
網關設備的能力約束存儲設備自身性能潛力發揮,同時增加硬件故障風險。
通過網關方案橫向擴展能力強,可實現異構存儲的統一管理。
基于存儲卷鏡像
以華為存儲為例(如圖10),原理如下:
?
??
?
圖10 華為雙活存儲架構
采用存儲磁盤設備的卷鏡像技術實現兩站點間的數據實時同步。兩臺存儲設備上的LUN被虛擬化為一個虛擬的卷,主機寫操作通過卷虛擬化鏡像技術同時寫入這兩個存儲設備,保持數據實時一致。其中任何一個存儲設備故障,虛擬卷仍能提供正常的IO讀寫能力,主機業務不受影響。待存儲設備恢復正常后,存儲虛擬化設備將增量數據后臺同步到修復的存儲設備,整個過程對主機“透明”,不會影響主機業務。
HyperMetro雙活架構無需額外部署虛擬化網關設備,直接使用兩套存儲陣列組成集群系統。通過UltraPath主機多路徑軟件,將兩臺存儲陣列上的雙活成員LUN聚合為一個雙活LUN,以多路徑vdisk方式對應用程序提供I/O讀寫能力。應用程序訪問vdisk時,Ultrapath根據選路模式,選擇最佳的訪問路徑,將I/O請求下發到存儲陣列。
不同存儲雙活路線的優劣勢對比如表2。
表2 存儲層雙活技術路線對比分析
?
??
?
結論:AA存儲雙活,免網關設計,省掉網關引入的延時;可通過雙寫優化,站點間交互次數只有傳統的一半,傳輸時延時縮短一倍;通過數據零拷貝,減少數據初始同步時間,降低同步鏈路帶寬占用,最終保障雙活流量的順暢,提高業務連續性目標。
評論
查看更多