循序渐进:Oracle 12.2的Sharding基础概念解读


张大朋(Lunar)Oracle 工程师

Lunar 拥有超过十年的 ORACLE SUPPORT 从业经验,曾经服务于ORACLE ACS部门,现就职于 ORACLE Sales Consultant 部门,负责的产品主要是 Exadata,Golden Gate,Database 等。

编辑说明:感谢Lunar授权我们转载其原创文章,文章插入了一些我们以前分享的图片,作为配合解读。

2015年8月份内部release了Oracle 12.2 Beta版本(目前内部最新release的版本是2016年2月份发布的,windows和Linux都有了),目前根据12.2beta文档的介绍,Oracle推出了sharding的功能,跟其他NOSQL型的sharding结构相比,Oracle Sharding提供的是企业级的RDBMS的分片技术。


Oracle Sharding的优点:
• Relational schemas
• Database partitioning
• ACID properties and read consistency
• SQL and other programmatic interfaces
• Complex data types
• Online schema changes
• Multi-core scalability
• Advanced security
• Compression
• High Availability features
• Enterprise-scale backup and recovery

在Oracle RDBMS 12.2.0.1中最多支持1000个shards。

Oracle Sharding使用GDS(Global Data Services)架构来自动部署和管理sharding和复制技术。GDS(GDS是Oracle RDBMS 12.1的新特性)也提供负载均衡和SDB(sharded database)中的基于位置的路由功能。

Shard目录(Shard directors)使用GDS framework的全局服务管理组件(global service manager component)来提供应用层请求到shard的直接路由。shard目录(Shard directors)是一个单独的数据库,它用来保存SDB(Sharding database)配置数据和提供其他相关功能,比如shard的交叉查询和集中管理。可以使用GDS是GDSCTL工具可以用来配置SDB。

Oracle Sharding的分区架构(Partitioning Infrastructure)
分区在表空间级别跨Shards分布,每个表空间关联一个特定的shard。一个shard表的每一个分区放单独的表空间,并且每个表空间关联到一个特定的shard。根据不同的sharding方法,这个关联可以自动建立或者根据定义创建。尽管一个shard表的多个分区放在多个单独主机的数据库上(这些数据库完全独立,不共享CPU、内存等软件和硬件),但是应用访问表时就如同访问一个单独数据库中的分区表一样。应用发出的SQL语句不需要依赖shard号和shard的物理配置。

Oracle Sharding 使用 familiar SQL 语法创建表分区,指定分区表的每行数据如何分片。
一个shard表的分区键叫做sharding key,例如,下面的语法是典型的用来创建sharding表的:
CREATE SHARDED TABLE customers
( cust_id NUMBER NOT NULL
, name VARCHAR2(50)
, address VARCHAR2(250)
, region VARCHAR2(20)
, class VARCHAR2(3)
, signup DATE
CONSTRAINT cust_pk PRIMARY KEY(cust_id)
)
PARTITION BY CONSISTENT HASH (cust_id)
TABLESPACE SET ts1
PARTITIONS AUTO;
这个数据分片(shard)就是基于键值cust_id,分区采用“CONSISTENT HASH”,这是一个特定的hash分区类型,通常用在分布式系统上。

.
Sharding a Table Family
一个表家族(Table Family)中没有任何父表的表叫做根表(root table),每个表家族中只能有一个根表。
表家族中所有的表按照根表的主键进行sharding,根据各级表的结构,相关数据可以被存储在同一个shard上。
在12.2,在一个SDB中只支持一个表家族。
.
以下面的例子说明,这里一共3张表组成的表家族(Table Family):客户表,订单表和订单明细表。
每个客户可以有多个订单,每个订单中可以有多个商品,因此订单明细中就记录了每个订单中的多个商品,他们的具体数据如下:





在这个表族中,客户编号为123的数据如下:





将一个表族(Sharded Table Family)分片通常使有下面两种方法创建
方法1:不显示指定父子关系,而是通过表之间主外键关系创建表族。

这种方式创建的表族是一个多级的树形结构。
根表(root table)是客户表:
–客户表的主键是CustNo,分区方式是“CONSISTENT HASH (CustNo)”
–保存再表空间集ts1中


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 AUTO

TABLESPACE SET ts1

;

–订单表是客户表的字表,子表(订单表)根据CustNo关联父表(客户表):
–订单表的主键是(CustNo, OrderNo),外键(CustNo)引用了主表Customers(CustNo)
–分区方式是按照订单表的外键约束(CustFK)


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)

;

–订单明细表是订单表的字表,子表(订单明细表)根据CustNo关联父表(订单表)
–订单明细表的主键是(CustNo, OrderNo, LineNo),外键(CustNo, OrderNo)引用了父表Orders(OrderNo)和Orders(CustNo, OrderNo)
–分区方式是按照订单明细表的外键约束(LineFK)


CREATE SHARDED TABLE LineItems

( CustNo NUMBER NOT NULL

, LineNo NUMBER(2) NOT NULL

, OrderNo NUMBER(5) NOT NULL

, StockNo NUMBER(4)

, Quantity NUMBER(2)

, CONSTRAINT LinePK PRIMARY KEY (CustNo, OrderNo, LineNo)

, CONSTRAINT LineFK FOREIGN KEY (CustNo, OrderNo) REFERENCES Orders(OrderNo)

REFERENCES Orders(CustNo, OrderNo)

)

PARTITION BY REFERENCE (LineFK)

;

因此,上面的例子中,这个表家族的所有数据都保存在同一个表空间集ts1中。
当根表中增加一个分区的时候,那么相关联的表中都会自动增加相应的分区。

.
方法2:在分区表中显示指定父子关系的方法创建表家族
这种分区方法只支持两级的表家族(two-level table families),所有的子表必须有相同的父表,父表的分区列在每个子表中都存在,例如下面的CustNo.
.
–没有关键字“PARENT”(也没有上面引用约束关键字)的是根表,即客户表(Customers)


CREATE SHARDED TABLE Customers

( CustNo NUMBER NOT NULL

, Name VARCHAR2(50)

, Address VARCHAR2(250)

, region VARCHAR2(20)

, class VARCHAR2(3)

, signup DATE

)

PARTITION BY CONSISTENT HASH (CustNo)

TABLESPACE SET ts1

PARTITIONS AUTO

;

–根据关键字“PARENT Customers”指定了订单表(Orders)的父表是客户表(Customers)


CREATE SHARDED TABLE Orders

( OrderNo NUMBER

, CustNo NUMBER

, OrderDate DATE

)

PARENT Customers

PARTITION BY CONSISTENT HASH (CustNo)

TABLESPACE SET ts1

PARTITIONS AUTO

;

–根据关键字“PARENT Customers”指定了订单明细表(LineItems)的父表是客户表(Customers)


CREATE SHARDED TABLE LineItems

( LineNo NUMBER

, OrderNo NUMBER

, CustNo NUMBER

, StockNo NUMBER

, Quantity NUMBER

)

)

PARENT Customers

PARTITION BY CONSISTENT HASH (CustNo)

TABLESPACE SET ts1

PARTITIONS AUTO

;

Creating a Duplicated Table Using CREATE TABLE
复制表可以被复制到所有的shard上,这种在每个shard上有相同内容的表叫做复制表(Duplicated Table),需要经常跟shard表关联的小表适合于作为复制表(Duplicated Table),适用于:
(1)只读表
(2)大量跨shard的读操作

Oracle Sharding使用Materialized View Replication来同步复制表(duplicated tables)的内容,每个shard上的duplicated tables的内容是一个只读物化视图(read-only materialized view)。

物化视图(materialized views)的主表保存在一个专门的数据库中,叫做Shard Catalog
所有shard上的物化视图(materialized views)会根据配置的频率自动刷新。
创建复制表的语句“CREATE DUPLICATED TABLE”会自动创建master表,物化视图和其他物化视图复制所需要的对象。
还是以上面的客户订单关系为例,这里定义产品表(Products)为复制表:





CREATE DUPLICATED TABLE Products

( StockNo NUMBER PRIMARY KEY

, Description VARCHAR2(20)

, Price NUMBER(6,2))

)

;

根据sharding的机制,sharding的设计对后续系统性能影响是非常大的。一旦sharding创建完成,并已经有很多数据,相关的属性就不能再修改了,比如某个表是复制表,还是sharding表,sharding key等等,因此,SDB的设计是至关重要的,在设计sharding时需要考虑的有:

哪些表需要被设计为sharding表;
哪些表需要做复制表;
哪些shard表是根表;
使用什么方法来关联一个表到其他表或者根表;
应该使用哪种sharding方法;
使用哪个作为sharding key;

文章转自数据和云公众号,原文链接

时间: 2024-10-02 15:08:24

循序渐进:Oracle 12.2的Sharding基础概念解读的相关文章

从原理到实践:Oracle 12.2 Sharding技术揭秘

何剑敏 Oracle ACS华南区售后团队,首席技术工程师 曾供职于中国联通信息计费部.卓望数码,系统支撑部首席DBA,负责中国移动全网梦网业务和移动应用商城数据库维护.后供职于IBM,负责米其林项目和澳洲电信(Telstra)项目数据库管理.现供职于Oracle ACS华南区售后团队,首席技术工程师.多年从事第一线的数据库运维工作,有丰富项目经验.维护经验和调优经验,专注于数据库的整体运维. 编辑说明:感谢何剑敏撰写了关于Sharding的相关文章,并授权我们分享给大家.根据我们的理解对他的文

Oracle 12.2新特性掌上手册 - 第三卷 Sharding 的增强

编辑手记:Sharding技术我们谈了好久,想必大家并不陌生,该功能12.2最新版本中,也将变得越来越完善,今天我们一起来学习. 注:文章内容来自官方文档翻译.若需要了解更多,请查阅官方文档. 1.about Sharding 简单来说,Oracle的Sharding技术就是通过分区(Partioning)技术的扩展来实现的.以前一个表的分区可以存在于不同的表空间,现在可以存在于不同的数据库.不同分区存在于不同数据库,这就将数据隔离了开来,Sharding就此实现. Sharding是一种数据层

WCF分布式开发步步为赢(1):WCF分布式框架基础概念

众所周知,系统间的低耦合一直是大型企业应用系统集成追寻的目标,SOA面向服务架构的出现为我们的如何利用现有企业系统资源进行企业ERP系统设计和实现提供了重要的参考原则.SOA如此炙手可热,各大厂商都推出了自己的中间件产品,比如Oracle Fusion和 SAP NetWeaver,IBM.BEA等企业也推出了自己基于SOA的解决方案.基于J2EE平台的SOA架构设计中的一个重要概念就是EJB企业服务总线,作用是实现各个系统的数据交互.而.NET平台上,WCF就是微软为各个系统的数据交互提供通讯

Java编程一定要搞清29个基础概念

  Java的白皮书为我们提出了Java编程语言的11个关键特性.这11个关键特性就是Java一定要搞清的29个基础概念. (1)Easy:Java的语法比C++的相对简单,另一个方面就是Java能使软件在很小的机器上运行,基础解释其和类库的支持的大小约为40kb,增加基本的标准库和线程支持的内存需要增加125kb.并不是说这个语言就而一定比哪个好,51CTO也曾特别推荐过"C#与C++谁更强?还是关公战秦琼",对于初学者来说,您想选择好的语言进行学习,可以参看51CTO编辑特别推荐的

《循序渐进Oracle:数据库管理、优化与备份恢复》一一1.1 Oracle软件的获取与安装

1.1 Oracle软件的获取与安装 循序渐进Oracle:数据库管理.优化与备份恢复 在学习和接触Oracle数据库时,首先需要获取相关软件并安装创建数据库,本节简要介绍一下Oracle软件的获取与安装. 1.1.1 Oracle软件的获取 Oracle的软件可以从官方网站上下载,主要的网址链接为:http://www.oracle.com/us/products/database/index.html. 在这里可以找到Oracle数据库产品的详细信息,如图1-1所示. 注册一个OTN的账户后

Oracle 12.2新特性掌上手册 - 第七卷 Big Data and Data Warehousing

编辑手记:也许Oracle 12.2在内核上的智能改进只能让你眼前一亮,那今天基于Big Data和数据仓库的性能优化增强则会让你伸手触Oracle的强大灵魂.细腻中霸气侧漏,这就是Oracle 12.2. 1Partitioning:External Tables(外部表) 外部分区表提供了将分区的Hive表映射到Oracle数据库生态系统以及在基于Hadoop分布式文件系统(HDFS)的数据存储之上提供声明分区的功能. 作用 Oracle数据库基于外部HDFS的数据存储功能,使得数据库分区能

Oracle 12.2的Sharding-1-基础概念学习笔记

2015年8月份内部release了Oracle 12.2beta版本(目前内部最新release的版本是2016年2月份发布的,windows和Linux都有了),目前根据12.2beta文档的介绍,Oracle推出了sharding的功能,跟其他NOSQL型的sharding结构相比,Oracle Sharding提供的是企业级的RDBMS的分片技术. . Oracle Sharding的优点: • Relational schemas • Database partitioning • A

《深入学习VMware vSphere 6》——第1章 vSphere虚拟化基础与规划 1.1虚拟化基础概念

第1章 vSphere虚拟化基础与规划 本章介绍虚拟化基础知识,介绍在虚拟化项目中服务器.存储.交换机的选择与规划,介绍常用网络配置命令.主流服务器的RAID配置等内容.初次学习虚拟化的用户,需要仔细阅读本章内容. 1.1 虚拟化基础概念 如果第一次接触虚拟机并想尝试使用虚拟机软件,可能有许多的疑问.本节主要回答初学者容易混淆或者不清楚的问题,让初学者了解虚拟机.虚拟化与云计算的基础知识. 1.1.1 什么是虚拟机 虚拟机是一台"软件"计算机,确切地说,虚拟机是一种严密隔离的软件容器,

足彩基础知识入门(4)赛事数据库与预测平台基础概念介绍(一)

在足球赛事数据库以及统计分析预测平台中,有很多概念,如果不搞懂,很难进行下一步的工作.所以为了配合团队人员的学习和任务进行,特意编写这篇文章.如果有其他问题和不懂的,请留言,将根据情况进行更新. 本文原文地址:足彩基础知识入门(4)赛事数据库与预测平台基础概念介绍(一) 1.指数1/2/3.... 我在 足彩基础知识入门(3)足彩赔率的本质 一文中介绍了赔率的概念,那么指数的概念和赔率以及结果是相关的.我们举个例子: 如上图的比赛,前面是竞彩非让球的赔率:1.74-3.25-4.15,也就是说