Oracle Sharding是Oracle 12.2版本推出的新功能,也称为数据分片,适用于online transaction processing (OLTP)。该方案基于表分区技术,将数据水平分区存储到不同的数据库,每个数据库位于不同的服务器,这里每一个数据库都称为shard, 这些shard组成一个逻辑数据库,称为sharded database (SDB), 这个table也称为sharded table, 每个shard数据库中保存该表的不同数据集(按照sharding key分区)。
以下是Shared table的示意,该部署方案分布包括3个数据库节点:

Oracle Sharding有以下优点:
1、线性扩展,Shard是一种shared-nothing技术,每个shard数据库使用独立的服务器硬件(CPU,内存等),可通过扩展服务器的方式进行扩展;
2、故障控制,同样是因为shared-nothing,可消除单点故障,单点故障不会影响其它节点性能和可用性;
3、滚动升级;
4、适合云部署。
Oracle Sharing的架构:

1、Shared database(SDB),逻辑上SDB是一个数据库,但是物理上SDB包括多个物理独立的数据库,SDB类似一个数据库池(pool),数据库池(pool)中包括多个数据库。
2、Shard,SDB中每一个数据库都称为shard, 每个shard数据库位于不同的服务器,他们不共享CPU,内存,存储等资源。
3、Shard catalog,也是一个Oracle数据库,用于集中存储管理SDB配置信息,是SDB的核心。SDB配置变化,比如添加/删除shard,Global service等等,都记录在Shard catalog。查询需要访问多个shard中的数据,则该查询由Shard catalog统一协调分配。
4、Shard directors,Oracle Sharding环境中的GSM服务,称之为Shard Director。GSM类似于监听器,将客户端对SDB的请求路由到对应的shard。负载均衡客户端的访问。
5、连接池,支持oci,jdbc的连接池访问机制。
6、管理接口GDSCTL,可以基于GDSCTL进行sharded database的发布、管理和监控等。
SDB数据库支持的表类型:
1、Sharded Tables,以表或表组的形式存在,适合于进行分区管理的数据表,按照指定分区列,将数据分布到SDB的各节点。如下创建:
CREATE SHARDED TABLE Customers( CustNo NUMBER NOT NULL, Name VARCHAR2(50), Address VARCHAR2(250), CONSTRAINT RootPK PRIMARY KEY(CustNo))PARTITION BY CONSISTENT HASH (CustNo)PARTITIONS AUTOTABLESPACE SET ts1;CREATE SHARDED TABLE Orders( OrderNo NUMBER NOT NULL, CustNo NUMBER NOT NULL, OrderDate DATE, CONSTRAINT OrderPK PRIMARY KEY (CustNo, OrderNo), CONSTRAINT CustFK FOREIGN KEY (CustNo) REFERENCES Customers(CustNo))PARTITION BY REFERENCE (CustFK);
Shardedtable通过分区键,将数据分布到SDB的个节点,实现线性扩展的目标。这一点与MPP数据库的表分布机制类似。在查询时,通过将查询任务分布到多个节点,并行执行查询任务提升查询效率。
2、DuplicatedTables,适合小数据量表,该模型在SDB的每个节点上存储一份完整数据。
CREATE DUPLICATED TABLE Products( StockNo NUMBER PRIMARY KEY, DescriptionVARCHAR2(20),Price NUMBER(6,2));

表分布和CHUNK的引入:
Oracle Sharding在执行CREATE SHARDED TABLE语句时自动将分区分布到shard中,分区的分布对应用程序是透明的。下图显示了分片表的逻辑视图及其物理实现:

CHUNK的引入:
为减少多shard连接的数量,一个表族中所有表的对应分区总是存储在同一个shard中。当表族中的表是在同一组分布式表空间中创建的,可以保证对应分区在同一个shard中。
但是,当从不同表空间集中的表族创建不同的表时,例如表空间集ts1中的Customers表和表空间集ts2中的Orders表。在这种情况下,必须保证存储客户分区1的表空间始终与存储订单分区1的表空间位于同一个shard中。为了支持此功能,将形成一组表族中所有表的相应分区,称为块。块包含表族中每个表的单个分区。下图显示了一个包含来自客户订单行项目模式表的相应分区的块:

小结:
Oracle Shard技术的引入,在保留了Oracle数据库管理系统的传统的优势的同时,让oracle数据库不再受限于RAC技术的限制,具备了类似MPP数据库的水平扩展和并行计算的能力,具备了更多的可能性。
参考文档:
https://docs.oracle.com/en/database/oracle/oracle-database/19/shard/sharding-overview.html
No.26。




