
本书分为9章,主要介绍应用ShardingSphere实现分库分表的一些方法论和工程实践。通过对ShardingSphere的基本概念、应用方式和整体架构的介绍,帮助读者掌握ShardingSphere的设计思想和解决方案;然后从Sharding-JDBC和Sharding-Proxy两款核心组件出发,对分库分表、读写分离、分布式事务、数据脱敏、编排治理及代理服务器等核心功能进行详细阐述,并结合具体场景给出实例分析和实现过程。 本书面向Java服务器端开发人员,读者不需要有很深的技术水平,也不需要详细了解分库分表相关工具,但如果读者熟悉Java EE常见技术并掌握一定数据访问基本概念,则有助于读者更好地理解书中的内容。通过学习本书内容,读者将对ShardingSphere的基本架构、设计思想和应用方式有更加深入的了解,为后续的工作和学习奠定基础。同时,本书可以作为具备不同技术体系的开发人员的参考用书。希望本书能给读者的日常研发和管理工作带来启发和帮助。
前言 随着互联网行业的飞速发展,我们需要进行快速的业务更新和产品迭代,同时也不得不面对快速增长的业务数据。在软件系统中,关系型数据库仍然是数据平台核心业务的基石。但传统的单库单表的容量是有限的,当面对海量数据时,就需要引入分库分表架构。我们可以结合纵向分库和横向分表的设计方法来应对海量数据的存储和访问。然而,在系统中引入分库分表架构远远没有想象中的那么简单,我们在设计和实现分库分表架构的过程中会遇到一系列的问题。如何让分库分表能够真正落地,将是摆在我们面前的一大挑战。 在这样的背景下,诞生了一些分库分表解决方案和开源工具,而 ShardingSphere就是其中的代表性框架。作为 Apache 的顶级项目,ShardingSphere 为我们提供了一系列强大的功能。本书主要介绍基于 ShardingSphere 实现分库分表所应具备的技术体系,并针对该框架提供的 Sharding-JDBC 和 Sharding-Proxy 核心组件进行全面的讨论,以及提供相应的工程实践。 本书分为 9 章,分别从不同的领域对 ShardingSphere 的各个方面展开讨论。 第 1 章直面数据分库分表架构。主要从分库分表的基本的概念出发,给出分库分表解决方案和代表性框架,以及实现分库分表架构所需要考虑的技术体系,然后,针对 ShardingSphere 给出了该框架所提供的具体解决方案。 第 2 章引入 ShardingSphere。主要介绍如何使用 ShardingSphere,在应用程序中集成 ShardingSphere 的各种方式,以及如何使用 ShardingSphere 配置体系完成开发工作。 第 3 章 ShardingSphere 整体架构。主要从架构体系上对 ShardingSphere 进行剖析。作为基于 JDBC 规范的一款开源框架,ShardingSphere 完全兼容 JDBC 并基于微内核架构提供了插件化的运行机制,而开发人员也可以基于 Spring 框架完成与ShardingSphere 的无缝集成。 第 4 章~第 8 章 Sharding-JDBC 核心功能。这部分是本书的重点内容,主要介绍 ShardingSphere 中 Sharding-JDBC 组件的各项核心功能,包括数据分片、读写分离、分布式事务、数据脱敏和编排治理等。 第 9 章 ShardingSphere 代理服务。主要介绍 ShardingSphere 中的另一个核心组件 Sharding-Proxy。作为代理服务器的典型实现方案,Sharding-Proxy 为异构语言和异构系统之间的集成提供了良好的支持。 在撰写本书的过程中,感谢我的家人,特别是我的妻子章兰婷女士,在我占用大量晚上和周末时间的情况下,能够给予极大的支持和理解。感谢过去及现在的同事们,业界领先的公司和团队让我得到很多学习和成长的机会,如果没有大家的帮助,就不会有这本书的诞生。特别感谢电子工业出版社的张春雨编辑,这本书能够顺利出版,离不开他的敬业精神和工作态度。 由于作者水平有限,书中难免存在一些疏漏和不足,希望同行专家和广大读者给予批评与指正。 ——郑天民 2021 年 2 月于杭州钱江世纪城
第 1 章 直面数据分库分表架构 ................................................................................................. 1 1.1 分库分表简介 ............................................................................................................ 1 1.1.1 分库分表的基本概念 ....................................................................................... 2 1.1.2 分库分表解决方案和代表性框架 ...................................................................... 7 1.2 实现分库分表 .......................................................................................................... 10 1.2.1 数据分片 ...................................................................................................... 10 1.2.2 读写分离 ...................................................................................................... 11 1.2.3 分布式事务 .................................................................................................. 12 1.3 初识 ShardingSphere ................................................................................................. 12 1.3.1 ShardingSphere 设计理念和核心组件 .............................................................. 14 1.3.2 ShardingSphere 解决方案 ............................................................................... 18 1.4 本书架构 ................................................................................................................. 21 1.5 本章小结 ................................................................................................................. 22 第 2 章 引入 ShardingSphere ................................................................................................. 23 2.1 ShardingSphere 的使用方式 ....................................................................................... 23 2.1.1 数据库和 JDBC 驱动集成 .............................................................................. 24 2.1.2 开发框架集成 ............................................................................................... 25 2.1.3 ORM 框架集成 ............................................................................................. 32 2.2 ShardingSphere 的配置机制 ....................................................................................... 34 2.2.1 行表达式 ...................................................................................................... 34 2.2.2 ShardingSphere 的核心配置 ............................................................................ 35 2.2.3 ShardingSphere 的配置方式 ............................................................................ 38 Apache ShardingSphere 实战 VI 2.2.4 ShardingSphere 的配置体系 ............................................................................ 43 2.3 本章小结 ................................................................................................................. 51 第 3 章 ShardingSphere 整体架构 .......................................................................................... 53 3.1 ShardingSphere 与 JDBC 规范 .................................................................................... 53 3.1.1 JDBC 规范的核心组件 .................................................................................. 54 3.1.2 ShardingSphere 与 JDBC 规范的兼容性 ........................................................... 59 3.2 ShardingSphere 与微内核架构模式 ............................................................................. 66 3.2.1 微内核架构模式设计原理与实现 .................................................................... 66 3.2.2 ShardingSphere 基于微内核架构模式实现扩展性 ............................................. 71 3.3 ShardingSphere 与 Spring 框架 ................................................................................... 78 3.3.1 基于命名空间集成 Spring 框架 ...................................................................... 78 3.3.2 基于自定义 starter 集成 Spring Boot 的实现过程 .............................................. 84 3.4 本章小结 ................................................................................................................. 89 第 4 章 ShardingSphere 数据分片 .......................................................................................... 90 4.1 数据分片的核心概念 ................................................................................................ 90 4.1.1 绑定表与广播表 ........................................................................................... 91 4.1.2 分片策略与分片算法 ..................................................................................... 92 4.1.3 强制路由与 Hint 机制 .................................................................................... 97 4.1.4 分布式主键 .................................................................................................. 99 4.1.5 连接模式 .................................................................................................... 109 4.1.6 分片引擎 .................................................................................................... 110 4.2 数据分片实例分析 .................................................................................................. 117 4.3 分片改造之实现分库 .............................................................................................. 122 4.3.1 初始化数据源 ............................................................................................. 122 4.3.2 设置分库策略 ............................................................................................. 123 4.3.3 设置绑定表与广播表 ................................................................................... 123 4.3.4 设置表分片规则 ......................................................................................... 124 4.4 分片改造之实现分表 .............................................................................................. 126 4.5 分片改造之实现分库+分表 ..................................................................................... 129 4.6 分片改造之实现强制路由 ....................................................................................... 133 4.6.1 HintManager ............................................................................................... 133 4.6.2 实现并配置强制路由分片算法 ..................................................................... 136 4.6.3 基于强制路由访问目标库表 ........................................................................ 137 目录 VII 4.7 本章小结 ............................................................................................................... 140 第 5 章 ShardingSphere 读写分离 ........................................................................................ 141 5.1 读写分离与 ShardingSphere ..................................................................................... 141 5.1.1 读写分离方案 ............................................................................................. 142 5.1.2 配置读写分离 ............................................................................................. 142 5.2 读写分离的基础用法 .............................................................................................. 143 5.2.1 读写分离的使用方法 ................................................................................... 143 5.2.2 MasterSlaveRouter 实现原理 ......................................................................... 145 5.3 读写分离集成数据分片 ........................................................................................... 152 5.3.1 读写分离集成数据分片的实现方法 .............................................................. 153 5.3.2 ShardingMasterSlaveRouter 实现原理 ............................................................ 154 5.4 读写分离集成强制路由 ........................................................................................... 156 5.5 本章小结 ............................................................................................................... 157 第 6 章 ShardingSphere 分布式事务 .................................................................................... 159 6.1 分布式事务的核心概念 ........................................................................................... 159 6.1.1 ShardingSphere 中的分布式事务 ................................................................... 160 6.1.2 XA 强一致性事务实现方案 ......................................................................... 162 6.1.3 BASE 柔性事务实现方案 ............................................................................ 166 6.2 使用 XA 实现两阶段提交事务 ................................................................................. 167 6.2.1 开发环境准备 ............................................................................................. 167 6.2.2 实现 XA 事务 ............................................................................................. 169 6.2.3 XA 事务实现原理 ....................................................................................... 176 6.3 使用 Seata 实现最终一致性事务 .............................................................................. 180 6.3.1 开发环境准备 ............................................................................................. 181 6.3.2 实现 BASE 事务 ......................................................................................... 182 6.3.3 BASE 事务实现原理 ................................................................................... 182 6.4 本章小结 ............................................................................................................... 188 第 7 章 ShardingSphere 数据脱敏 ........................................................................................ 189 7.1 数据脱敏的核心概念 .............................................................................................. 189 7.1.1 敏感数据存储方式 ...................................................................................... 190 7.1.2 敏感数据加解密过程 ................................................................................... 191 7.1.3 业务代码集成数据脱敏 ............................................................................... 191 7.2 数据脱敏的使用方法 .............................................................................................. 193 Apache ShardingSphere 实战 VIII 7.2.1 准备数据脱敏 ............................................................................................. 193 7.2.2 配置数据脱敏 ............................................................................................. 195 7.2.3 执行数据脱敏 ............................................................................................. 203 7.3 本章小结 ............................................................................................................... 204 第 8 章 ShardingSphere 编排治理 ........................................................................................ 205 8.1 编排治理解决方案 .................................................................................................. 205 8.1.1 配置中心 .................................................................................................... 206 8.1.2 注册中心 .................................................................................................... 207 8.1.3 链路跟踪 .................................................................................................... 208 8.2 配置中心的使用方法 .............................................................................................. 210 8.2.1 准备开发环境 ............................................................................................. 210 8.2.2 掌握配置项 ................................................................................................ 211 8.2.3 实现配置中心 ............................................................................................. 213 8.3 注册中心的使用方法 .............................................................................................. 217 8.3.1 通过注册中心构建编排治理服务 .................................................................. 217 8.3.2 使用注册中心实现数据访问熔断 .................................................................. 226 8.4 链路跟踪的使用方法 .............................................................................................. 230 8.4.1 初始化第三方 Tracer 类 ............................................................................... 230 8.4.2 通过 ShardingTracer 获取 Tracer 类 ............................................................... 231 8.4.3 基于 Hook 机制填充 Span ............................................................................ 233 8.5 本章小结 ............................................................................................................... 236 第 9 章 ShardingSphere 代理服务 ........................................................................................ 237 9.1 Sharding-Proxy 的使用方法 ..................................................................................... 237 9.1.1 安装和配置 ................................................................................................ 238 9.1.2 SQL 语句 ................................................................................................... 242 9.1.3 SCTL 语句 ................................................................................................. 245 9.1.4 代码集成 .................................................................................................... 246 9.2 Sharding-Proxy 架构解析 ......................................................................................... 246 9.2.1 Sharding-Proxy 整体架构 ............................................................................. 247 9.2.2 Sharding-Proxy 整合 Sharding-JDBC ............................................................. 256 9.3 本章小结 ............................................................................................................... 259