Using Oracle Data Guard with a Sharded Database

一、概念和體系結構

Sharding是一種水平數據分片的架構。每一個數據庫都有單獨的本地資源(CPU、內存、硬盤)。這樣的配置中,每一個數據庫被稱做分片shard。全部的分片合併在一塊兒湊成一個邏輯數據庫,這個邏輯的數據庫被稱做分片數據庫(SDB)。水平分片將一張數據庫中的表拆分紅多個分片,每一個分片有相同的列,可是具備不一樣的行。所以這樣的表也被稱做(sharded table)。html

另外它也是一種shared-nothing的架構,消除了單點故障(由於分片它不共享物理資源,如cpu、內存或存儲設備),在軟件方面也是鬆耦合的,因此它不須要運行集羣軟件。node

從DBA的角度來看,SDB由多個分片組成。這些分片能夠集體管理,也能夠單獨進行管理,然而從應用程序使用的角度上來看,SDB就是一個數據庫,分片的數量和數據在那個分片上對數據庫應用程序來講都是徹底透明的。數據庫

分片適用於OLTP應用程序,使用分片的應用程序必須具備良好的數據模型和數據分片的結構。例如(一致的hash、範圍、列表或者是這些組合),主要使用分片切分的鍵值來訪問數據。例如咱們可使用的分片鍵能夠是customer_id、Account_no或Country_id等等。安全

sharding主要的優勢:網絡

  • 線性擴展--Sharding消除了性能瓶頸,經過添加分片使得性能和容量可以線性縮放。
  • 失敗隔離--分片是一種shared nothing的基礎架構,它消除了單點故障。例如共享磁盤、SAN網絡和集羣軟件。它提供了很強的故障隔離機制,一個分片的出現了故障不會影響其餘分片的可用性和性能。
  • 數據地理分佈--當數據必須位於特定的管轄區域時,分片能夠將特定數據存儲在靠近其消費者的位置並知足法規要求。
  • 滾動式更新--在一個分片上應用配置更改不會影響其餘分片,而且容許管理員首先測試一小部分數據的更改。
  • 簡化雲部署--分片很是適合在雲上部署。

與其餘NoSQL數據庫不一樣,Oracle分片提供了分片的好處,而不犧牲企業級RDBMS的功能。它支持:session

  • 關係模式
  • 數據庫分區表
  • 關係型數據庫的ACID四個基本要素,原子性(Atomicity)、一致性(Consistency)、隔離性(Isolation)、持久性(Durability)。
  • SQL和其餘變成接口
  • 複雜的數據類型
  • 在線模式更改
  • 多核可擴展性
  • 高級安全性
  • 壓縮
  • 高可用性
  • 企業級備份和恢復

Oracle Sharding的體系結構 以下圖所示:
Using Oracle Data Guard with a Sharded Database
Oracle Sharding 主要包括下面組件:架構

  • Sharded database (SDB) :一個單獨的邏輯的Oracle數據庫,可是在物理上SDB包括多個物理獨立的數據庫,SDB相似一個數據庫池(pool),數據庫池 (pool)中包括多個數據庫 (Shard)。
  • Shards:一個shards就是一個獨立的分片,他們合在一塊兒就組成了SDB。
  • Global service : 數據庫的服務提供訪問SDB中的數據。
  • Shard catalog :是一個Oracle數據庫,它提供自動分片部署、分片數據庫的集中管理、多分片查詢等功能。例如應用查詢多個shards的數據,那麼會由Shared Catalog來統一進行協調分配。全部配置的更改,例如添加和刪除分片,還有global services都在上面執行。還有SDB上全部的DDL操做都須要鏈接到Shard catalog來執行。Oracle官方推薦使用Data Guard技術來實現shard catalog的高可用。假設Shard catalog出現了問題,此時配置了 DG就只會影響在出問題到切換成功的短期內,執行的維護操做或是對多個Shards的查詢。OLTP事務繼續路由到指定的sdb執行,並不會受到中斷的影響。
  • Shard directors:使用了全局服務管理組件GMS(global service manager component),經過sharding key,網絡監聽器,使應用層請求到shard的直接路由。
  • Connection pools:這裏主要是中間件範疇,應用程序使用Oracle integrated connection pools(UCP、OCI、ODP.NET、JDBC)鏈接到分片數據庫。
  • Management interfaces:經過使用GDSCTL (command-line utility) 接口和OEM(Oracle Enterprise Manager)來管理sharding。

二、環境介紹

各個節點的角色以及數據庫版本以下表所示:
Using Oracle Data Guard with a Sharded Database
其中實例名是系統本身命名的。本文旨在介紹如何部署一個帶有adg功能的sharded database。oracle

三、建立Shard Catalog Database

這裏使用靜默方式在odb01上建立目錄數據庫。app

[oracle@odb01 ~]$ vi /tmp/dbca.rsp
responseFileVersion=/oracle/assistants/rspfmt_dbca_response_schema_v12.2.0
gdbName=shcdb
sid=shcdb
databaseConfigType=SI
RACOneNodeServiceName=
policyManaged=false
createServerPool=false
force=false
createAsContainerDatabase=false
useLocalUndoForPDBs=true
templateName=/u01/app/oracle/product/19.3.0/db_1/assistants/dbca/templates/General_Purpose.dbc
sysPassword=abcABC12
systemPassword=abcABC12
serviceUserPassword=abcABC12
emConfiguration=DBEXPRESS
emExpressPort=5500
runCVUChecks=FALSE
dbsnmpPassword=abcABC12
dvConfiguration=false
olsConfiguration=false
datafileJarLocation={ORACLE_HOME}/assistants/dbca/templates/
datafileDestination={ORACLE_BASE}/oradata/{DB_UNIQUE_NAME}/
recoveryAreaDestination={ORACLE_BASE}/fast_recovery_area/{DB_UNIQUE_NAME}
storageType=FS
characterSet=ZHS16GBK
nationalCharacterSet=AL16UTF16
registerWithDirService=false
variables=ORACLE_BASE_HOME=/u01/app/oracle/product/19.3.0/db_1,DB_UNIQUE_NAME=shcdb,ORACLE_BASE=/u01/app/oracle,PDB_NAME=,DB_NAME=shcdb,ORACLE_HOME=/u01/app/oracle/product/19.3.0/db_1,SID=shcdb
initParams=sga_target=3GB,nls_language=AMERICAN,remote_login_passwordfile=EXCLUSIVE,db_create_file_dest={ORACLE_BASE}/oradata/{DB_UNIQUE_NAME}/,audit_file_dest={ORACLE_BASE}/admin/{DB_UNIQUE_NAME}/adump,processes=1000,pga_aggregate_target=1GB,nls_territory=AMERICA,db_recovery_file_dest_size=30GB,open_cursors=300,db_name=shcdb,db_recovery_file_dest={ORACLE_BASE}/fast_recovery_area/{DB_UNIQUE_NAME},audit_trail=NONE
sampleSchema=false
memoryPercentage=65
databaseType=MULTIPURPOSE
automaticMemoryManagement=false
totalMemory=0
[oracle@odb01 ~]$ dbca -silent -ignorePreReqs -createDatabase -responseFile /tmp/dbca.rsp -enableArchive true -redoLogFileSize 1024

待數據庫建立完成後,執行下面的SQL,完成後重啓數據庫實例。ide

alter system set open_links=16 scope=spfile;
alter system set open_links_per_instance=16 scope=spfile;
alter user gsmcatuser account unlock;
alter user gsmcatuser identified by oracle;                
create user gdsadmin identified by oracle;
GRANT connect, create session, gsmadmin_role to gdsadmin;
grant inherit privileges on user SYS to GSMADMIN_INTERNAL; 
execute dbms_xdb.sethttpport(8080);
commit;
@?/rdbms/admin/prvtrsch.plb
exec DBMS_SCHEDULER.SET_AGENT_REGISTRATION_PASS('oracle');
SQL> shutdown immediate
SQL> startup

四、安裝並配置GSM

GSM的安裝很簡單,這裏使用靜默方式安裝,靜默文件內容以下:

[oracle@odb01 ~]$ vi /tmp/gsm.rsp 
oracle.install.responseFileVersion=/oracle/install/rspfmt_gsminstall_response_schema_v19.0.0
UNIX_GROUP_NAME=oinstall
INVENTORY_LOCATION=/u01/app/oraInventory
ORACLE_HOME=/u01/app/oracle/product/19.3.0/gsm
ORACLE_BASE=/u01/app/oracle
[oracle@odb01 ~]$ /u02/tmp/gsm/runInstaller -silent -ignorePrereq -responseFile /tmp/gsm.rsp
  • 建立shard catalog
[oracle@odb01 ~]$ gdsctl 
GDSCTL: Version 19.0.0.0.0 - Production on Mon Jul 15 11:09:20 CST 2019

Copyright (c) 2011, 2019, Oracle.  All rights reserved.

Welcome to GDSCTL, type "help" for information.

Warning:  GSM  is not set automatically because gsm.ora does not contain GSM entries. Use "set  gsm" command to set GSM for the session.
Current GSM is set to GSMORA
GDSCTL> create shardcatalog -database odb01:1521:shcdb -chunks 12 -user gdsadmin/oracle -sdb shcdb -region region1,region2
GDSCTL> add gsm -gsm sharddirector1 -listener 1531 -pwd oracle -catalog odb01:1521:shcdb -region region1
GDSCTL> add gsm -gsm sharddirector2 -listener 1531 -pwd oracle -catalog odb01:1521:shcdb -region region2
GDSCTL> start gsm -gsm sharddirector1
  • 添加操做系統憑證

    GDSCTL> add credential -credential cre_reg1 -osaccount oracle -ospassword oracle
  • shard node上啓動代理並向shard catalog註冊
[oracle@odb05 ~]$ schagent -start;echo oracle|schagent -registerdatabase odb01 8080
[oracle@odb06 ~]$ schagent -start;echo oracle|schagent -registerdatabase odb01 8080
[oracle@odb07 ~]$ schagent -start;echo oracle|schagent -registerdatabase odb01 8080
[oracle@odb08 ~]$ schagent -start;echo oracle|schagent -registerdatabase odb01 8080
  • shard node上建立數據庫文件目錄
    此路徑要和shard catalog database的路徑保持一致。
    [oracle@odb05 ~]$ mkdir /u01/app/oracle/{oradata,fast_recovery_area}
    [oracle@odb06 ~]$ mkdir /u01/app/oracle/{oradata,fast_recovery_area}
    [oracle@odb07 ~]$ mkdir /u01/app/oracle/{oradata,fast_recovery_area}
    [oracle@odb08 ~]$ mkdir /u01/app/oracle/{oradata,fast_recovery_area}

五、部署System-Managed Sharded Database

這裏分別建立primary group和standby group。

  • 建立shardgroup
    GDSCTL> add shardgroup -shardgroup primary_sgp -region region1 -deploy_as primary
    GDSCTL> add shardgroup -shardgroup standby_sgp -region region2 -deploy_as active_standby
  • 向組添加成員
    這裏將odb05和odb06添加至primary group;odb07和odb08添加至standby group。
GDSCTL> add invitednode odb05
GDSCTL> create shard -shardgroup primary_sgp -destination odb05 -credential cre_reg1
The operation completed successfully
DB Unique Name: sh1
GDSCTL> add invitednode odb06
GDSCTL> create shard -shardgroup primary_sgp -destination odb06 -credential cre_reg1
The operation completed successfully
DB Unique Name: sh3
GDSCTL> add invitednode odb07
GDSCTL> create shard -shardgroup standby_sgp -destination odb07 -credential cre_reg1
The operation completed successfully
DB Unique Name: sh4
GDSCTL> add invitednode odb08
GDSCTL> create shard -shardgroup standby_sgp -destination odb08 -credential cre_reg1
The operation completed successfully
DB Unique Name: sh5

使用config命令讀取配置信息進行驗證,以下圖:
Using Oracle Data Guard with a Sharded Database
Using Oracle Data Guard with a Sharded Database

  • 部署shards
    執行deploy命令在各個節點部署。
    GDSCTL> deploy
    deploy: examining configuration...
    deploy: deploying primary shard 'sh1' ...
    deploy: network listener configuration successful at destination 'odb05'
    deploy: starting DBCA at destination 'odb05' to create primary shard 'sh1' ...
    deploy: deploying primary shard 'sh3' ...
    deploy: network listener configuration successful at destination 'odb06'
    deploy: starting DBCA at destination 'odb06' to create primary shard 'sh3' ...
    deploy: waiting for 2 DBCA primary creation job(s) to complete...
    deploy: waiting for 2 DBCA primary creation job(s) to complete...
    deploy: waiting for 2 DBCA primary creation job(s) to complete...
    deploy: waiting for 2 DBCA primary creation job(s) to complete...
    deploy: waiting for 2 DBCA primary creation job(s) to complete...
    deploy: waiting for 2 DBCA primary creation job(s) to complete...
    deploy: waiting for 2 DBCA primary creation job(s) to complete...
    deploy: waiting for 2 DBCA primary creation job(s) to complete...
    deploy: waiting for 2 DBCA primary creation job(s) to complete...
    deploy: waiting for 2 DBCA primary creation job(s) to complete...
    deploy: waiting for 2 DBCA primary creation job(s) to complete...
    deploy: waiting for 2 DBCA primary creation job(s) to complete...
    deploy: DBCA primary creation job succeeded at destination 'odb05' for shard 'sh1'
    deploy: deploying standby shard 'sh4' ...
    deploy: network listener configuration successful at destination 'odb07'
    deploy: starting DBCA at destination 'odb07' to create standby shard 'sh4' ...
    deploy: DBCA primary creation job succeeded at destination 'odb06' for shard 'sh3'
    deploy: deploying standby shard 'sh5' ...
    deploy: network listener configuration successful at destination 'odb08'
    deploy: starting DBCA at destination 'odb08' to create standby shard 'sh5' ...
    deploy: waiting for 2 DBCA standby creation job(s) to complete...
    deploy: waiting for 2 DBCA standby creation job(s) to complete...
    deploy: waiting for 2 DBCA standby creation job(s) to complete...
    deploy: waiting for 2 DBCA standby creation job(s) to complete...
    deploy: waiting for 2 DBCA standby creation job(s) to complete...
    deploy: DBCA standby creation job succeeded at destination 'odb07' for shard 'sh4'
    deploy: waiting for 1 DBCA standby creation job(s) to complete...
    deploy: DBCA standby creation job succeeded at destination 'odb08' for shard 'sh5'
    deploy: requesting Data Guard configuration on shards via GSM
    deploy: shards configured successfully
    The operation completed successfully

    部署完成後,進行驗證,以下圖所示:
    Using Oracle Data Guard with a Sharded Database
    Using Oracle Data Guard with a Sharded Database

  • 添加global service
GDSCTL> add service -service oltp_rw_srvc -role primary
The operation completed successfully
GDSCTL> start service -service oltp_rw_srvc
The operation completed successfully
GDSCTL> add service -service oltp_ro_srvc -role physical_standby
The operation completed successfully
GDSCTL> start service -service oltp_ro_srvc
The operation completed successfully
GDSCTL> services
Service "oltp_ro_srvc.shcdb.oradbcloud" has 2 instance(s). Affinity: ANYWHERE
   Instance "shcdb%21", name: "sh4", db: "sh4", region: "region2", status: ready.
   Instance "shcdb%31", name: "sh5", db: "sh5", region: "region2", status: ready.
Service "oltp_rw_srvc.shcdb.oradbcloud" has 2 instance(s). Affinity: ANYWHERE
   Instance "shcdb%1", name: "sh1", db: "sh1", region: "region1", status: ready.
   Instance "shcdb%11", name: "sh3", db: "sh3", region: "region1", status: ready.
相關文章
相關標籤/搜索