非推倒重來式的讀/寫伸縮擴充套件

banq發表於2011-06-07
Avanza銀行是一家瑞典的銀行,讓投資者易於作出股權交易和基金交易。它透過自己的線上銀行提供很好工具給投資者使用,當前線上系統是典型的基於Java/Jsp和Spring的Web網站。

當前大部分操作是讀取,主要可伸縮性的挑戰是併發讀操作,採取的是目前很多系統採取的架構LAMP + Memcached,第一次從資料庫中獲取,以後直接從快取中獲得。

新的系統改造將設計目標為實時性和社會性領域,這就意味著很多內容將不是由網站管理者來產生,而是由使用者自己來創造,由此帶來新的大量的流量和活動。

系統將改變到以流量負載為主要目標。

寫伸縮的挑戰:
前面提到的資料庫之前快取(side-cache)的問題是帶來副作用,由於大量資料更新,導致快取中的資料過時,同步快取增加了開銷。

使用Oracle RAC 並沒有象它宣稱那樣,而且成本非常昂貴。

不像一些Green Field綠色領域應用,Avanza 有自己的線上應用,屬於Brown Field,這就帶來如下問題:
已經存在成熟的資料模型,整個資料模型設計為關聯式資料庫,將這些關係數控模型遷移到NoSQL架構,將耗費幾年的努力。還有一些遺留系統,重寫這些遺留系統幾乎是不可能的。還有複雜的環境。

採取不重寫整個系統前提下進行讀寫伸縮擴充套件:
1.圈定需要伸縮擴充套件的範圍

2.保留資料庫,在資料庫之外進行讀寫伸縮,這樣不必改變資料庫表結構。

3.將資料網格In Memory Data Grid(IMDG)放在資料庫之前。IMDG中包含所有熱點表或資料表記錄,線上Web應用將訪問IMDG而不是資料庫,IMDG可分佈地將讀寫操作分散到叢集伺服器上。

4.使用write-behind策略減少過多的同步負載。將IMDG中資料持久更新到下面的資料庫中是使用非同步的批操作,這是透過一種內部查詢機制( internal queuing mechanism (redo-log))

5.使用O/R mapping等框架將IMDG中物件資料和關聯式資料庫進行對映,例如Hibernate或OpenJPA。切分資料帶來好可伸縮性,但是這不代表改變資料表結構,在IMDG資料網格中儲存的是另外一種不同於資料庫表格式的可切分資料格式應為一種領域物件模型格式)。

6.使用標準的Java API,例如IMDGs使用 GigaSpaces提供的標準 APIs, 比如 JPA等等,能夠在創新和繼承已有之間取得技能上的平衡。

7.使用兩個並行站點促使逐步轉換。

最後的軟體架構如下:

非推倒重來式的讀/寫伸縮擴充套件












相關文章