張大朋(Lunar)Oracle 工程師
Lunar 擁有超過十年的 ORACLE SUPPORT 從業(yè)經(jīng)驗(yàn),,曾經(jīng)服務(wù)于ORACLE ACS部門,現(xiàn)就職于 ORACLE Sales Consultant 部門,,負(fù)責(zé)的產(chǎn)品主要是 Exadata,,Golden Gate,Database 等。
編輯說明:感謝Lunar授權(quán)我們轉(zhuǎn)載其原創(chuàng)文章,,文章插入了一些我們以前分享的圖片,,作為配合解讀。 2015年8月份內(nèi)部release了Oracle 12.2 Beta版本(目前內(nèi)部最新release的版本是2016年2月份發(fā)布的,,windows和Linux都有了),,目前根據(jù)12.2beta文檔的介紹,Oracle推出了sharding的功能,,跟其他NOSQL型的sharding結(jié)構(gòu)相比,,Oracle Sharding提供的是企業(yè)級(jí)的RDBMS的分片技術(shù)。 Oracle Sharding的優(yōu)點(diǎn): ? Relational schemas ? Database partitioning ? ACID properties and read consistency ? SQL and other programmatic interfaces ? Complex data types ? Online schema changes ? Multi-core scalability ? Advanced security ? Compression ? High Availability features ? Enterprise-scale backup and recovery
在Oracle RDBMS 12.2.0.1中最多支持1000個(gè)shards,。
Oracle Sharding使用GDS(Global Data Services)架構(gòu)來自動(dòng)部署和管理sharding和復(fù)制技術(shù),。GDS(GDS是Oracle RDBMS 12.1的新特性)也提供負(fù)載均衡和SDB(sharded database)中的基于位置的路由功能。
Shard目錄(Shard directors)使用GDS framework的全局服務(wù)管理組件(global service manager component)來提供應(yīng)用層請(qǐng)求到shard的直接路由,。shard目錄(Shard directors)是一個(gè)單獨(dú)的數(shù)據(jù)庫,,它用來保存SDB(Sharding database)配置數(shù)據(jù)和提供其他相關(guān)功能,比如shard的交叉查詢和集中管理,??梢允褂肎DS是GDSCTL工具可以用來配置SDB。
Oracle Sharding的分區(qū)架構(gòu)(Partitioning Infrastructure) 分區(qū)在表空間級(jí)別跨Shards分布,,每個(gè)表空間關(guān)聯(lián)一個(gè)特定的shard,。一個(gè)shard表的每一個(gè)分區(qū)放單獨(dú)的表空間,,并且每個(gè)表空間關(guān)聯(lián)到一個(gè)特定的shard,。根據(jù)不同的sharding方法,這個(gè)關(guān)聯(lián)可以自動(dòng)建立或者根據(jù)定義創(chuàng)建,。盡管一個(gè)shard表的多個(gè)分區(qū)放在多個(gè)單獨(dú)主機(jī)的數(shù)據(jù)庫上(這些數(shù)據(jù)庫完全獨(dú)立,,不共享CPU、內(nèi)存等軟件和硬件),,但是應(yīng)用訪問表時(shí)就如同訪問一個(gè)單獨(dú)數(shù)據(jù)庫中的分區(qū)表一樣,。應(yīng)用發(fā)出的SQL語句不需要依賴shard號(hào)和shard的物理配置。
Oracle Sharding 使用 familiar SQL 語法創(chuàng)建表分區(qū),,指定分區(qū)表的每行數(shù)據(jù)如何分片,。 一個(gè)shard表的分區(qū)鍵叫做sharding key,例如,,下面的語法是典型的用來創(chuàng)建sharding表的: CREATE SHARDED TABLE customers ( cust_id NUMBER NOT NULL , name VARCHAR2(50) , address VARCHAR2(250) , region VARCHAR2(20) , class VARCHAR2(3) , signup DATE CONSTRAINT cust_pk PRIMARY KEY(cust_id) ) PARTITION BY CONSISTENT HASH (cust_id) TABLESPACE SET ts1 PARTITIONS AUTO; 這個(gè)數(shù)據(jù)分片(shard)就是基于鍵值cust_id,,分區(qū)采用“CONSISTENT HASH”,這是一個(gè)特定的hash分區(qū)類型,,通常用在分布式系統(tǒng)上,。 . Sharding a Table Family 一個(gè)表家族(Table Family)中沒有任何父表的表叫做根表(root table),每個(gè)表家族中只能有一個(gè)根表。 表家族中所有的表按照根表的主鍵進(jìn)行sharding,,根據(jù)各級(jí)表的結(jié)構(gòu),,相關(guān)數(shù)據(jù)可以被存儲(chǔ)在同一個(gè)shard上。 在12.2,,在一個(gè)SDB中只支持一個(gè)表家族,。 . 以下面的例子說明,這里一共3張表組成的表家族(Table Family):客戶表,,訂單表和訂單明細(xì)表,。 每個(gè)客戶可以有多個(gè)訂單,每個(gè)訂單中可以有多個(gè)商品,,因此訂單明細(xì)中就記錄了每個(gè)訂單中的多個(gè)商品,,他們的具體數(shù)據(jù)如下:
在這個(gè)表族中,,客戶編號(hào)為123的數(shù)據(jù)如下:
將一個(gè)表族(Sharded Table Family)分片通常使有下面兩種方法創(chuàng)建: 方法1:不顯示指定父子關(guān)系,,而是通過表之間主外鍵關(guān)系創(chuàng)建表族,。
這種方式創(chuàng)建的表族是一個(gè)多級(jí)的樹形結(jié)構(gòu),。 根表(root table)是客戶表: –客戶表的主鍵是CustNo,,分區(qū)方式是“CONSISTENT HASH (CustNo)” –保存再表空間集ts1中 CREATE SHARDED TABLE Customers
( CustNo NUMBER NOT NULL
, Name VARCHAR2(50)
, Address VARCHAR2(250)
, CONSTRAINT RootPK PRIMARY KEY(CustNo)
)
PARTITION BY CONSISTENT HASH (CustNo)
PARTITIONS AUTO
TABLESPACE SET ts1
;
|
–訂單表是客戶表的字表,子表(訂單表)根據(jù)CustNo關(guān)聯(lián)父表(客戶表): –訂單表的主鍵是(CustNo, OrderNo),,外鍵(CustNo)引用了主表Customers(CustNo) –分區(qū)方式是按照訂單表的外鍵約束(CustFK) CREATE SHARDED TABLE Orders
( OrderNo NUMBER NOT NULL
, CustNo NUMBER NOT NULL
, OrderDate DATE
, CONSTRAINT OrderPK PRIMARY KEY (CustNo, OrderNo)
, CONSTRAINT CustFK FOREIGN KEY (CustNo) REFERENCES Customers(CustNo)
)
PARTITION BY REFERENCE (CustFK)
;
|
–訂單明細(xì)表是訂單表的字表,,子表(訂單明細(xì)表)根據(jù)CustNo關(guān)聯(lián)父表(訂單表) –訂單明細(xì)表的主鍵是(CustNo, OrderNo, LineNo),,外鍵(CustNo, OrderNo)引用了父表Orders(OrderNo)和Orders(CustNo, OrderNo) –分區(qū)方式是按照訂單明細(xì)表的外鍵約束(LineFK) CREATE SHARDED TABLE LineItems
( CustNo NUMBER NOT NULL
, LineNo NUMBER(2) NOT NULL
, OrderNo NUMBER(5) NOT NULL
, StockNo NUMBER(4)
, Quantity NUMBER(2)
, CONSTRAINT LinePK PRIMARY KEY (CustNo, OrderNo, LineNo)
, CONSTRAINT LineFK FOREIGN KEY (CustNo, OrderNo) REFERENCES Orders(OrderNo)
REFERENCES Orders(CustNo, OrderNo)
)
PARTITION BY REFERENCE (LineFK)
;
|
因此,上面的例子中,,這個(gè)表家族的所有數(shù)據(jù)都保存在同一個(gè)表空間集ts1中,。 當(dāng)根表中增加一個(gè)分區(qū)的時(shí)候,那么相關(guān)聯(lián)的表中都會(huì)自動(dòng)增加相應(yīng)的分區(qū),。 . 方法2:在分區(qū)表中顯示指定父子關(guān)系的方法創(chuàng)建表家族 這種分區(qū)方法只支持兩級(jí)的表家族(two-level table families),,所有的子表必須有相同的父表,父表的分區(qū)列在每個(gè)子表中都存在,例如下面的CustNo. . –沒有關(guān)鍵字“PARENT”(也沒有上面引用約束關(guān)鍵字)的是根表,,即客戶表(Customers) CREATE SHARDED TABLE Customers
( CustNo NUMBER NOT NULL
, Name VARCHAR2(50)
, Address VARCHAR2(250)
, region VARCHAR2(20)
, class VARCHAR2(3)
, signup DATE
)
PARTITION BY CONSISTENT HASH (CustNo)
TABLESPACE SET ts1
PARTITIONS AUTO
;
|
–根據(jù)關(guān)鍵字“PARENT Customers”指定了訂單表(Orders)的父表是客戶表(Customers) CREATE SHARDED TABLE Orders
( OrderNo NUMBER
, CustNo NUMBER
, OrderDate DATE
)
PARENT Customers
PARTITION BY CONSISTENT HASH (CustNo)
TABLESPACE SET ts1
PARTITIONS AUTO
;
|
–根據(jù)關(guān)鍵字“PARENT Customers”指定了訂單明細(xì)表(LineItems)的父表是客戶表(Customers) CREATE SHARDED TABLE LineItems
( LineNo NUMBER
, OrderNo NUMBER
, CustNo NUMBER
, StockNo NUMBER
, Quantity NUMBER
)
)
PARENT Customers
PARTITION BY CONSISTENT HASH (CustNo)
TABLESPACE SET ts1
PARTITIONS AUTO
;
|
Creating a Duplicated Table Using CREATE TABLE 復(fù)制表可以被復(fù)制到所有的shard上,,這種在每個(gè)shard上有相同內(nèi)容的表叫做復(fù)制表(Duplicated Table),需要經(jīng)常跟shard表關(guān)聯(lián)的小表適合于作為復(fù)制表(Duplicated Table),,適用于: (1)只讀表 (2)大量跨shard的讀操作
Oracle Sharding使用Materialized View Replication來同步復(fù)制表(duplicated tables)的內(nèi)容,,每個(gè)shard上的duplicated tables的內(nèi)容是一個(gè)只讀物化視圖(read-only materialized view)。 物化視圖(materialized views)的主表保存在一個(gè)專門的數(shù)據(jù)庫中,,叫做Shard Catalog,。 所有shard上的物化視圖(materialized views)會(huì)根據(jù)配置的頻率自動(dòng)刷新。 創(chuàng)建復(fù)制表的語句“CREATE DUPLICATED TABLE”會(huì)自動(dòng)創(chuàng)建master表,,物化視圖和其他物化視圖復(fù)制所需要的對(duì)象,。 還是以上面的客戶訂單關(guān)系為例,這里定義產(chǎn)品表(Products)為復(fù)制表:
CREATE DUPLICATED TABLE Products
( StockNo NUMBER PRIMARY KEY
, Description VARCHAR2(20)
, Price NUMBER(6,2))
)
;
|
根據(jù)sharding的機(jī)制,,sharding的設(shè)計(jì)對(duì)后續(xù)系統(tǒng)性能影響是非常大的,。一旦sharding創(chuàng)建完成,并已經(jīng)有很多數(shù)據(jù),,相關(guān)的屬性就不能再修改了,,比如某個(gè)表是復(fù)制表,,還是sharding表,sharding key等等,,因此,,SDB的設(shè)計(jì)是至關(guān)重要的,在設(shè)計(jì)sharding時(shí)需要考慮的有: 哪些表需要被設(shè)計(jì)為sharding表,; 哪些表需要做復(fù)制表,; 哪些shard表是根表; 使用什么方法來關(guān)聯(lián)一個(gè)表到其他表或者根表,; 應(yīng)該使用哪種sharding方法,; 使用哪個(gè)作為sharding key;
|