1、分库配置
spring:
autoconfigure:
exclude: com.alibaba.druid.spring.boot.autoconfigure.DruidDataSourceAutoConfigure
datasource:
type: com.alibaba.druid.pool.DruidDataSource
druid:
stat-view-servlet:
enabled: true
# 设置白名单,不填则允许所有访问
allow:
url-pattern: /druid/*
loginUsername:
loginPassword:
web-stat-filter:
enabled: true
filter:
stat:
enabled: true
# 慢SQL记录
log-slow-sql: true
slow-sql-millis: 1000
merge-sql: true
wall:
config:
multi-statement-allow: true
shardingsphere:
mode:
type: Standalone
repository:
type: JDBC
# 配置多个数据源
datasource:
names: ds0,ds1
# 配置第一个数据源
ds0:
type: com.alibaba.druid.pool.DruidDataSource
driver-class-name: com.mysql.jdbc.Driver
url: jdbc:mysql://192.168.67.155:3306/sharding-test-01?serverTimezone=UTC&useSSL=false&allowPublicKeyRetrieval=true
username: root
password: abc_123
# 配置第二个数据源
ds1:
type: com.alibaba.druid.pool.DruidDataSource
driver-class-name: com.mysql.jdbc.Driver
url: jdbc:mysql://192.168.67.155:3306/sharding-test-02?serverTimezone=UTC&useSSL=false&allowPublicKeyRetrieval=true
username: root
password: abc_123
rules:
sharding:
tables:
shoping:
# ds$->{0..1}表示ds0、ds1,也可以这么写ds$->{['0','1']},也可以组合使用ds$->{['0','1']}.shoping_0$->{0..1}
# 声明商品表所在的真实数据节点(这里先写死表名,便于测试)
actual-data-nodes: ds$->{0..1}.shoping_00
# 配置分库规则
database-strategy:
standard:
# 配置路由键为shoping_id(数据库中的列名)
sharding-column: shoping_id
# 配置分片算法(需要配置一个名词,通过别名指向具体的策略,db-inline-mod为别名)
sharding-algorithm-name: db-inline-mod
sharding-algorithms:
# 配置前面的分库算法
db-inline-mod:
# 声明是 INLINE 简单类型的分片
type: inline
props:
# 选择对 shoping_id 做取模运算
algorithm-expression: ds$->{shoping_id % 2}
# 取模算法也可以使用Sharding-Sphere内置的取模算法,官方内置了取模、哈希取模、时间范围、数据范围、容量范围等多种简单的分片算法,取模算法如下
# type: mod
# props:
# sharding-count: 2 # 声明分库的节点数量
props:
sql-show: true
2、分库分表配置
在分库基础上,增加分表规则、分表算法
rules:
sharding:
tables:
shoping:
# ds$->{0..1}表示ds0、ds1,也可以这么写ds$->{['0','1']},也可以组合使用ds$->{['0','1']}.shoping_0$->{0..1}
# 分库
actual-data-nodes: ds$->{0..1}.shoping_0$->{0..1}
# 配置分库规则
database-strategy:
standard:
# 配置路由键为shoping_id(数据库中的列名)
sharding-column: shoping_id
# 配置分片算法(需要配置一个名词,通过别名指向具体的策略,db-inline-mod为别名)
sharding-algorithm-name: db-inline-mod
# 配置分表规则
table-strategy:
standard:
# 配置分表的路由键:商品名称
sharding-column: shoping_name
sharding-algorithm-name: key-hash-mod
sharding-algorithms:
# 配置前面的分库算法
db-inline-mod:
# 声明是 INLINE 简单类型的分片
type: inline
props:
# 选择对 shoping_id 做取模运算
algorithm-expression: ds$->{shoping_id % 2}
# 配置前面的分表算法
key-hash-mod:
# 针对非数值类型字段作为分片键,mod取模是针对数值类型字段
type: hash_mod
props:
# 声明分表的节点数量
sharding-count: 2
3、使用雪花算法作为分布式主键唯一id
rules:
sharding:
tables:
shoping:
# ds$->{0..1}表示ds0、ds1,也可以这么写ds$->{['0','1']},也可以组合使用ds$->{['0','1']}.shoping_0$->{0..1}
# 分库
actual-data-nodes: ds$->{0..1}.shoping_0$->{0..1}
# 配置分库规则
database-strategy:
standard:
# 配置路由键为shoping_id(数据库中的列名)
sharding-column: shoping_id
# 配置分片算法(需要配置一个名词,通过别名指向具体的策略,db-inline-mod为别名)
sharding-algorithm-name: db-inline-mod
# 配置分表规则
table-strategy:
standard:
# 配置分表的路由键:商品名称
sharding-column: shoping_name
# 配置分片算法(需要配置一个名词,通过别名指向具体的策略,key-hash-mod为别名)
sharding-algorithm-name: key-hash-mod
# 配置shoping表的主键生成策略
key-generate-strategy:
# 声明主键为shoping_id
column: shoping_id
# 主键生成策略(需要配置一个名词,通过别名指向具体的策略,global-id-snowflake为别名)
key-generator-name: global-id-snowflake
sharding-algorithms:
# 配置前面的分库算法
db-inline-mod:
# 声明是 INLINE 简单类型的分片
type: inline
props:
# 选择对 shoping_id 做取模运算
algorithm-expression: ds$->{shoping_id % 2}
# 配置前面的分表算法
key-hash-mod:
type: hash_mod
props:
# 声明分表的节点数量
sharding-count: 2
key-generators:
# 配置上面的主键生成策略
global-id-snowflake:
# 选择使用内置的雪花算法
type: snowflake
props:
# 分配一个工作节点id(确保全局唯一)
worker-id: 111
4、绑定表
使关联数据落在同一个数据库中(有主外键关系情况下,按照传统的分片规则,对两张表的数据做分发,这就很有可能导致一笔订单记录中,多笔订单详情记录被分发到不同的节点中存储,当需要通过关联订单表、订单详情表查询某笔订单数据时,就会出现跨库查询的情况)
rules:
sharding:
tables:
# 配置订单表的分片策略
orders:
# 声明订单表所在的真实数据节点(ds0.orders、ds1.orders)
actual-data-nodes: ds$->{0..1}.orders
# 配置分库规则
database-strategy:
standard:
# 配置路由键为order_id(数据库中列名)
sharding-column: order_id
# 配置分片算法(使用内置的取模分片算法)
sharding-algorithm-name: key-hash-mod
# 配置订单表的主键生成策略
key-generate-strategy:
# 声明主键为order_id
column: order_id
# 使用雪花算法
keygenerator-name: global-id-snowflake
# 配置订单详情表的分片策略
order_info:
# 声明商品详情表所在的真实数据节点(ds0.order_info、ds1.order_info)
actual-data-nodes: ds$->{0..1}.order_info
# 配置分库规则
database-strategy:
standard:
# 配置路由键为order_id(这里的路由键要和订单表order的路由键一致)
sharding-column: order_id
# 配置分片算法(使用内置的取模分片算法)
sharding-algorithm-name: key-hash-mod
# 配置订单详情表的主键生成策略
key-generate-strategy:
# 声明主键为order_info_id(列名)
column: order_info_id
# 使用雪花算法
keygenerator-name: global-id-snowflake
# 配置绑定关系
binding-tables:
# 配置第一组绑定表的关系(订单表和订单详情表)
- orders,order_info
sharding-algorithms:
# 配置算法
key-hash-mod:
# 使用内置取模算法(使用的order_id作为路由键且此键为雪花算法生成的数值类型id,非数值类型路由键使用hash_mod)
type: mod
props:
sharding-count: 2
key-generators:
# 配置上面的主键生成策略
global-id-snowflake:
# 选择使用内置的雪花算法
type: snowflake
props:
# 分配一个工作节点id(确保全局唯一,微服务不同节点设为不同数值)
worker-id: 1
5、广播表
主要是针对于一些所有库中都会用到的字典表使用的,例如系统菜单表、地区表、民族表、国籍表、职级表等,这种类型的表在所有库中经常被用于关联查询,配置广播表可以对此类数据表进行的所有变更操作,都会落到所有数据节点,不需要指定数据分片策略。
rules:
sharding:
tables:
# 配置用户详情表的分片策略
user_info:
# 声明用户详情表所在的真实数据节点(ds0.user_info、ds1_user_info)
actual-data-nodes: ds$->{0..1}.user_info
# 配置用户详情表的主键生成策略
key-generate-strategy:
# 声明主键 user_id
column: user_id
# 使用内置雪花算法
key-generator-name: global-id-snowflake
# 配置广播表信息
broadcast-tables:
- user_info
key-generators:
# 配置上面的主键生成策略
global-id-snowflake:
# 选择使用内置的雪花算法
type: snowflake
props:
# 分配一个工作节点id(确保全局唯一)
worker-id: 1
文章评论