基本概念
邏輯集群是通過Node Group機制來實現資源和數據的隔離。通過把物理集群的所有物理節點劃分成多個邏輯集群,每個邏輯集群本質上是一個Node Group,每個物理節點只能屬于一個邏輯集群,用戶數據表只能分布在一個邏輯集群范圍內。這樣不同邏輯集群的用戶數據是隔離的,邏輯集群所屬節點的資源主要提供給邏輯集群內數據表的操作,同時供其他邏輯集群的作業交互查詢使用。企業將不同的業務部署在不同的邏輯集群上,既可以實現業務統一管理,也能保證業務之間數據隔離和資源隔離。
邏輯集群從物理節點層次將大集群進行劃分,和數據庫形成交叉。一個數據庫中的表可以按邏輯集群來分配到不同的物理節點,而一個邏輯集群也可以包含多個數據庫的表。在劃分邏輯集群后,整個數據庫中對象間的層次關系如圖 邏輯集群、數據庫、表層次關系所示。
其中Elastic_group彈性集群是指在邏輯集群模式下,非邏輯集群節點組成的集群并且總是存在,是一個特殊的Node Group,可以包含多個或不包含任何DN節點。彈性集群不能用戶手動創建,在物理集群下第一次創建邏輯集群時自動創建彈性集群,物理集群中所有不屬于邏輯集群的物理節點都會加入彈性集群。后續邏輯集群創建所需的DN節點都是來自彈性集群中。因此,為了能夠創建新的邏輯集群,需要保證彈性集群中有DN節點存在(在物理集群模式下第一次創建邏輯集群時不需要)。用戶可以通過擴容向彈性集群添加新的物理節點。
邏輯集群是基于Node Group機制來劃分物理節點的一種集群模式,從節點層次將大集群進行劃分,和數據庫形成交叉。一個數據庫中的表可以按邏輯集群來分配到不同的物理節點,而一個邏輯集群也可以包含多個數據庫的表。在劃分邏輯集群后,整個數據庫中對象間的層次關系如下圖所示。
邏輯集群、數據庫、表層次關系

說明
邏輯集群僅8.1.0.100及以上集群版本支持。
在實際業務場景中,建議用戶盡可能將同一個數據庫的表創建到同一個邏輯集群中。
邏輯集群不是獨立子集群,可以實現數據隔離,資源隔離和權限隔離,但不支持獨立運維。
邏輯集群不支持經典變更規格。
邏輯集群架構
圖 邏輯集群架構展示了物理集群劃分成多個邏輯集群的架構示意圖。物理集群的所有節點被分成多個邏輯集群節點組。業務用戶1和業務用戶2的作業分別在不同的邏輯集群上執行。用戶1和用戶2可以在本邏輯集群內部定義資源池來控制不同作業的資源(CPU,內存,I/O)。如果業務用戶1的某些作業需要訪問業務用戶2的數據,在獲得授權后可以跨邏輯集群訪問。邏輯集群可以配置跨邏輯集群訪問的資源來保證邏輯集群內部作業的資源充足。
圖 邏輯集群架構
將物理集群的所有節點分成多個邏輯集群,每個子集群都可以根據業務情況定義資源池。由于用戶表不會跨邏輯集群分布,如果業務不跨邏輯集群訪問,業務之間就不存在資源競爭。同一邏輯集群內部的作業可以通過資源池來分配資源。如果某些業務需要訪問其他邏輯集群的數據,可以跨邏輯集群訪問,被訪問的邏輯集群可以對來自其他邏輯集群的訪問請求進行資源控制,以減少對邏輯集群內部作業的資源競爭。
用戶在創建完成物理集群后就要確定是否劃分邏輯集群,如果在劃分邏輯集群前已經創建了用戶表,由于這些用戶表已經分布在所有物理節點,就無法再劃分邏輯集群了,具體限制條件請參見下文 約束與限制。對于已經在使用的集群(例如8.1.0.100之前版本構建的數據庫集群),如果希望轉換為邏輯集群管理,可以在集群升級到支持邏輯集群(8.1.0.100及以上版本)后,將整個集群全部節點轉換為一個邏輯集群。然后通過添加新節點對物理集群擴容,并在新增節點上創建新的邏輯集群。
邏輯集群支持如下管理操作:
添加/刪除邏輯集群:
- 添加邏輯集群:物理集群轉換為邏輯集群后,可指定邏輯集群名稱和物理節點列表,將這些物理節點劃分為一個邏輯集群。
- 刪除邏輯集群:刪除指定名稱的邏輯集群,邏輯集群刪除后釋放的節點會落入彈性集群中。
管理邏輯集群:
- 編輯邏輯集群:根據需求向邏輯集群中添加節點或減少節點。
- 資源管理(邏輯集群模式):對指定邏輯集群進行資源管理(及以上版本支持)。
- 擴容邏輯集群:該操作將擴大邏輯集群物理節點數目,并對邏輯集群內的表進行重分布到擴容后的物理節點上。
- 重啟邏輯集群:該操作將邏輯集群包含的所有DN重新啟動,考慮到對整個物理集群的影響,邏輯集群并不支持單獨的停止和啟動。
- 縮容邏輯集群:從彈性集群中選擇指定的主機環,縮容選定的主機環。
約束和限制
- 邏輯集群的創建、擴容和縮容必須以環為單位,最少3個物理節點,DN的主備從必須在同一環所包含的物理節點內。
- 邏輯集群切換期間,如果原物理集群有數據,則會進行鎖集群操作。用戶可執行增刪改查等簡單DML語句,但執行操作數據庫對象等復雜DDL語句會阻塞業務出現報錯,請謹慎操作。
- 邏輯集群不支持單獨備份和恢復。
- 邏輯集群不支持單獨升級。
- 物理集群轉換為邏輯集群模式之后不支持回退到物理集群。
- 邏輯集群模式下,只能創建邏輯集群,不支持創建普通的NodeGroup,邏輯集群內部也不支持創建子NodeGroup。
- 邏輯集群的OM操作(創建、刪除、編輯、擴容、縮容、重啟)不支持并行執行。
- 由于公共數據庫對象(除系統表之外的表、外表和視圖)會分布在物理集群所有節點,當某個邏輯集群節點重啟后,其他邏輯集群對這些公共數據庫對象進行的DDL操作將會中斷。
- 在邏輯集群模式下,由于每個DN只包含所屬邏輯集群下的表,而自定義函數要在所有DN上創建,因此創建的函數體中不能使用%type引用表字段類型。
- 在邏輯集群模式下,WITH RECURSIVE語句不支持下推。
- 在邏輯集群模式下,只有在相同邏輯集群下支持交換分區,不同邏輯集群下的分區表和普通表不支持交換分區。
- 在邏輯集群模式下,創建函數時如果函數參數或返回值有表類型,這些表類型必須屬于同一個邏輯集群。
- 在邏輯集群模式下,通過CREATE TABLE ... LIKE方式創建外表時,源表和要創建的外表必須是在同一個邏輯集群中。
- 在邏輯集群模式下,不支持創建Schema同時創建表語句,即CREATE
SCHEMA ... CREATE TABLE語句,用戶需要首先創建Schema,再創建表到該Schema下。 - 邏輯集群不支持一主多備,邏輯集群只在主備從的部署形態下生效。
- 某個邏輯集群用戶不能訪問另一個邏輯集群用戶創建的全局臨時表。
權限說明(在邏輯集群模式下)
- 邏輯集群創建權限(CREATE ON NODE GROUP)允許授予任何用戶/角色,創建權限后可在對應的邏輯集群上進行創建表等相關操作。
?如果創建的表指定的schema是某個用戶私有schema(即該schema和用戶同名且schema的owner是該用戶),則新創建的表會將owner自動變更為該用戶,不需要進行關聯邏輯集群操作。
?如果用戶關聯了邏輯集群,則表創建在所關聯的邏輯集群上;否則,根據下方邏輯集群的建表規則創建。
?和邏輯集群關聯的用戶在創建表時不需要指定to group,支持變更用戶關聯的邏輯集群。
- 建表規則
?用戶表在沒有指定to group時,如果設置了default_storage_nodegroup參數,則會將表創建到指定的邏輯集群中。
?如果default_storage_nodegroup參數設置為installation時,則會將表創建到第一個邏輯集群中(即所有邏輯集群中oid最小的一個)。
- 允許修改表的owner為任何用戶,但對表進行操作時,需要檢查對應的schema和nodegroup權限。
- 系統管理員可以關聯到特定邏輯集群,并在多個邏輯集群中創建表。
?系統管理員如果關聯了邏輯集群,那么創建表時如果未指定to group,那么會默認創建到關聯的邏輯集群中;如果指定了to group,則可將表創建到指定的邏輯集群中。
?系統管理員如果沒有關聯邏輯集群,沒有指定to group,則創建在由default_storage_nodegroup參數指定的邏輯集群中,詳情參見上方建表規則。
- 允許將系統管理員權限授予關聯了邏輯集群的用戶,但同樣遵循建表規則。
- 非表對象(schema/sequence/function/trigger等)的訪問不再檢查邏輯集群權限。
- 系統中的資源池必須關聯到特定邏輯集群。
?在一個邏輯集群下可以創建多個資源池,同一個資源池不能屬于多個邏輯集群。
?由于資源池定義了資源使用量,因此關聯特定資源池的邏輯集群用戶發起的作業將受到該資源池的資源約束。
?邏輯集群下不需要創建負載組來定義并發作業的數量。因此,邏輯集群模式不再支持負載組。
- 邏輯集群刪除時只刪除表、外表,資源池對象,其他對象不會刪除。
?如果有對象依賴邏輯集群下的表(部分依賴表的sequence/function/triggers)同樣也會刪除。
?邏輯集群刪除過程會取消用戶關聯關系,刪除已有的父子租戶關系,該集群用戶將會綁定默認的installation nodegroup,關聯全局默認資源池。
- 邏輯集群用戶如果有創建數據庫權限也可創建數據庫。
復制表節點組
復制表節點組是邏輯集群模式下一種特殊的節點組,它可以包含一個或多個邏輯集群,但只能創建復制表。典型應用場景是用來創建公共維度表。如果多個邏輯集群都需要一些相同的公共維表,可以創建復制表節點組,并將這些公共維表創建在這個節點組中。復制表節點組包含的邏輯集群都可在本DN上直接訪問這些維度表,而不需訪問其他DN節點上的表。如果復制表節點組包含的邏輯集群中有任何一個發生了擴容或縮容操作,復制表節點組也會隨之擴容或縮容。如果包含的邏輯集群被刪除了,復制表節點組會隨之縮容。但如果復制表節點組只包含一個邏輯集群,這種情況下如果邏輯集群被刪除,則復制表節點組也會刪除。通常情況下用戶不應該創建這樣的復制表節點組,而是應該將表創建到邏輯集群內。
復制表節點組通過SQL語句CREATE NODE GROUP創建,通過DROP NODE GROUP語句刪除,刪除前需要將該節點組上的表對象都刪。
說明8.1.2及以上版本支持創建復制表節點組。
應用場景
場景一:將不同資源要求的數據隔離
如上圖所示,不同資源要求的數據就分開存放到不同邏輯集群中,同時不同邏輯集群之間也支持互訪,在保證資源隔離的基礎上也可以保證功能不受影響。
- T1和T2表主要用于大批量數據計算,并生成報表數據(比如銀行跑批)。這個過程由于需要大批量導入和大數據查詢,所以對節點的內存和IO資源消耗比較高,且耗時比較長,但這類查詢對實時性要求不高,因此可以將這些數據劃分到一個獨立的邏輯集群中。
- T3和T4表包含了一些計算數據和實時數據,主要用于業務點查和實時查詢,這類查詢要求實時性高,為避免其他高負載操作影響,可以將這些數據劃分到獨立的邏輯集群中。
- T5和T6表主要用于大并發OLTP類操作,數據更新非常頻繁,對IO非常敏感,為了避免大數據查詢對其影響,可以將這類表劃分到獨立的邏輯集群中。
場景二:不同業務要求的數據隔離,擴展數據集群多租戶的能力
大規模數據庫集群往往同時包含很多業務的數據,不同業務有不同的數據表,為了對不同業務進行資源隔離,可以通過創建多租戶來實現。將不同業務用戶分配給不同租戶,以便減少業務之間資源競爭。但隨著業務規模不斷擴大,集群系統中的業務數目越來越多,通過劃分多租戶來管理越來越難以控制資源競爭。由于每個表都會分布在數據庫集群的所有DN節點上,因此每次數據表操作都可能會涉及所有DN節點,這會導致網絡壓力增大和系統資源消耗,單純通過擴大集群規模也很難解決。所以可通過劃分多個邏輯集群解決業務數量擴大問題,如上圖所示。
通過劃分獨立的邏輯集群,將新增的業務分配到獨立的邏輯集群上,這樣新增業務對原有業務的影響會很小。而原有邏輯集群中的業務規模如果擴大,也可以通過對原有邏輯集群擴容來解決。
說明邏輯集群不適合將多個獨立的數據庫系統合并在一起管理,獨立的數據庫系統往往對獨立運維要求很高,需要能夠單獨管理、監控、備份和升級,同時集群之間要求故障隔離,邏輯集群無法做到獨立運維和完全的故障隔離。