ShardingSphere从软件层面对硬件资源进行管理,从而对数据库进行横向扩展,但同时也带来了一些问题。
可以直接使用一些原生支持分布式或动态扩展的数据库进行替代(对使用分库分表的选择必须要慎重)。

数据分片

垂直分片:按照业务的方式进行拆分;核心理念是专库专用(按照业务将数据表分散到不同的数据库中)

水平分片:横向拆分(通过某些规则将数据分散至多个库或表中)

概念

SQL

水平拆分示例:订单实体order对应表名为t_order,拆分为t_order_0t_order_9共10张表

  • 逻辑表:水平拆分的数据库(表)的相同逻辑和数据结构表的总称。示例中的t_order

  • 真实表:在分片的数据库中真实存在的物理表。示例中的t_order_0t_order_9

  • 数据节点:数据分片的最小单元,由数据源名称和数据表组成。示例中的ds_0.t_order_0

  • 绑定表:分片规则一致的主表和子表。如t_ordert_order_item都按照order_id分片,此两张表互为绑定表关系
    (绑定表之间的多表关联查询不会出现笛卡尔积关联,关联查询效率将大大提升)

    SELECT i.* FROM t_order_0 o JOIN t_order_item_0 i ON o.order_id=i.order_id WHERE o.order_id in (10, 11); SELECT i.* FROM t_order_1 o JOIN t_order_item_1 i ON o.order_id=i.order_id WHERE o.order_id in (10, 11);

    t_order在FROM的最左侧,ShardingSphere将会以它作为整个绑定表的主表。 所有路由计算将会只使用主表的策略,那么t_order_item表的分片计算将会使用t_order的条件

  • 广播表:所有的分片数据源中都存在的表,表结构和表中的数据在每个数据库中都完全一致。适用于数据量不大且需要与海量数据的表进行关联查询的场景。例:字典表

分片

分片键

用于分片的数据库字段,是将数据库(表)水平拆分的关键字段;
SQL中如果无分片字段,将执行全路由,性能较差;
除了单分片字段,ShardingSphere也支持根据多个字段进行分片。

分片算法

通过分片算法将数据分片,支持通过=>=<=><BETWEENIN分片;
分片算法需要自行实现;
目前提供四种分片算法(由于算法实现与业务相关,并未内置分片算法,而是通过分片策略提炼各种场景,提供更高层级的抽象,由开发者自行实现)

  • 精确分片算法

    对应PreciseShardingAlgorithm,用于处理使用单一键作为分片键=IN进行分片的场景;
    需配合StandardShardingStrategy使用

  • 范围分片算法

    对应RangeShardingAlgorithm,用于处理使用单一键作为分片键BETWEEN AND><>=<=进行分片的场景;
    需配合StandardShardingStrategy使用

  • 符合分片算法

    对应ComplexKeysShardingAlgorithm,用于处理使用多键作为分片键进行分片的场景,包含多个分片键的逻辑较复杂,需要开发者自行处理复杂度;
    需配合ComplexShardingStrategy使用

  • Hint分片算法

    对应HintShardingAlgorithm,用于处理使用Hint进行分片的场景;
    需配合HintShardingStrategy使用

分片策略

包含分片键分片算法,由于算法的独立性,将其独立抽离。真正可用于分片操作的是分片键+分片算法,即分片策略,分为5种:

  • 标准分片策略

    1. 对应StandardShardingStrategy。提供对SQL中的=><>=<=INBETWEEN AND的分片操作支持;
    2. 只支持单分片键,提供PreciseShardingAlgorithmRangeShardingAlgorithm两个分片算法;
    3. PreciseShardingAlgorithm必选,用于处理=IN的分片
    4. RangeShardingAlgorithm可选,用于处理><>=<=BETWEEN AND
    5. 如果不配置RangeShardingAlgorithmSQL中的BETWEEN AND将按照全库路由处理
  • 复合分片策略

    1. 对应ComplexShardingStrategy,提供对SQL语句中的=,>, <, >=, <=, INBETWEEN AND的分片操作支持
    2. 支持多分片键(直接将分片键值组合以及分片操作符透传至分片算法,由开发者自行实现)
  • 行表达式分片策略

    1. 对应InlineShardingStrategy,使用Groovy表达式,提供对SQL语句中的=IN的分片操作支持
    2. 只支持单分片键
    3. 可以通过简单的配置使用
      (例:t_user_$->{u_id % 8}表示t_user表根据u_id8,而分成8张表,表名称为t_user_0t_user_7
  • Hint分片策略

    对应HintShardingStrategy。通过Hint指定分片值而非从SQL中提取分片值的方式进行分片的策略

  • 不分片策略

    对应NoneShardingStrategy。不分片的策略

SQL Hint

对于分片字段为SQL字段,而是其他外置条件的场景,可使用SQL Hint灵活的注入分片字段
SQL Hint支持通过Java APISQL注释(待实现)两种方式使用

配置

分片规则

总入口,包含数据源配置、表配置、绑定表配置及读写分离配置等

数据源配置

真实数据源列表

表配置

逻辑表名称、数据节点与分表规则的配置

数据节点配置

配置逻辑表与真实表的映射关系。分为均匀分布自定义分布两种方式

  • 均匀分布:数据表在每个数据源内呈现均匀分布的态势
  • 自定义分布:数据表呈现有特定规则的分布
## 均匀分布
db0├── t_order0 └── t_order1
db1├── t_order0 └── t_order1
#  数据节点配置:db0.t_order0, db0.t_order1, db1.t_order0, db1.t_order1
## 自定义分布
db0├── t_order0 └── t_order1
db1├── t_order2├── t_order3└── t_order4#  数据节点配置:db0.t_order0, db0.t_order1, db1.t_order2, db1.t_order3, db1.t_order4

分片策略配置

  • 数据源分片策略:对应DatabaseShardingStrategy,配置数据被分配的目标数据源
  • 表分片策略:对应TableShardingStrategy,配置数据被分配的目标表
    (目标表存在于该数据的目标数据源内,故表分片策略依赖于数据源分片策略

两种策略API完全相同

自增主键生成策略

客户端生成自增主键替换数据库原生的自增主键,做到分布式主键无重复

内核剖析

核心由SQL解析 => 执行器优化 => SQL路由 => SQL改写 => SQL执行 => 结果归并流程组成

  • SQL解析:分为词法解析语法解析
    先通过词法解析器将SQL拆分为一个个不可再分的单词。再使用语法解析器对SQL进行理解,并最终提炼出解析上下文
    解析上下文包括表、选择项、排序项、分组项、聚合函数、分页信息、查询条件以及可能需要修改的占位符的标记
  • 执行器优化:合并和优化分片条件,如OR
  • SQL路由:根据解析上下文匹配用户配置的分片策略,并生成路由路径。目前支持分片路由和广播路由
  • SQL改写:将SQL改写为在真实数据库中可以正确执行的语句。SQL改写分为正确性改写和优化改写
  • SQL执行:多线程执行器异步执行
  • 结果归并:将多个执行结果集归并以便于通过统一的JDBC接口输出
    包括流式归并、内存归并和使用装饰者模式的追加归并

这里只是记录了典型的ShardingJDBC使用相关的配置,仅仅是对于了解ShardingJDBC如何使用的一个入门,更深入的配置及原理部分,可以直接参考官方文档

ShardingSphere使用(一)相关推荐

  1. GitHub标星10,000+,Apache项目ShardingSphere的开源之路

    [编者按]几天前,当 GitHub 全球产品技术生态总经理 Michael Francisco 谈到中国开发者已经成为 GitHub 上最活跃的群体时,有开发者提出数量之后质量也要跟上.的确,过去十数 ...

  2. 重磅!分布式数据库解决方案Apache ShardingSphere毕业成为顶级项目

    点击上方"方志朋",选择"设为星标" 回复"666"获取新整理的面试文章 全球最大的开源软件基金会 Apache 软件基金会(以下简称 Ap ...

  3. 快讯!Sharding-Sphere正式进入Apache孵化器

    美国时间2018年11月10日,开源分布式数据库中间件生态圈Sharding-Sphere正式进入Apache基金会孵化器. 根据Apache基金会邮件列表显示,7个约束性(binding votes ...

  4. 分布式数据库解决方案Apache ShardingSphere毕业成为顶级项目

    点击上方蓝色"程序猿DD",选择"设为星标" 回复"资源"获取独家整理的学习资料! 来源 | 公众号「ShardingSphere官微」 全 ...

  5. 分库分表 springboot+dubbo+mybatisPlus+shardingSphere

    1.使用的框架有 springboot 2.1.1 + apache dubbo 2.7.2+ mybatisPlus 3.1.0 +shardingSphere 4.1.0 数据库连接池:Hikar ...

  6. 从中间件到分布式数据库生态,ShardingSphere 5.x革新变旧

    距离最后一个 4.x 版本的发布时间已半年有余,在此期间, Apache ShardingSphere 社区对产品不断的打磨和优化,并在刚刚过去的双十一前夕发布了其 5.x 的首个版本-- 5.0.0 ...

  7. ShardingSphere 系列

    ShardingSphere 系列 本篇为目录,点击蓝色字体可查看详情. 1.ShardingSphere基本概念 2.ShardingSphere 之 Sharding-JDBC实现水平分表 3.S ...

  8. 6、ShardingSphere 之 读写分离

    文章目录 1 读写分离原理 2 Mysql 配置主从复制 2.1 创建2个Mysql 数据库服务,并启动两个Mysql服务 2.2 配置Master库的/etc/my.cnf 2.3 配置Slave库 ...

  9. 5、ShardingSphere 之 公共表

    文章目录 1 公共表 2 在多个数据库中创建公共表 2.1 edudb1库中t_dict 2.2 edudb2库中t_dict 2.3 userdb库中t_dict 3 创建po 4 创建mapper ...

  10. 4、ShardingSphere 之 Sharding-JDBC 实现垂直分库

    1 实现垂直分库,专库专表 实现目标,用户查询用户信息的时候,只操作user_db中t_user表 2 创建数据库 CREATE SCHEMA `userdb` DEFAULT CHARACTER S ...

最新文章

  1. 2022年斯坦福AI Index公布:中美主导跨国研究,专利、投资金额暴增
  2. 看小说有广告?不可能的,分分钟教你爬取小说
  3. 018:Django商城部署和数据库读写分离
  4. 我使用过的Linux命令之clear - 清除终端屏幕,不是cls
  5. Linux设置tab4个字符,在 Vim 中设置 Tab 为4个空格
  6. MySQL 定时备份数据库(非常全),值得收藏!
  7. Root手机后有什么好处吗?我应该如何Root自己的手机?
  8. Kuangbin专题八生成树
  9. php网页制作过程,网页制作步骤
  10. java中随机点名器的简单程序
  11. 震惊!为了家人请不要这样对待自己的身体!
  12. Java编程的三个就业方向有哪些
  13. 单片机 c语言 p1控制流水灯,单片机控制的流水灯程序
  14. 背光源中LED的散热问题
  15. 【OpenGL ES】着色器Shader与程序Program
  16. 写给理工科人看的乐理(五)调性
  17. RE-实验吧分道扬镳/Just Click
  18. 使用dos命令校验MD5值
  19. 程序员不爱读书,但这很不明智
  20. 利用css的rotate()做一个3d旋转图集

热门文章

  1. 乐鑫 ESP32-H2 SoC 与 Thread SDK 通过 Thread 1.3.0 认证
  2. 二段式FPGA的状态机
  3. 求解作业车间调度问题的改进遗传算法
  4. 【转】如何管理PDF书签:Foxit、PDF XChange、PDF补丁丁
  5. java8 新特性精心整理(全)——新 Date/Time API
  6. 获取 COM 服务器进程 ID 的 3 种方法
  7. 《计算机网络》day03-计算机网络的体系结构
  8. QQ群78928780记录整理:90521-精华
  9. 值得收藏!国外最佳互联网安全博客TOP 30
  10. 免费网络电话App 传统通信破冰者