官网地址: https://shardingsphere.apache.org/index_zh.html
本文采用Sharding-proxy代理方式进行分库分表
Sharding-proxy官网手册地址
架构图:
Sharding-Proxy支持
多逻辑数据源
,每个以config-前缀命名的yaml配置文件,即为一个逻辑数据源
。以下是config-xxx.yaml的配置配置示例。
其他的也一样,看官网
官网配置说明:
schemaName: sharding_db
dataSources: #定义数据源
ds0: #数据源1
url: jdbc:postgresql://localhost:5432/ds0
username: root
password:
connectionTimeoutMilliseconds: 30000
idleTimeoutMilliseconds: 60000
maxLifetimeMilliseconds: 1800000
maxPoolSize: 65
ds1: #数据源2
url: jdbc:postgresql://localhost:5432/ds1
username: root
password:
connectionTimeoutMilliseconds: 30000
idleTimeoutMilliseconds: 60000
maxLifetimeMilliseconds: 1800000
maxPoolSize: 65
shardingRule: #配置分片规则
tables:
t_order: #需要分片的表-订单表
# 真实数据节点。 ds${0..1}.t_order${0..1} 表示 分成2个库ds0,ds1,2张表t_order0,t_order1
actualDataNodes: ds${0..1}.t_order${0..1}
databaseStrategy:#数据库的分库策略
inline:
shardingColumn: user_id #按 user_id 这一列来分
algorithmExpression: ds${user_id % 2} #指定算法 user_id对2取余,余数0取ds0库,余数1取ds1库
tableStrategy: #分表策略
inline:
shardingColumn: order_id #用order_id 这个列来分
algorithmExpression: t_order${order_id % 2} # 指定算法
keyGenerator: #id自动生成
type: SNOWFLAKE # 雪花算法
column: order_id #雪花算法的id存在order_id
t_order_item: #需要分片的表-订单项表
actualDataNodes: ds${0..1}.t_order_item${0..1}
databaseStrategy:
inline:
shardingColumn: user_id
algorithmExpression: ds${user_id % 2}
tableStrategy:
inline:
shardingColumn: order_id
algorithmExpression: t_order_item${order_id % 2}
keyGenerator:
type: SNOWFLAKE
column: order_item_id
bindingTables:#指定关联表
- t_order,t_order_item
defaultTableStrategy: #默认分表规则
none:
4.0版本需要引入
server.yaml
#服务治理模块的配置
#orchestration:
# name: orchestration_ds
# overwrite: true
# registry:
# type: zookeeper
# serverLists: localhost:2181
# namespace: orchestration
#
#配置2个用户 用户1[账号密码都是:root] 用户2[账号密码都是:sharding]
authentication:
users:
root:
password: root
sharding:
password: sharding
#用户sharding的权限只能操作 sharding_db
authorizedSchemas: sharding_db
#配置属性 线程数、sql打印、最大连接...
props:
# max.connections.size.per.query: 1
acceptor.size: 16
executor.size: 16
# proxy.frontend.flush.threshold: 128 # The default value is 128.
# # LOCAL: Proxy will run with LOCAL transaction.
# # XA: Proxy will run with XA transaction.
# # BASE: Proxy will run with B.A.S.E transaction.
# proxy.transaction.type: LOCAL
# proxy.opentracing.enabled: false
# query.with.cipher.column: true
sql.show: false
config-sharding.yaml
######################################################################################################
#
# If you want to connect to MySQL, you should manually copy MySQL driver to lib directory.
#
######################################################################################################
#数据库名称-随便叫【前提环境MySQL主从同步的配置已经搞好了】
schemaName: sharding_db
#配置数据源
dataSources:
ds_0: #第一个主mysql,连接 demo_ds_0库
url: jdbc:mysql://192.168.56.10:3307/demo_ds_0?serverTimezone=UTC&useSSL=false
username: root
password: root
connectionTimeoutMilliseconds: 30000
idleTimeoutMilliseconds: 60000
maxLifetimeMilliseconds: 1800000
maxPoolSize: 50
ds_1: #第2个主mysql[因为没搞第二个主,就连同一个主了] 连接 demo_ds_1 库
url: jdbc:mysql://192.168.56.10:3307/demo_ds_1?serverTimezone=UTC&useSSL=false
username: root
password: root
connectionTimeoutMilliseconds: 30000
idleTimeoutMilliseconds: 60000
maxLifetimeMilliseconds: 1800000
maxPoolSize: 50
#==============================================
#定义规则
shardingRule:
tables:
#订单表
t_order:
# ds_${0..1}和上面配置的数据源(ds_0,ds_1)对应。表划分成t_order_1、t_order_2 ,一个库里面2张表
actualDataNodes: ds_${0..1}.t_order_${0..1}
# 分表策略
tableStrategy:
inline:
# 用order_id来分表
shardingColumn: order_id
# 算法->求余
algorithmExpression: t_order_${order_id % 2}
# order_id生成的算法,用雪花算法
keyGenerator:
type: SNOWFLAKE
column: order_id
#-------------------------
#订单项表
t_order_item:
#分成2个库,2张表
actualDataNodes: ds_${0..1}.t_order_item_${0..1}
#指定分表策略
tableStrategy:
inline:
#用order_id来分
shardingColumn: order_id
#算法-->求余
algorithmExpression: t_order_item_${order_id % 2}
# order_item_id 自动生成用雪花算法
keyGenerator:
type: SNOWFLAKE
column: order_item_id
#-------------------------
#绑定表(表有关系)-好处:省得跨库找,不会产生笛卡儿积,速度快,效率高
bindingTables:
- t_order,t_order_item
#-------------------------
#数据库策略-分库策略====>流程:先用user_id进行了分库。然后在根据order_id来分表
defaultDatabaseStrategy:
inline:
# 用user_id 列来分
shardingColumn: user_id
# 算法 -->求余数
algorithmExpression: ds_${user_id % 2}
#默认的分表策略。共用部分
defaultTableStrategy:
none:
config-master_slave.yaml
######################################################################################################
#
# If you want to connect to MySQL, you should manually copy MySQL driver to lib directory.
#
######################################################################################################
#这个名称在配置里面必须唯一,不能相同
schemaName: sharding_db_1
#配置数据源
dataSources:
#第一个库的主从--连接demo_ds_0库
#主节点数据源
master_0_ds:
url: jdbc:mysql://192.168.56.10:3307/demo_ds_0?serverTimezone=UTC&useSSL=false
username: root
password: root
connectionTimeoutMilliseconds: 30000
idleTimeoutMilliseconds: 60000
maxLifetimeMilliseconds: 1800000
maxPoolSize: 50
#从节点数据源
slave_0_ds:
url: jdbc:mysql://192.168.56.10:3317/demo_ds_0?serverTimezone=UTC&useSSL=false
username: root
password: root
connectionTimeoutMilliseconds: 30000
idleTimeoutMilliseconds: 60000
maxLifetimeMilliseconds: 1800000
maxPoolSize: 50
#---------------------------------
#第2个库的主从--连接demo_ds_1库
#主节点数据源
master_1_ds:
url: jdbc:mysql://192.168.56.10:3307/demo_ds_1?serverTimezone=UTC&useSSL=false
username: root
password: root
connectionTimeoutMilliseconds: 30000
idleTimeoutMilliseconds: 60000
maxLifetimeMilliseconds: 1800000
maxPoolSize: 50
#从节点数据源
slave_1_ds:
url: jdbc:mysql://192.168.56.10:3317/demo_ds_1?serverTimezone=UTC&useSSL=false
username: root
password: root
connectionTimeoutMilliseconds: 30000
idleTimeoutMilliseconds: 60000
maxLifetimeMilliseconds: 1800000
maxPoolSize: 50
#配置数据库的主从规则
shardingRule:
masterSlaveRules:
ms_ds0:
masterDataSourceName: master_0_ds
slaveDataSourceNames:
- slave_0_ds
loadBalanceAlgorithmType: ROUND_ROBIN
ms_ds1:
masterDataSourceName: master_1_ds
slaveDataSourceNames:
- slave_1_ds
loadBalanceAlgorithmType: ROUND_ROBIN
mysql主从同步看
==> mysql集群主从复制1主多从 (一)
停止mysql容器
docker stop mysql-master01 mysql-slaver01
编辑主mysql文件
#切换到数据挂载目录
cd /mydata/mysql/master01/conf/
# 编辑
vi my.cnf
# 内容
#Sharding-proxy测试的库
binlog-do-db=demo_ds_0
binlog-do-db=demo_ds_1
编辑从mysql文件
#切换到数据挂载目录
cd /mydata/mysql/master01/conf/
# 编辑
vi my.cnf
# 内容
#Sharding-proxy测试的库
binlog-do-db=demo_ds_0
binlog-do-db=demo_ds_1
启动mysql容器
#启动
docker start mysql-master01 mysql-slaver01
#查看
docker ps
这边不能使用navicat15来连接不然会报错
运行sql-刷新
#订单
CREATE TABLE `t_order` (
`order_id` bigint(20) NOT NULL, `user_id` int(11) NOT NULL, `status` varchar(50) COLLATE utf8_bin DEFAULT NULL, PRIMARY KEY (`order_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_bin;
#订单项
CREATE TABLE `t_order_item` (
`order_item_id` bigint(20) NOT NULL, `order_id` bigint(20) NOT NULL, `user_id` int(11) NOT NULL, `content` varchar(255) COLLATE utf8_bin DEFAULT NULL, `status` varchar(50) COLLATE utf8_bin DEFAULT NULL, PRIMARY KEY (`order_item_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_bin;
连接Sharding-proxy后台会屏蔽0.1这些分成的库
流程 根据user_id取余,选择库,在根据,生成的order_id取余选择表
效果:
会发现数据自动分到了2个库里面的不同表
这个是根据我们指定的规则,取余数计算出来的
1个keeplived+2个Sharding-proxy
来保证高可用