Apache ShardingSphere学习总结(二)

  |   0 评论   |   0 浏览

Sharding-JDBC

简介

Sharding-JDBC 是当当网研发的开源分布式数据库中间件,从 3.0 开始 Sharding-JDBC

被包含在 Sharding-Sphere 中,之后该项目进入进入 Apache 孵化器,4.0 版本之后的

版本为 Apache 版本。

Sharding-JDBC 是 ShardingSphere 的第一个产品,也是 ShardingSphere 的前身。 它定

位为轻量级 Java 框架,在 Java 的 JDBC 层提供的额外服务。它使用客户端直连数据库,

以 jar 包形式提供服务,无需额外部署和依赖,可理解为增强版的 JDBC 驱动,完全兼容

JDBC 和各种 ORM 框架。

Sharding-JDBC的核心功能为数据分片和读写分离,通过Sharding-JDBC,应用可以透明的使

用jdbc访问已经分库分表、读写分离的多个数据源,而不用关心数据源的数量以及数据如何分

布。

• 适用于任何基于 JDBC 的 ORM 框架,如:JPA, Hibernate, Mybatis, Spring JDBC

Template 或直接使用 JDBC。

• 支持任何第三方的数据库连接池,如:DBCP, C3P0, BoneCP, Druid, HikariCP 等。

• 支持任意实现 JDBC 规范的数据库。目前支持 MySQL,Oracle,SQLServer,

PostgreSQL 以及任何遵循 SQL92 标准的数据库。

创建两张结构相同的表,musk_order_1和musk _order_2,这两张表是订单表拆分后

的表,通过Sharding-Jdbc向订单表插入数据,

按照一定的分片规则,主键为偶数的进入musk _order_1,另一部分数据进入musk

_order_2,通过Sharding-Jdbc 查询数

据,根据 SQL 语句的内容从 musk _order_1 或 musk _order_2 查询数据。

2 创建数据库

在musk_db中创建musk_order_1、musk_order_2表

CREATE DATABASE musk_db CHARACTER SET 'utf8' COLLATE 'utf8_general_ci';

DROP TABLE IF EXISTS musk_order_1;

CREATE TABLE musk_order_1 (

order_id bigint(20) NOT NULL COMMENT '订单id',

price decimal(10, 2) NOT NULL COMMENT '订单价格',

user_id bigint(20) NOT NULL COMMENT '下单用户id',

status varchar(50) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL

COMMENT '订单状态',

PRIMARY KEY (order_id) USING BTREE

) ENGINE = InnoDB CHARACTER SET = utf8 COLLATE = utf8_general_ci ROW_FORMAT =

Dynamic;

DROP TABLE IF EXISTS musk_order_2;

CREATE TABLE musk_order_2 (

order_id bigint(20) NOT NULL COMMENT '订单id',

price decimal(10, 2) NOT NULL COMMENT '订单价格',

user_id bigint(20) NOT NULL COMMENT '下单用户id',

status varchar(50) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL

COMMENT '订单状态',

PRIMARY KEY (order_id) USING BTREE

) ENGINE = InnoDB CHARACTER SET = utf8 COLLATE = utf8_general_ci ROW_FORMAT =Dynamic;

3 创建 SpringBoot 工程引入 maven 依赖

org.apache.shardingsphere

sharding‐jdbc‐spring‐boot‐starter

4.0.0‐RC1

4 创建配置文件编写分片规则

server.port=56081

spring.application.name = sharding‐jdbc‐simple‐demo

server.servlet.context‐path = /sharding‐jdbc‐simple‐demo

spring.http.encoding.enabled = true

spring.http.encoding.charset = UTF‐8

spring.http.encoding.force = true

spring.main.allow‐bean‐definition‐overriding = true

mybatis.configuration.map‐underscore‐to‐camel‐case = true

以下是分片规则配置

定义数据源

spring.shardingsphere.datasource.names = m1

spring.shardingsphere.datasource.m1.type=com.alibaba.druid.pool.DruidDataSource

spring.shardingsphere.datasource.m1.driver‐class‐name = com.mysql.jdbc.Driver

spring.shardingsphere.datasource.m1.url = jdbc:mysql://localhost:3306/musk_db?useUnicode=true

spring.shardingsphere.datasource.m1.username = root

spring.shardingsphere.datasource.m1.password = root

指定t_order表的数据分布情况,配置数据节点

spring.shardingsphere.sharding.tables.t_order.actual‐data‐nodes = m1.musk_order_$‐>{1..2}

指定t_order表的主键生成策略为SNOWFLAKE

spring.shardingsphere.sharding.tables.t_order.key‐generator.column=order_id

spring.shardingsphere.sharding.tables.t_order.key‐generator.type=SNOWFLAKE

指定t_order表的分片策略,分片策略包括分片键和分片算法

spring.shardingsphere.sharding.tables.t_order.table‐strategy.inline.sharding‐column = order_id

spring.shardingsphere.sharding.tables.t_order.table‐strategy.inline.algorithm‐expression =

musk order$‐>{order_id % 2 + 1}

打开sql输出日志

spring.shardingsphere.props.sql.show = true

swagger.enable = true

logging.level.root = info

logging.level.org.springframework.web = info

logging.level.com.itheima.dbsharding = debug

logging.level.druid.sql = debug

1.首先定义数据源m1,并对m1进行实际的参数配置。

2.指定atguigu _order表的数据分布情况,他分布在m1. musk _order_1,m1. musk_order_2

3.指定musk_order表的主键生成策略为SNOWFLAKE,SNOWFLAKE是一种分布式自增算法,保证id全局唯一

4.定义musk _order分片策略,order_id为偶数的数据落在musk_order_1,为奇数

的落在musk_order_2,分表策略的表达式为 musk order$->{order_id % 2 + 1}

5 编写程序,循环向表里面添加数据,查看最终的效果

6 执行流程分析

(1)解析sql,获取片键值,在本例中是order_id

(2)Sharding-JDBC通过规则配置 musk_order_$->{order_id % 2 + 1},知道了当order_id

为偶数时,应该往

musk_order_1表插数据,为奇数时,往t_order_2插数据。

(3)于是Sharding-JDBC根据order_id的值改写sql语句,改写后的SQL语句是真实所要执行的

SQL语句。

(4)执行改写后的真实sql语句

(5)将所有真正执行 sql 的结果进行汇总合并,返回。

6 其他整合方式介绍

3 水平分库

水平分库是把同一个表的数据按一定规则拆到不同的数据库中,每个库可以放在不同的服务器

上。接下来看一下如何使用Sharding-JDBC实现水平分库,咱们继续对快速入门中的例子进行

完善。

(1)将原有数据库拆分为order_db_1、order_db_2

(2)分片规则修改

由于数据库拆分了两个,这里需要配置两个数据源。

分库需要配置分库的策略,和分表策略的意义类似,通过分库策略实现数据操作针对分库的数

据库进行操作。

定义多个数据源

spring.shardingsphere.datasource.names = m1,m2

spring.shardingsphere.datasource.m1.type = com.alibaba.druid.pool.DruidDataSource

spring.shardingsphere.datasource.m1.driver‐class‐name = com.mysql.jdbc.Driver

spring.shardingsphere.datasource.m1.url=jdbc:mysql://localhost:3306/order_db_1?useUnicode=true

spring.shardingsphere.datasource.m1.username = root

spring.shardingsphere.datasource.m1.password = root

spring.shardingsphere.datasource.m2.type = com.alibaba.druid.pool.DruidDataSource

spring.shardingsphere.datasource.m2.driver‐class‐name = com.mysql.jdbc.Driver

spring.shardingsphere.datasource.m2.url=jdbc:mysql://localhost:3306/order_db_2?useUnicode=true

spring.shardingsphere.datasource.m2.username = root

spring.shardingsphere.datasource.m2.password = root

分库策略,以user_id为分片键,分片策略为user_id % 2 + 1,user_id为偶数操作m1数据源,否则

操作m2。

spring.shardingsphere.sharding.tables.t_order.database‐strategy.inline.sharding‐column = user_id

spring.shardingsphere.sharding.

分库策略定义方式解析:

#分库策略,如何将一个逻辑表映射到多个数据源

spring.shardingsphere.sharding.tables.<逻辑表名称>.database‐strategy.<分片策略>.<分片

策略属性名>= #

分片策略属性值

#分表策略,如何将一个逻辑表映射为多个实际表

spring.shardingsphere.

Sharding-JDBC支持以下几种分片策略:

不管理分库还是分表,策略基本一样。

standard:标准分片策略,对应StandardShardingStrategy。提供对SQL语句中的=, IN和

BETWEEN AND的分片操作支持。StandardShardingStrategy只支持单分片键,提供PreciseShardingAlgorithm

和RangeShardingAlgorithm两个分片算法。PreciseShardingAlgorithm是必选的,用于处理=和

IN的分片。

RangeShardingAlgorithm是可选的,用于处理BETWEEN AND分片,如果不配置RangeShardingAlgorithm,SQL中的BETWEEN AND将按照全库路由处理。

complex:符合分片策略,对应ComplexShardingStrategy。复合分片策略。提供对SQL语句中

的=, IN和BETWEEN AND的分片操作支持。ComplexShardingStrategy支持多分片键,由于多分片键之

间的关系复杂,因此并未进行过多的封装,而是直接将分片键值组合以及分片操作符透传至分片算法,完

全由应用开发者实现,提供最大的灵活度。

inline:行表达式分片策略,对应InlineShardingStrategy。使用Groovy的表达式,提供对SQL

语句中的=和IN的分片操作支持,只支持单分片键。对于简单的分片算法,可以通过简单的配置使用,从而

避免繁琐的Java代码开发,如: t_user_$->{u_id % 8} 表示t_user表根据u_id模8,而分成8张表,表名称为

t_user_0 到t_user_7 。

hint:Hint分片策略,对应HintShardingStrategy。通过Hint而非SQL解析的方式分片的策略。

对于分片字段非SQL决定,而由其他外置条件决定的场景,可使用SQL Hint灵活的注入分片字段。例:内部系统,按照员工登录主键分库,而数据库中并无此字段。SQL Hint支持通过Java API和SQL注释(待实现)两种方式使用。

none:不分片策略,对应 NoneShardingStrategy。不分片的策略。


标题:Apache ShardingSphere学习总结(二)
作者:gao1feng
地址:http://gao1feng.top/articles/2020/07/12/1594564746232.html