從原理到實踐:Oracle 12.2 Sharding技術揭祕
何劍敏 Oracle ACS華南區售後團隊,首席技術工程師
曾供職於中國聯通訊息計費部、卓望數碼,系統支撐部首席DBA,負責中國移動全網夢網業務和移動應用商城資料庫維護。後供職於IBM,負責米其林專案和澳洲電信(Telstra)專案資料庫管理。現供職於Oracle ACS華南區售後團隊,首席技術工程師。多年從事第一線的資料庫運維工作,有豐富專案經驗、維護經驗和調優經驗,專注於資料庫的整體運維。
1
Oracle 12.2的重磅特性及釋出時間
2016年2月,Oracle出了12.2的beta2版本,並且在4月更新了相關文件,如Concepts,Administrator’s Guide,Global Data Services Concepts and Administration Guide等等。這個版本的文件,比之前2015年10月底文件要好很多,許多概念,演示demo,操作步驟都得到了很好的說明。據信Oracle 12.2將於6.1正式釋出。在12.2中Sharding特性受到了廣泛的關注,本文著重講述這一特性的使用和構建。
2
三言兩語說透Oracle的Sharding技術
愛因斯坦說過,如果你不能用簡單的語言解釋某個東西,你就不是真正的理解這個東西。通過這幾天的實驗和學習,我儘量用簡單的語言來給大家描述下什麼是Oracle的sharding。
Sharding,中文名叫資料分片,是對資料進行橫向擴充套件的一種方式。資料量增加,我可以通過加一臺機器,來擴充套件其容納能力和處理能力。
Sharding其實需要解決三個問題:一、資料的路由,二、資料的分片,三、分片的元資料資訊儲存。
1.資料路由是資料庫告訴應用程式,你讓我查的資料目前在哪個分片上,這條路怎麼走過去。
2.資料分片就是實際資料的存放地點,往往每個分片就是一臺單獨的伺服器(含儲存)。
3.由於分片的資料實際是被切割放在不同的機器上,那麼需要有個集中的地點存放資料分片的資訊,即分片元資料的資訊。
應用問路由怎麼走,路由去查詢元資料得知需要的資料在哪個分片上,最終應用訪問到該分片上。
最著名的sharding database就是mongoDB了。mongoDB的sharding功能的架構也是為了解決上面的三個問題,MongoDB有路由伺服器(Router)解決路由問題,分片伺服器(Shard)儲存實際資料(可能還有副本和仲裁),以及配置伺服器(Config Server)存放分片元資料。
》》延伸閱讀:資料庫高可用和分割槽解決方案-MongoDB 篇
那麼,對應在Oracle12.2的 Sharding DB 上,就是GDS框架(GSM,shard directors),shard node,和shardcat資料庫。
所以,到這裡你就可以比較清楚的瞭解了oracle 12.2的sharding功能其實就是3個模組。順便說一下,MonogoDB支援多個副本和仲裁,oracle的adg也同樣支援一主多備,由FSFO進行管理。
》》關注Oracle公眾號回覆"Shard"可以獲得: Oracle 12.2 Sharded Database Management.pdf
3
小荷談Sharding體驗
下面,再談一下我個人對sharding架構的一些看法。
- Shardcat是非常重要的一個模組,上面不僅僅有分片的元資料資訊,還有duplicated table的master table資訊,另外,當進行cross shard query的時候,他還起著coordinator database的作用。所以建議對這個部分搭建RAC+adg架構,避免shardcat的單點故障。
- shard node,單個shard node的失效,將導致整個表的不可用。所以我們也要對shard node建立高可用的副本,這裡可以用ADG或者OGG的技術。
- 既然做sharding,又要在做HA,那麼就變成了堆機器,堆儲存的方式了。我們假設在一個10個shard node的環境,需要多少臺機器:一個shardcate,做rac+adg,那麼最少就是3臺;10個shard node,如果都有adg,那麼最少就是20臺。那麼當前這個環境,就至少要23臺機器了。
- Sharding架構極其考驗對應用的熟悉程度,需要配合應用進行合理的分割槽和分片。另外,如sharding key必須建索引,sharding的方式可以有一致性hash,讓資料均勻分佈,也還是可以是range或者list分割槽,或者hash-range,hash-list的子分割槽。分片和分割槽方式需要結合業務,有些場景需要相關資料都在一個分割槽,避免cross shard join,有些場景需要均勻分片,禁止集中分片,導致熱塊資料都在一個分片上(如序列增長,做range分割槽,熱點資料將會都在一個分片上)。
- 事實表和維度表,似乎可以很好的利用sharding功能。維度表做duplicated table,而事實表做sharded table。
4
從安裝部署到體驗
(一)安裝介質:
1. 你需要12.2的database的安裝介質(兩個zip壓縮包)來安裝db軟體,用於shardcat資料庫,和shard node主機上的資料庫。 2. 你還需要12.2的gsm安裝介質(一個壓縮包)來安裝GDS框架和gsm服務。這是安裝在shardcat主機上的。 3. 你還需要12.2.的client安裝介質(一個壓縮包)來裝scheagent,這是安裝在shard node主機上的。安裝schagent是為了在shardcat主機上發起命令,在遠端的shard node上,通過agent調起來netca和dbca來安裝監聽和資料庫。另外,如果shard node有active dataguard,agent也會自動幫你配好dataguard,配好broker和FSFO。
(二)HIGH LEVEL安裝步驟:
1.Oracle Sharding Prerequisites 2.Setting Up the Oracle Sharding Host Environment Scripts 3.Installing Oracle Database 4.Installing the Shard Director Software 5.Creating the Shard Catalog Database 6.Setting Up the Oracle Sharding Management and Routing Tier 7.Deploying and Managing a System-Managed SDB
(三)詳細安裝步驟:
1.Oracle Sharding Prerequisites
12.2企業版 non-cdb 使用檔案系統而非ASM (12.2 Beta要求,正式發行後,可能會改) 主機hosts檔案寫上本機和各個shard node的IP解析 機器必須全新,不能殘留之前有安裝過oracle的資訊。
2.Setting Up the Oracle Sharding Host Environment Scripts
目的是因為shardcat和gds都安裝在一個主機上,同一個oracle使用者,不同ORACLE_HOME,所以建立環境變數的指令碼,會比較容易在database環境和gsm環境之間切換。 admin guide上是用shardcat.sh,shard-director1.sh指令碼,但是我的可能更簡單實用,直接定義成alias。(這種方法其實是跟ORACLE BASE學的。老DBA應該都聽說過這個網站。) ##修改環境變數,在環境變數中設定2個alias別名
3.Installing Oracle Database
安裝db軟體,解開2個壓縮包,載入一下上面建好的db_env環境變數,開始跑runInstaller,選擇software only,沒啥好說的。注意ORACLE_HOME的路徑和環境變數中定義的DB的ORACLE_HOME一致。 在shardcat主機和shard node主機,都需要安裝好db軟體。
4.Installing the Shard Director Software
安裝gds框架和gsm服務,解開gsm的壓縮包,載入一下上面建好的gsm_env環境變數開始跑runInstaller,注意選擇不同與DB的ORACLE_HOME,注意ORACLE_HOME的路徑和環境變數中定義的gsm的ORACLE_HOME一致。 本文中gds安裝在和shardcat同一個主機上。即shardcat和shard Director在同一主機。(其實,如果有需要,也可以不同主機的)
4.b. Installer schagent in all shard node(admin guide文件沒寫這步驟,本人免費贈送)
選擇client安裝包,解壓縮後,執行runInstaller,在每個shard node上建立agent
5.Creating the Shard Catalog Database
執行dbca開始建立資料庫例項,這個例項是放分片資料的元資料的。我們把這個例項名叫shardcat。 安裝好後,再建立listener。以便可以連線這個資料庫。
6.Setting Up the Oracle Sharding Management and Routing Tier
7.Deploying and Managing a System-Managed SDB 我們開始部署,以最簡單的System-Managed SDB為例。 另外,admin guide中介紹的是4臺主機做shard node,其中每2臺互為dataguard主備。我們這邊為了節約空間和資源,不搞dataguard了,只建立primary庫。因此只要2臺主機做shard node。
此時,就開始部署shard了。在shard node上的agent會自動的呼叫netca和dbca,建立listener和database,2個shard node的操作是並行進行的。(如果是有datauard,那麼是先建立一對主備,再建立另一對主備。)你可以在分別是兩個shard node上ps -ef|grep ora_ 看到已經有sh1和sh2的例項了。
等deploy完,我們可以檢查一下shard的情況了:
建立service:
(四)建立應用使用者,利用應用使用者建立sharded table和duplicated table:
利用應用使用者登入,建立sharded table和duplicated table
至此,一個Oracle Sharding Database環境就搭建完畢了。歡迎大家體驗這一新技術帶來的資料庫擴充套件性。原文連結指向原作者網站地址。