這章講解釋你可以使用的不同的部署模型和配置。
- 復制模型和數據分發(fā) 描述sequoia支持的不同的復制模型。
- 控制器復制和水平擴展 解釋怎么使用控制器的冗余來提高集群的高可用性和容錯性。
- 客戶端如何連接sequoia, 解釋不同的客戶端應用如何通過sequoia中間件來訪問數據庫。
復制模型和數據分發(fā)
sequoia使用RAIDb的概念。
RAIDb的目標:
通過將多個廉價的數據庫實例組合到一個數據庫陣列,提供比單臺數據庫更好的性能和容錯性。
隱藏分布式數據庫的復雜性,提供給數據庫客戶端一個獨立的數據庫。
在RAIDb中,一個控制器在其他資源的前面。客戶發(fā)送他們的請求到RAIDb控制器,這個控制器將他們分發(fā)給一組RDBMS后端。
有不同的RAIDb級別或數據分發(fā)方案可用,它提供不同的費用,性能,或者容錯權衡。
全分割(RAIDb-0)
RAIDb-0 分割數據庫表到一個數據庫后端節(jié)點集。
- 一個表本身不能再分割了。但是不同的表可以分布在不同的后端節(jié)點上。
- RAIDb-0 需要至少兩個數據庫后端。
- RAIDb-0 當前只能和一個控制器配置一起使用。
- RAIDb-0 提供了一定的性能擴展,但不支持容錯功能。
注意:
當前的實現不支持分布式join。也就是說如果你想在表t1和t2間進行join操作,你必須確保t1和t2在同一臺機器上。
擴展性的提升取決于表的數目和各個表的負載情況:
- 如果你的數據庫很大,沒有單個節(jié)點有足夠的容量存放整個數據庫,那么RAIDb-0允許你把一個數據庫分布存儲到到一組節(jié)點上。
- 此外,每個數據庫引擎處理一個小的數據集可以盡可能的提高緩存利用率,因為總是請求那幾個表。
- RAIDb-0存儲的使用率是最高的,因為沒有重復的信息。
- RAIDb-0需要控制器知道那個表在哪臺服務器上,以便把請求導向正確的節(jié)點。因為沒有重復的表,一直一個后端會執(zhí)行一個特定的請求。這些信息也可以靜態(tài)配置到配置文件中,也可以從每個數據庫中抓取其schema來動態(tài)構建。
全復制 (RAIDb-1)
- RAIDb-1 在一組后端上提供了一個數據庫的全鏡像。
- RAIDb-1 需要至少兩個后端節(jié)點,但是理論上后端的數量沒有上限的限制。每個后端必須有足夠的空間運行整個數據庫。
- RAIDb-1 允許在集群配置中使用幾個控制器來為關鍵系統(tǒng)獲得高可用性。
全復制
RAIDb-1的擴展能力取決于控制器廣播更新所有節(jié)點的能力。如果有大量后端數據庫,使用復合RAIDb可以獲得更好的擴展性。
RAIDb-1提供了對讀查詢的加速,因為他們可以被均衡到所有后端上。另一方面,它對寫操作沒有加速(update,insert,delete請求),因為他們必須廣播到所有節(jié)點。寫操作在所有的后端并行執(zhí)行。所以,在寫的角度來看,RAIDb-1可能比不上一個單獨的節(jié)點,但是從讀的角度來看,性能會隨著后端節(jié)點的增加而線性增長。
RAIDb-1有很好的容錯性,因為系統(tǒng)即使只有一個后端可用時也可以保持工作。
不像RAIDb-0,RAIDb-1控制器不需要知道數據庫的結構,因為所有的節(jié)點都有能力處理任何請求。然后,RAIDb-1提供了一個緩存,它需要數據庫結構來維護緩存的一致性。
部分復制 (RAIDb-2)
RAIDb-2可以看作是RAIDb-0 和 RAIDb-1權衡下的一個中庸的解決方案。它支持調整每個數據庫表的部分復制程度,以獲得一個做好的讀寫性能。
RAIDb-2:
- 要求至少三個數據庫后端;
- 要求每個數據庫表在至少兩個后端上可用以解決單點故障問題。
- 不要求任何一個節(jié)點可以運行整個數據庫。
下面是RAIDb-2的典型應用:
沒有或者只有少數幾個節(jié)點運行整個數據庫,一組節(jié)點各自運行這數據庫的一部分。
下圖中的例子顯示了RAIDb-2的部分復制,數據庫包含3個表:x,y,和z.第一個后端包含整個數據庫,但是其他節(jié)點都只包含一個或兩個表。表x 和 y有3份拷貝,表z有兩份拷貝。任一節(jié)點失敗,仍然可以從其他的存活節(jié)點中找到數據。
RAIDb-2對于異構數據庫非常有用。一個已有的企業(yè)數據庫使用商業(yè)數據庫,但是要建立一個全拷貝無論是從存儲上還是從增加許可的費用上來說,都太貴了。有了RAIDb-2就好辦了,你可以增加幾個小型開源數據庫來各自運行整個數據庫中的某些部分來代替整個數據庫,這樣也可以獲得更好的容錯性。在下圖這個使用RAIDb-2進行部分復制的案例中,第一個后端節(jié)點可以是商業(yè)數據庫,其他4個節(jié)點是小型開源數據庫。
RAIDb-2容錯性沒有RAIDb-1好,但是它有效的改善了寫操作的效率。
跟RAIDb-0類似,RAIDb-2也要求控制器知道所有數據庫的結構,以便將請求定向到適當的節(jié)點。
警告:
在Sequoia中使用RAIDb-2仍然有一些限制。
當前,備份器不支持部分導出:當你要備份一個后端時,你將dump所有的表。類似的,當你restore一個后端時,你也將恢復所有的表。比如節(jié)點1有表x,y和z,你把他們全部dump了,如果你想用這個dump恢復節(jié)點2時,節(jié)點2將得到全部的表(x,y,z).
當節(jié)點在恢復過程中,這就成問題了:recoverylog記錄了所有的請求(對所有表的),并且嘗試去把他們重新走一遍。如果在恢復過程需要的一個表不在當前這個節(jié)點上,那么這個節(jié)點就不能被重新同步了。因此,這是個需要修復的bug,應該允許只同步當前節(jié)點上有的那些表。
另外,RAIDb-2也不支持分布式的join,跟 RAIDb-0 相同。
控制器復制和水平伸縮性
除了數據復制以外,Sequoia 還支持控制器冗余。為了防止Sequoia 控制器成為單點故障,你不惜在Sequoia 的配置中包括兩個活更多的控制器節(jié)點。
注意:
在單個數據庫和RAIDb-0配置中,你只能使用一個單獨的控制器:這些控制不支持控制器復制。
Sequoia 包含兩個可選的配置來提供水平擴展:
- 搭配控制器配置(collocated controller configuration)-同一臺及其既做控制器,又做后端數據庫服務器。
- 專用控制器配置(dedicated controller configuration)-控制器和后端數據庫服務器被裝在專門的機器上。
注意:
每個控制器必須被分配給一組特定的后端:后端堅決不能在多個控制器間共享。
搭配控制器配置適用于高可用系統(tǒng):
在一個搭配控制器配置中,Sequoia被安裝成兩個節(jié)點的配置,兩個節(jié)點都作為控制器和后端/數據庫服務器。
專用服務器適用于大型生產環(huán)境
在規(guī)模較大的環(huán)境中,Sequoia 控制器安裝在專用的服務器上來提升性能。
在控制器后面增加更多的后端,可以讓Sequoia為更多的客戶端應用請求服務。請求被后端的數據庫服務器以他們各自的速度執(zhí)行,但是控制器后面的服務器越多,可用的資源也就越多。
那么你系統(tǒng)后端需要多少臺后端才合適呢?這依賴于你的應用類型:
如果你有一個讀操作非常頻繁的應用,那么最好在每個控制器后面都放幾個后端。
另一方面,如果你的應用寫操作非常頻繁,那么控制器后面的后端最好稍微少一些。
注意:
寫操作不能和讀操作用相同的方法來衡量:
寫操作需要在每個節(jié)點上按照相同的順序同步執(zhí)行。
默認的,當所有的后端都執(zhí)行完這次請求后,寫操作的結果會返回給客戶端。(這個行為也可以在虛擬數據庫的配置文件中配置:你也可以當一臺后端執(zhí)行完這次查詢后就馬上返回結果,或者當多數后端完成這次請求后返回。)所以,對于寫操作來說,這意味著控制器后面增加幾個后端,就要多維護幾份數據庫的拷貝,但它也會增加查詢的處理能力。
客戶端怎么連接到sequoia
你客戶端應用通過Sequoia訪問數據庫的配置方式,取決于你所使用的客戶端應用。
- Java 使用Sequoia提供的JDBC驅動直接訪問
- Perl 通過DBD::JDBC Perl module 和 Sequoia JDBC驅動,或者使用Carob項目提供的ibmysequoia MySQL C API。
- C/C++ 使用Carob項目提供的ODBSequoia 驅動或者直接使用 Carob提供的C++ API
- PHP 使用Carob項目提供的ODBSequoia ODBC驅動或者MySQLi擴展和ibmysequoia MySQL C API
- .Net 使用Carob項目提供的ODBSequoia驅動
在配置你的客戶端應用時,你必須提供基本的配置信息。這些信息對于所有不同的客戶端應用都是一樣的。這些必需的信息包括:
你的Sequoia的URL或IP,虛擬數據庫的名字;
訪問虛擬數據庫的用戶名密碼。