針對Sharding DB的單點故障,合理構建HA架構
作者簡介
何劍敏
Oracle ACS華南區售後團隊,首席技術工程師。多年從事第一線的數據庫運維工作,有豐富項目經驗、維護經驗和調優經驗,專注於數據庫的整體運維。
sharding database最大的特點是可以橫向擴展。但是橫向擴展不是RAC的橫向擴展,純sharding db是沒有HA架構的。即一個shardcat db,多個shard node db。無論是誰down了,都會造成不可用。我們從上往下捋一下,看看哪裏有單點故障,這個單點可以通過什麼方式解決。
我們知道,sharding的架構大致如下,
1connection pool
從應用端發起之後,往下是connection pool,這個connection pool,指的是Oracle Integrated connections pools (UCP, OCI, ODP.NET, JDBC)。這個connection pool,不在本文的討論範圍內,這個是涉及到中間件的高可用問題。
往下是shard director(gsm)和shardcat數據庫。這涉及到一個路由的分類。直接路由(direct route)還是代理路由(proxy route)
直接路由
直接路由是基於sharding key,在connection pool中的connect階段就實現了。如果在connection pool(以下以UCP為例)有緩存,緩存著sharding key的range,和shard以及chunk的mapping關係,所以直接忽略shard director,直接到某個shard,node;
如果在UCP中沒有緩存,則到shard director中找一次,再去shard node。且下一次執行的時候,由於已經緩存,就不再需要去shard director中找了。
在直接路由模式下,當連接請求是包含sharding key的,即UCP的連接可以使用sharding相關的API,如pds.createShardingKeyBuilder() 和pds.createConnectionBuilder() ,相關的操作就直接去對應的數據庫分片了。
代理路由
代理路由模式是不基於sharding key的訪問,或者是需要查詢multi shard的數據,那就需要coordinator database,也就是shardcat數據庫。應用就需要通過shardcat數據庫,才能找到對應的shard node。
所以說,對於直接路由模式,我們有可能出現的問題,是shard director進程掛了。對於這個問題的解決,我們可以設置多個shard director,每個region最多可以設置5個shard director。shard director的功能,類似於向listener,你可以認為它是一個region listener。接受來自某一個區域的連接,然後進行路由。
對於代理模式,我們需要經過shardcat數據庫,那麼就可以使用到shardcat數據庫的高可用方案了。如ADG,如RAC。在sharding的高可用方案中,我們是優先考慮ADG,再考慮RAC。
另外提一下,由於如果不是multi shard的查詢,就不經過shardcat數據庫,所以如果shardcat down了,但是如果隻有某個分片的transaction,那麼也是不受到影響的。
3shard node
再往下,就是shard node了,每個shard node包含分片數據,當一個shard node掛掉的時候,shard table的其他分片,即使是活的,也是無法查詢這個shard table。
所以,我們要對shard node建立ADG,且啟用FSFO。(我會寫另外一個文章,介紹如何deploy帶ADG的shard node)。如果不用ADG,那麼OGG也是另外一種高可用的方案。此外,還有RAC,也避免一個shard node主機掛掉,注意,隻是防止主機掛掉,不能防止存儲掛掉。如果要防止存儲掛掉,還是要建ADG。(這也是為什麼sharding的最佳實踐,是建立ADG,而RAC方案隻是optional)
但是由於ADG的FSFO切換影響較大,因此最好的方式,還是RAC+ADG,即如果一個shard node的一個機器掛了,那麼在RAC架構下,還有另外一台機器能頂住,不會有問題。如果2個節點都掛了,才FSFO切換到standby。
所以,sharding的HA最佳實踐,應該是如下的:
有2個區域(region),每個region有2個或以上的gsm(shard director),然後shardcat數據庫有ADG(可以再加RAC),後麵的shard node也是要做ADG+FSFO(可以再加RAC)。
文章轉自數據和雲公眾號,原文鏈接
最後更新:2017-07-18 11:03:11