注意:本文采用的sharding-proxy版本为4.1.1,sharding-proxy不用版本之间的配置差异较大,如果版本不同,很大概率会踩坑。(看官方文档的时候一定要选对版本!!!)
准备工作:
1、docker环境(为方便使用,数据库及sharding-proxy均使用docker形式安装)
2、mysql数据库驱动jar包(本文demo中有提供mysql-connector-java-5.1.47.jar)
3、实验分库分表的数据库(本文demo中有对应数据库脚本)
4、相关sql脚本及文件等见文末demo链接
表说明:
t_user: 用户表,以id作为分片键
t_order: 订单表,以user_id作为分片键
t_user.id = t_order.user_id 且 两张表为绑定表
上述2张表分2个库,每个库分3张表,即总共6张表
t_option: 单库单表,数据源位于ds_0
t_city: 广播表
开始:
1、使用docker创建一个用于实验的MySQL,并创建2个数据库db0和db1
docker run --name=mysql -d -p 3306:3306 -e MYSQL_ROOT_PASSWORD=123456 mysql:5.7.25
2、分别在db0和db1中执行ds0.sql和ds1.sql脚本,用于创建好实验的表及数据
3、参考下图创建好文件目录,其中conf文件夹用于放配置文件,lib用于放mysql数据库连接驱动jar包
4、conf文件夹中的完整配置文件可以参考:https://github.com/apache/shardingsphere/tree/4.1.1/sharding-proxy/sharding-proxy-bootstrap/src/main/resources/conf
其中config-sharding.yaml
是对分库分表的分片规则进行配置,本文使用:
# proxy之后的数据库名
schemaName: sharding_db
# 数据源配置
dataSources:
ds_0:
url: jdbc:mysql://db_host:3306/db0?useUnicode=true&characterEncoding=utf8&allowMultiQueries=true&zeroDateTimeBehavior=convertToNull
username: root
password: 123456
connectionTimeoutMilliseconds: 30000
idleTimeoutMilliseconds: 60000
maxLifetimeMilliseconds: 1800000
maxPoolSize: 50
ds_1:
url: jdbc:mysql://db_host:3306/db1?useUnicode=true&characterEncoding=utf8&allowMultiQueries=true&zeroDateTimeBehavior=convertToNull
username: root
password: 123456
connectionTimeoutMilliseconds: 30000
idleTimeoutMilliseconds: 60000
maxLifetimeMilliseconds: 1800000
maxPoolSize: 50
# 分片规则
shardingRule:
tables:
t_user:
actualDataNodes: ds_${0..1}.t_user_${0..2}
databaseStrategy:
inline:
shardingColumn: id
algorithmExpression: ds_${id % 2}
tableStrategy:
inline:
shardingColumn: id
algorithmExpression: t_user_${id % 3}
keyGenerator:
type: SNOWFLAKE
column: id
t_order:
actualDataNodes: ds_${0..1}.t_order_${0..2}
databaseStrategy:
inline:
shardingColumn: user_id
algorithmExpression: ds_${user_id % 2}
tableStrategy:
inline:
shardingColumn: user_id
algorithmExpression: t_order_${user_id % 3}
keyGenerator:
type: SNOWFLAKE
column: id
t_option:
actualDataNodes: ds_${0}.t_option
t_city:
actualDataNodes: ds_${0..1}.t_city
bindingTables:
- t_user,t_order
broadcastTables:
- t_city
各项配置含义参考注释,其中有几个坑:
a、单库单表的actualDataNodes不能直接写成ds_0.t_option,否则它还是会在两个数据库中轮训去查表。(t_option表)
b、广播表一定要在broadcastTables下声明,否则会出现数据重复。(t_city)
server.yaml
是整体的一个配置,如:用户名、密码、事务等。
# 账户密码设置
authentication:
users:
root:
password: 123456
#props:
# max.connections.size.per.query: 1
# acceptor.size: 16 # The default value is available processors count * 2.
# executor.size: 16 # Infinite by default.
# 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
# proxy.hint.enabled: false
# query.with.cipher.column: true
# sql.show: false
# allow.range.query.with.inline.sharding: false
5、通过docker启动sharding-proxy
docker stop sharding
docker rm sharding
docker run --name sharding -d -p 3307:3307 -v /Users/liqingcan/IdeaProjects/blog-demo/demo20/sharding-proxy/conf:/opt/sharding-proxy/conf -v /Users/liqingcan/IdeaProjects/blog-demo/demo20/sharding-proxy/lib:/opt/sharding-proxy/ext-lib -e PORT=3307 --link mysql:db_host apache/sharding-proxy:4.1.1
6、完成,如果启动失败,可以使用如下语句进入到docker容器中手动启动并查看错误日志
docker exec -it sharding /bin/bash
相关代码参考:https://gitee.com/lqccan/blog-demo/tree/master/%E5%90%8E%E7%AB%AF/sharding-proxy-4.1.1