657
技術社區[雲棲]
從原理到實踐:Oracle 12.2 Sharding技術揭秘
何劍敏 Oracle ACS華南區售後團隊,首席技術工程師
曾供職於中國聯通信息計費部、卓望數碼,係統支撐部首席DBA,負責中國移動全網夢網業務和移動應用商城數據庫維護。後供職於IBM,負責米其林項目和澳洲電信(Telstra)項目數據庫管理。現供職於Oracle ACS華南區售後團隊,首席技術工程師。多年從事第一線的數據庫運維工作,有豐富項目經驗、維護經驗和調優經驗,專注於數據庫的整體運維。
編輯說明:感謝何劍敏撰寫了關於Sharding的相關文章,並授權我們分享給大家。根據我們的理解對他的文章順序做了調整整合,以便於大家理解閱讀。
1Oracle 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
下麵,再談一下我個人對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。
(一)安裝介質:
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環境就搭建完畢了。歡迎大家體驗這一新技術帶來的數據庫擴展性。原文鏈接指向原作者網站地址。
最後更新:2017-07-18 11:03:47
上一篇:
阿裏技術大神:你沒做錯啥,你錯在啥都沒做
下一篇:
三月回頭不遠,一年流逝難追-2017 Q1 精華文章推薦
Android使用線程池實現圖片異步加載
矽穀的見證人:惠普公司(HP)
'System.Data.DataRow.DataRow(System.Data.DataRowBuilder)' is inaccessible due to its protection leve
java反射3——類實例的方法2
《Spring MVC學習指南(第2版)》——1.3 小結
【雲周刊】第130期:重磅!阿裏研究院發布新網商五大預測,2020年誕生第一個機器人網商?
SQL語句中的case when語法以及Oracle中的類似方法
利用JSON-schema校驗請求報文,封裝轉換錯誤信息,提示前台
Elasticsearch 漫談
兼談德國的教育體係