在上一篇Oracle Sharding 介绍系列 III(横向对比) 对 Oracle Sharding 与其他产品进行了横向对比之后,这一篇我们再看看 Oracle Sharding 背后的技术实现 1、数据在分片之间如何分配?
Oracle Sharding使用水平分区来跨分片(离散物理数据库)分割数据库表,以便每个分片包含具有相同列但行的不同子集的表。 跨分片的分区的分布在表空间级别完成。分片表的每个分区驻留在单独的表空间中,每个表空间与特定分片相关联。每个分片上的表分区与非分片Oracle数据库中使用的常规分区没有区别。即使表的分区驻留在多个数据库中,对应用程序开发人员来说,表的外观和行为与单个数据库中的常规分区表完全相同。应用程序发出的SQL语句从不引用分片,也不依赖于分片数及其配置。 Oracle Sharding提供了几种可选的分区方法,可以自动或由用户确定数据的分布,或两者的组合。
2、Oracle Sharding支持哪些类型的Sharding方法呢?
Oracle Sharding支持三种分片方法:系统管理,用户定义和复合分片。
3、如何在单个分片上包含多个事务?
对于许多应用程序,可以通过将水平分区与跨所有分片的少量只读或读取主表的复制结合来实现高百分比的单分片操作。对于通常与分片表一起访问的相对较小的表,完整表的复制是一个不错的选择。在每个分片中具有相同内容的表称为重复表。 Oracle Sharding使用物化视图复制来同步重复表的内容。每个分片上的重复表由只读物化视图表示。物化视图的主表位于称为碎片目录的特殊数据库中。所有分片上的物化视图都将以可配置的频率自动刷新。 CREATE DUPLICATED TABLE自动创建主表,物化视图和物化视图复制所需的其他对象。
4、应用程序如何知道它在运行时必须连接到哪个分片?
应用程序必须指定一个分片键,以使用分片式数据库架构实现高性能。例如,网上银行应用程序可以设计为使用当用户作为分片键登录时生成的customer_id。 当处理数据库事务时,应用程序将分片键传递到连接层:
例如,UCP分片路由缓存包含分片键范围到分片的映射。当应用程序通过分片键检出连接时,UCP从其路由缓存中查找其上存在此键的相应分片。如果池中有匹配的连接可用,则UCP通过应用其内部连接选择算法来返回到这些分片中的一个的连接。如果没有匹配的连接,则通过将具有分片关键字的请求转发到Shard Director来创建新的连接。在第一次连接到分片时,连接池检索分片中的所有键范围,并将它们添加到其路由缓存中,以便后续连接直接转到分片(即绕过Shard Director)。 如果分片不可用,客户端连接将自动重定向到HA的分片副本。
5、如果重新平衡数据或添加/删除碎片,则路由缓存如何更新?
所有重新平衡和添加/删除分片操作都由SDB管理层(Shard Catalog和Shard Director)执行。在所有这些操作期间,SDB保持可用并在线。一旦重新平衡完成,分片路由高速缓存将失效,并在下次将连接路由到分片时自动刷新。
6、如何在多个shard之间重新平衡工作负载?
在以下情况下需要跨分片的数据迁移:
- 当一个或多个分片添加到SDB或从SDB中删除时
- 当跨分片的数据或工作负载分布存在偏差时
在由分片数量变化触发的分片之间重新分布数据的过程称为重新分片。自动重新分片可以在SDB上提供统一的数据分布。要理解这是如何完成的,有必要了解如何在碎片上物理分区数据。 跨分片的分区分布通过在驻留在不同分片上的表空间中创建分区来实现。为了最小化多分片连接的数量,表族中所有表的相应分区总是存储在同一分片中。分片表的每个分区存储在单独的表空间中。 因此,表空间是SDB中的数据分布的物理单位。分片之间的数据迁移单位是块。块是一组表空间,用于存储表系列中所有表的相应分区。块包含来自表系列的每个表的单个分区。这保证来自不同分片表的相关数据一起移动。在创建SDB时指定每个分片中的块数。 当发生数据或工作负载倾斜时,特定块也可以从一个碎片移动到另一个碎片,而碎片数量没有任何变化。在这种情况下,块迁移由DBA启动以消除热点。或者,Oracle Sharding也支持在线拆分一个块。 当块变得太大时,或者只有一部分块必须迁移到另一个块时,需要拆分。 RMAN增量备份,可传输表空间和Oracle Notification Service技术用于将块迁移对应用程序可用性的影响降至最低。块在块迁移期间保持联机。当存储在块中的数据仅可用于只读访问时,有一段很短的时间(几秒钟)。迁移组块的过程由管理员自动启动。 启用FAN的客户端在块即将在源分片中变为只读时,以及在完成块迁移时在目标分片中完全可用时接收通知。当客户端接收到”chunk read-only”事件时,它们可以重复连接尝试,直到块移动完成,或访问源块中的只读块。在后一种情况下,尝试写入块将导致运行时错误。
7、分片如何提供线性可伸缩性?
线性可扩展性通过消除碎片之间的任何依赖性来实现。 每个分片是独立的Oracle数据库,不共享任何硬件或软件。 需要高性能和可扩展性的事务只访问单个分片中包含的数据。 设计用于Oracle分区的OLTP应用程序可以在任何平台上弹性扩展(数据,事务和用户)到任何级别,只需在额外的独立服务器上部署新的分片。 每个分片通常使用本地存储器,闪存和存储器,提供以相对低的成本进一步优化性能的机会。 通过应用程序提供的分片键和Oracle客户端(JDBC,OCI和ODP.net)及Oracle通用连接池(UCP)支持的高性能数据相关路由,将工作负载定向到相应的分片。 分片键的示例包括:customer_id,account_no,country_id等。
8、分片如何实现故障隔离?
根据定义,每个分片是独立的Oracle数据库,不与其他分片共享硬件或软件。一个或多个碎片的中断或减速不会影响其他碎片上应用程序的可用性。在分片级别用于HA的复制在分片经历中断时快速恢复可用性。同样,一个分片的计划维护不会影响其他分片的可用性。 另外,分片导向器和分片目录数据库的其他组件也有助于消除单点故障。碎片导向器是一个非常轻量级的进程,不包括Oracle数据库实例。冗余碎片引导器部署在每个区域内部署碎片,以确保对SDB的连续应用程序访问。分片目录数据库使用Oracle Data Guard复制和自动故障转移来提供高可用性。目录数据库对运行时连接的路由没有影响 – 客户端连接使用分片路由缓存来实现高性能数据相关的路由。在Data Guard自动故障转移期间,目录数据库的瞬时不可用性仅导致碎片维护操作或多分片查询的短暂中断。
9、如何为分片数据库实施高可用性和灾难恢复?
用于任何Oracle数据库的所有常用Oracle高可用性解决方案也用于为分片式数据库提供HA,备份和恢复以及灾难恢复。
- 具有自动数据库故障转移的Data Guard是用于计划外中断和计划维护的默认HA配置,并自动为每个分片部署;
- 管理员可以自动部署Active Data Guard(所有分片副本以只读方式打开)或Oracle GoldenGate双向复制用于分片HA;
- 管理员可以手动配置用于分片HA的Oracle RAC
- Oracle恢复管理器(RMAN)和闪回在提供分片级别的备份和基于时间点的恢复
- 零数据丢失恢复设备提供高效的企业备份和恢复。恢复设备可以执行实时备份,从而保护SDB中的每个事务。
- 每个分片的其他远程副本由Data Guard,Active Data Guard或Oracle GoldenGate维护,并为站点中断提供实时灾难恢复和数据保护。
- 基于版本的重新定义在部署修改后端数据库对象的应用程序的新版本时提供了对分片的在线修补。