注意:本文采用的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
相关demo参考:https://gitee.com/lqccan/blog-demo demo20