sharding-proxy 4.1.1实践记录(附完整实践代码)

注意:本文采用的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


觉得内容还不错?打赏个钢镚鼓励鼓励!!👍