您当前的位置: 首页 >  ar

Charge8

暂无认证

  • 3浏览

    0关注

    447博文

    0收益

  • 0浏览

    0点赞

    0打赏

    0留言

私信
关注
热门博文

ShardingSphere简介与分表使用

Charge8 发布时间:2022-04-16 22:59:51 ,浏览量:3

一、ShardingSphere简介 1、简介

ShardingSphere 已于 2020 年 4 月 16 日成为 Apache 软件基金会的顶级项目。

ShardingSphere 是一套开源的分布式数据库中间件解决方案。

ShardingSphere 产品定位为 Database Plus,旨在构建异构数据库上层的标准和生态圈。

它关注如何充分合理地利用数据库的计算和存储能力,而并非实现一个全新的数据库。

ShardingSphere 站在数据库的上层视角,关注他们之间的协作多于数据库自身。

它由ShardingSphere-JDBC、ShardingSphere-Proxy 和 ShardingSphere-Sidecar这3款相互独立的产品组成。

  • ShardingSphere-JDBC:定位为轻量级 Java 框架,在 Java 的 JDBC 层提供的额外服务。
  • ShardingSphere-Proxy:定位为透明化的数据库代理端,提供封装了数据库二进制协议的服务端版本,用于完成对异构语言的支持。
  • ShardingSphere-Sidecar:定位为 Kubernetes 的云原生数据库代理,以 Sidecar 的形式代理所有对数据库的访问。
2、核心概念 2.1 表概念

1)真实表

在数据库中真实存在的物理表。例如:t_order_0、t_order_1

2)逻辑表

在分片之后,同一类表结构的名称(总成)。例如b_order。

水平拆分的数据库(表)的相同逻辑和数据结构表的总称。例如:订单表根据主键尾数拆分为10张真实表(t_order_0到t_order_9),他们的逻辑表名为t_order。

3)数据节点

在分片之后,由数据源和数据表组成。例如ds0.b_order1

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

4)绑定表 指的是分片规则一致的关系表(主表、子表)。

例如:t_order表和t_order_item表,均按照order_id分片,则此两张表互为绑定表关系。绑定表之间的多表关联查询不会出现笛卡尔积关联,关联查询效率将大大提升。

举例说明,如果SQL为:

SELECT i.* FROM t_order o JOIN t_order_item i ON o.order_id=i.order_id WHERE o.order_id in (10, 11);

在不配置绑定表关系时,假设分片键order_id将数值10路由至第0片,将数值11路由至第1片,那么路由后的SQL应该为4条,它们呈现为笛卡尔积:

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_0 o JOIN t_order_item_1 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_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);

在配置绑定表关系后,路由的SQL应该为2条:

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的条件。故绑定表之间的分区键要完全相同。

5)广播表

广播表是指所有的分片数据源中都存在的表,表结构和表中的数据在每个数据库中均完全一致。

适用于数据量不大且需要与海量数据的表进行关联查询的场景,这些表没必要做分片。

例如:例如字典表、省份信息等,因为他们数据量不大,而且这种表可能需要与海量数据的表进行关联查询。

2.2 分片概念

1)分片键 用于分片的数据库字段,是将数据库(表)水平拆分的关键字段。

例如:将订单表中的订单主键的尾数取模分片,则订单主键为分片字段。 SQL中如果无分片字段,将执行全路由,性能较差。 除了对单分片字段的支持,ShardingSphere也支持根据多个字段进行分片。

2)分片算法 通过分片算法(ShardingAlgorithm)将数据分片,支持通过=、>=、、、=、{1..2} # 指定表的主键生成策略,雪花算法 spring.shardingsphere.sharding.tables.course.key-generator.column=id spring.shardingsphere.sharding.tables.course.key-generator.type=SNOWFLAKE spring.shardingsphere.sharding.tables.course.key-generator.props.worker.id=1 ##指定分片策略,约定id值为偶数添加到 course_1表,奇数添加到 course_2表。 #表策略 spring.shardingsphere.sharding.tables.course.table-strategy.inline.sharding-column=id spring.shardingsphere.sharding.tables.course.table-strategy.inline.algorithm-expression=course_$->{id%2+1} # 打开shardingsphere的sql日志输出。 spring.shardingsphere.props.sql.show=true spring.main.allow-bean-definition-overriding=true 4、测试代码

1) 保存

    @Test
    public void testSave() throws InterruptedException {
        for (int i = 0; i  System.out.println(course));
    }

在这里插入图片描述

因为使用的是 行表达式分片策略(inline),只支持分片键的=与IN进行分片的场景

wrapper.between(“id”, 1513890338544734210L, 1513890342613209090L);

在这里插入图片描述

到此,ShardingSphere简单使用就算入门了。

参考文章:

  • ShardingSphere官方网址:https://shardingsphere.apache.org/document/current/cn/overview/
  • ShardingSphere基本介绍及核心概念:https://blog.csdn.net/Kiven_ch/article/details/119087048

– 求知若饥,虚心若愚。

关注
打赏
1664721914
查看更多评论
立即登录/注册

微信扫码登录

0.0398s