稷然如此

  • 首页
  • 文章分类
    • AI
    • Android
    • Java
    • Shell
    • Vue
    • C#
    • Python
    • 数据库
    • 组件
    • 其他
    • Game
  • 常用命令
    • Docker
    • Git
    • Linux
  • 操作系统
    • CentOS
    • Ubuntu
    • Windows
    • Kylin
  • 工具
    • IntelliJ IDEA
    • Visual Studio Code
稷然如此
不积跬步,无以至千里
  1. 首页
  2. 文章分类
  3. Java
  4. 正文

Sharding-Sphere 分库分表

2023年7月11日 699点热度 0人点赞

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
标签: Sharding Sharding-Sphere Sphere 分库 分库分表 分表
最后更新:2023年7月11日

Akim

犇 骉 Java、C#、Python、Go、Android、MiniProgram、Bootstrap、Vue2

点赞
< 上一篇
下一篇 >
文章目录
  • 1、分库配置
  • 2、分库分表配置
  • 3、使用雪花算法作为分布式主键唯一id
  • 4、绑定表
  • 5、广播表

Copyright © 2025 aianran.com All Rights Reserved.

免责申明 | 隐私政策 | 服务条款 | 关于我们

黔ICP备2023008200号-1

贵公网安备 52010202003594号