sharding database最大的特點是可以橫向擴充。但是橫向擴充不是RAC的橫向擴充,純sharding db是沒有HA架構的。即一個shardcat db,多個shard node db。無論是誰down了,都會造成不可用。
我們從上往下捋一下,看看哪裡有單點故障,這個單點可以通過什麼方式解決,
我們知道,sharding的架構大致如下,
(1). 從應用端發起之後,往下是connection pool,這個connection pool,指的是Oracle Integrated connections pools (UCP, OCI, ODP.NET, JDBC)。這個connection pool,不在本文的討論範圍內,這個是涉及到中介軟體的高可用問題。
(2). 往下是shard director(gsm)和shardcat資料庫。這涉及到一個路由的分類。直接路由(direct route)還是代理路由(proxy route)
(2.1). 直接路由是基於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() ,相關的操作就直接去對應的資料庫分區了。
(2.2). 代理路由模式是不基於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,那麼也是不受到影響的。
(3). 再往下,就是shard node了,每個shard node包含分區資料,當一個shard node掛掉的時候,shard table的其他分區,即使是活的,也是無法查詢這個shard table。
所以,我們要對shard node建立ADG,且啟用FSFO。(我會寫另外一個文章,介紹如何deploy帶ADG的shard node)。如果不用ADG,那麼OGG也是另外一種高可用的方案。此外,還有RAC(update 2016-11-15:關於RAC是否支援,建議大家能正式版出來的時候,試一試,因為之前beta1版的時候,我看到shard node是不支援ASM的,只支援檔案系統,但是到目前發布的線上文檔,已經沒有這個限制了。),也避免一個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)。
原文出處:
https://oracleblog.org/study-note/ha-solution-about-sharding/
我的理解:
Oracle Shard DB的架構和MongoDB基本上是類似的。
附上我寫的MongoDB分區叢集部署的連結http://blog.csdn.net/chenhaifeng2016/article/details/60139388
Shard Director (GSM)相當於MongoDB的路由服務。
Shard Catalog相當於MongoDB的佈建服務。
Shard DB Node相當於MongoDB Mongod節點。