2017年3月,我們終于迎來了oracle 12cr2,作為國内首批beta測試使用者,我們在2016年1月應邀進行oracle 12c sharding 技術測試,并于去年10月完成了12cr2 sharding 預研報告。由于受oracle新技術釋出限制,直至今日才釋出與各位分享。
一、oracle 12c sharding簡介
在oracle 12cr2之前的版本中, oracle分區表的所有分區都是在一套資料庫中,而sharding技術,則是使用新的分片技術可以将不同的分區部署到不同的資料庫(後面稱之為分片節點),而這些資料庫都是互相獨立且沒有地理位置的限制。oracle宣稱這種分片架構具有以下特性:
支援資料水準分片,支援資料海量擴充
支援按地理分布、内網部署、公有雲或混合雲部署方案
支援全面故障隔離
每個分片節點具有獨立的硬體資源(cpu、記憶體、硬碟等)
支援彈性擴充和自動重分布(auto rebalancing)
自動部署(auto deployment)
二、oracle 12c sharding體系結構

oracle sharding技術下的sdb架構(shared database architecture),包括:shard directors(分片路由器gsm)、shard catalog(分片目錄庫)、shardgroup(分片組)。
1. shard catalog目錄庫主要作用
存儲sdb的中繼資料
協調資料庫
分片表的中繼資料定義和複制表存儲
2. shard director分片導向器主要作用
提供從應用層到分片連接配接請求的路由導向
跨資料庫服務故障切換和管理
連接配接時負載均衡
3. oracle routing(兩種模式)
session-based routing
所有的事務都隻連接配接到一個單一的shard進行操作。
cross-shard 模式
适用于報表類的查詢
事務需要跨多個shard執行操作
4. sdb模式下oracle的連接配接請求方式分為兩種
ucp:帶shard key的連接配接請求,sdb資料庫是依據shard key來劃分shard的,當我們使用shard key進行操作的時候,連接配接池會将該連結請求發送到正确的shard庫中并建立連結。
如果沒有sharding key,sdb會将連接配接請求交給catalog庫,它會将目标sql解析并路由請求到正确的shard庫。
三、oracle 12c sharding測試環境搭建部署步驟
環境準備:測試環境使用三台虛拟機進行測試,分别為:shard0(gsm和shardcate),shard1(sh1),shard2(sh2)。
軟體要求:12.2.0.0.3及以上版本。
1. gsm軟體部署
第一步修改環境變量如下:
[oracle@shard0 ~]$ env |grep ora
oracle_base=/u01/app/oracle
oracle_home=/u01/app/oracle/product/12.2.0/gsmhome_1
第二步解壓縮gsm.zip包并且執行runinstaller腳本(這裡使用了圖形化界面)
直接點下一步(檢查作業系統是否符合安裝條件):
點next下一步:
點選install,這樣gsm包就安裝完成了。
後續的資料庫軟體安裝就不展開介紹了,選擇no-cdb選項即可。其他均與之前版本沒有任何差別。
2. shardcate庫上使用者及相關權限操作
ssh shard0
su – oracle
sqlplus / as sysdba
alter user gsmcatuser account unlock; --解鎖gsm使用者
alter user gsmcatuser identified by passwd_gsmcatuser; --修改gsm使用者密碼
create user mygdsadmin identified by passwd_mygdsadmin; --建立管理使用者mygdsadmin
grant connect, create session to mygdsadmin;--賦權限給mygdsadmin
grant gsmadmin_role to mygdsadmin;--把gsm管理者角色賦予mygdsadmin
grant inherit privileges on user sys to gsmadmin_internal;
3. shardcate上配置remote scheduler
su - oralce
set echo on
set termout on
set time on
spool /u01/stage/labs/config_remote_scheduler.lst --設定配置輸出的日志
execute dbms_xdb.sethttpport(8080);--指定scheduler所使用的端口号
commit;
@?/rdbms/admin/prvtrsch.plb
exec dbms_scheduler.set_agent_registration_pass('welcome'); --設定遠端shard節點注冊到shardcate庫所需的密碼
spool off
4. 分片庫資訊注冊
ssh shard1
schagent –stop --停止shard庫上的守護程序
schagent –start --停止shard庫上的守護程序
schagent –status –檢視shard庫上的守護程序的狀态
echo welcome |schagent -registerdatabase shard0 8080 –注冊到遠端shardcate庫分别是密碼、主機名、端口号
cd /data/oracle
mkdir oradata –建立shard庫的資料檔案存放位置
mkdir fast_recovery_area --建立shard庫的快速恢複區的位置
ssh shard2
schagent -stop
schagent -start
schagent -status
echo welcome |schagent -registerdatabase shard0 8080
mkdir oradata
mkdir fast_recovery_area
5. 配置gsm
su – oracle --oracle使用者
gdsctl --進入gsm互動界面
create shardcatalog -database shard0:1521:orcl -chunks 12 -user mygdsadmin/passwd_mygdsadmin -sdb cust_sdb -region region1
--建立shardcatalog庫 –database ip(主機名):監聽端口号:執行個體名 –chunks chunk的數量
-user 使用者/密碼 –sdb sdb名 –region 主端,備端
add gsm -gsm sharddirector1 -listener 1571 -pwd passwd_gsmcatuser -catalog shard0:1521:orcl –region -trace_level 16
--添加gsm –gsm gsm名 –listener 監聽端口号 –pwd gsmcatuser使用者密碼 –catalog catalog庫基本資訊 ip(主機名):監聽端口号:執行個體名 –region 指定是哪個region –trace_level 指定trace的級别位置log_destination參數控制
start gsm -gsm sharddirector1 –啟動gsm
set _event 17
modify catalog -agent_password welcome –修改 catalog庫守護程序密碼為welcome
add credential -credential oracle_cred -osaccount oracle -ospassword oracle -- specify the operating system user that the extproc agent impersonates when running a subprogram stored in the library
gdsctl –進入gsm指令互動模式
set gsm -gsm sharddirector1 –設定目前分片目錄為sharddirector1
connect mygdsadmin/passwd_mygdsadmin –建立連接配接
add shardgroup -shardgroup shgrp1 -deploy_as primary -region region1 –添加主分片組
add invitednode shard1
create shard -shardgroup shgrp1 -destination shard1 -credential oracle_cred –-不同的shard庫添加到不同的分片組裡
add invitednode shard2
create shard -shardgroup shgrp2 -destination shard2 -credential oracle_cred –-不同的shard庫添加到不同的分片組裡
deploy 一鍵部署。
此時一套測試的sdb搭建成功,由于環境有限這裡沒有做容災,oracle提供了ogg和adg兩種方式對shard節點做容災并且也支援一鍵部署。
四、sharding适用場景限制
根據oracle官方對sharding的應用場景介紹描述,oracle分片技術主要适用以下場景:
面向 oltp 應用場景
為了優化性能應用程式應該使用分片鍵
業務場景中 80% 的事務都基于單個分片操作
跨分片操作目前版本支援并不完善
對于已知的分片技術使用場景限制,結合浙江移動的業務特點,最後選擇客戶中心做為本次的測試模型,由于存儲資源有限我們選擇了資料量相對較小的湖州地市作為測試地市。
五、sharding測試模型和測試結果
客戶中心業務簡介:
1. 客戶中心儲存的資料來源于原crm系統中的三戶資訊和使用者訂購資訊,承載的是客戶管理業務;
2. 三戶資訊的核心是使用者資訊表,其中使用者資訊表的業務入口是bbb_id,在擷取bbb_id和uuu_id的對應關系後,後續都是以uuu_id為主,查詢到相應的uuu_id對應的ccc_id/aaa_id的資訊,再根據ccc_id和aaa_id的值去查詢對應的客戶和帳戶資訊,而使用者的訂購資訊都是根據uuu_id來查詢的;
3. 對所有前台或使用者發起的針對單使用者的業務中,基本能保證這些業務都是在同一個分片内操作;
4. 使用者資訊會随着系統承載的使用者量的增加有所增長,但這種增長的速度不是海量的擴充速度。
測試結果:所有的業務操作大緻可以分為以下這三類:
單分片查詢
duplicate表查詢
跨分片查詢
針對基于單分片的分片表查詢,相比于傳統的資料庫查詢速度提升不明顯,因為uuu_id列本身加了索引查詢速度已經夠快了。但是當時資料庫的壓力提升以後,多個分片節點的sdb帶來的優勢預計會有一定的展現,因為所有的資料庫操作被均勻地負載到多台實體主機上面,由于硬體限制我們沒有做性能測試,對于duplicate表的查詢本身設計就是從catalog庫上通過物化視圖到各個shard庫裡,是以對查詢的速度提升沒有實質的提升作用。
最後的跨分片查詢我們在測試過程中發現oracle不支援where條件用in或者or,我們大部分的應用都會用到這種條件的查詢,是以跨分片的查詢目前版本支援并不完善。
六、sharding測試過程中的問題解決
1. 環境部署
軟體的版本需要12.2.0.0.3及以上的版本
在配置gsm的時候報錯資訊不會很直覺的展示出來,這對于安裝部署有很大阻礙。
2. 資料導入
duplicate表的資料導入是從catalog庫導入,分片表的導入可以從各個shard庫導入進去(由于環境有限暫時12.2.0.0.3從catalog庫導入還未來得及測試)。
12.2.0.0.3版本以前分片表直接從catalog庫導入會報ora-600錯誤,而且這些錯誤也沒有相應的psu修複。
通過dblink用create table as select的方式建立會報不支援的操作類型的錯誤。
3. 業務測試
跨分片查詢在 12.2.0.0.3版本支援并不完善,例如用in或者or 的查詢oracle會直接報錯。我們已将改進建議提給oracle,可能會在正式釋出版本中得到解決。
所有的連接配接都經過catalog庫,當連接配接請求并發上去後catalog将成為瓶頸,需建立多個catalog庫分擔壓力。
同一schema下的各個分片表必須要有主外鍵關系。
原文釋出時間為:2017-03-06
本文來自雲栖社群合作夥伴dbaplus