Using Oracle Data Guard with a Sharded Database

1、概念和体系结构

Sharding是一种水平数据分片的架构。每个数据库都有单独的本地资源(CPU、内存、硬盘)。这样的配置中,每个数据库被称作分片shard。所有的分片合并在一起凑成一个逻辑数据库,这个逻辑的数据库被称作分片数据库(SDB)。水平分片将一张数据库中的表拆分成多个分片,每个分片有相同的列,但是具有不同的行。因此这样的表也被称作(sharded table)。

另外它也是一种shared-nothing的架构,消除了单点故障(因为分片它不共享物理资源,如cpu、内存或存储设备),在软件方面也是松耦合的,所以它不需要运行集群软件。

从DBA的角度来看,SDB由多个分片组成。这些分片可以集体管理,也可以单独进行管理,然而从应用程序使用的角度上来看,SDB就是一个数据库,分片的数量和数据在那个分片上对数据库应用程序来说都是完全透明的。

分片适用于OLTP应用程序,使用分片的应用程序必须具有良好的数据模型和数据分片的结构。例如(一致的hash、范围、列表或者是这些组合),主要使用分片切分的键值来访问数据。例如我们可以使用的分片键可以是customer_id、Account_no或Country_id等等。

sharding主要的优点:

  • 线性扩展--Sharding消除了性能瓶颈,通过添加分片使得性能和容量能够线性缩放。
  • 失败隔离--分片是一种shared nothing的基础架构,它消除了单点故障。例如共享磁盘、SAN网络和集群软件。它提供了很强的故障隔离机制,一个分片的出现了故障不会影响其他分片的可用性和性能。
  • 数据地理分布--当数据必须位于特定的管辖区域时,分片可以将特定数据存储在靠近其消费者的位置并满足法规要求。
  • 滚动式更新--在一个分片上应用配置更改不会影响其他分片,并且允许管理员首先测试一小部分数据的更改。
  • 简化云部署--分片非常适合在云上部署。

与其他NoSQL数据库不同,Oracle分片提供了分片的好处,而不牺牲企业级RDBMS的功能。它支持:

  • 关系模式
  • 数据库分区表
  • 关系型数据库的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。
2、环境介绍

各个节点的角色以及数据库版本如下表所示:
Using Oracle Data Guard with a Sharded Database
其中实例名是系统自己命名的。本文旨在介绍如何部署一个带有adg功能的sharded database。

3、创建Shard Catalog Database

这里使用静默方式在odb01上创建目录数据库。

[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,完成后重启数据库实例。

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
4、安装并配置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}
5、部署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.
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值