ShardingSphere-Proxy 5.0 分库分表(一)

本文详细介绍了ShardingSphere-Proxy 5.0的升级配置,包括环境准备、数据库结构搭建、配置文件调整、连接与分表原理,以及分库分表的多种算法应用实例。

一、简述

  • 简述
    ShardingSphere-Proxy4.0 已经升级到5.0了,但是两者的配置文件还有一定的差别的,这篇文章讲述的就是ShardingSphere-Proxy 5.0 的落地。概念、分表、分库、分库分表的原理的基本和4.0一样的,需要了解可查看 https://blog.youkuaiyun.com/Fu_Shi_rong/article/details/123541413?spm=1001.2014.3001.5501。
  • 开发者文档
    https://shardingsphere.apache.org/document/current/cn/dev-manual/

二、ShardingSphere-Proxy5.0 落地

  • 环境

    • JAVA JDK下载

      https://pan.baidu.com/s/1A-ksNN0YicT3hXjFscGGwA 
      提取码:r9e0
      
    • JDBC数据连接驱动下载

      https://pan.baidu.com/s/1924iUe7wxGpStAzxxv2K3g 
      提取码:jy7z
      
    • ShardingSphere-Proxy 5.0 下载、

      https://archive.apache.org/dist/shardingsphere/5.0.0/
      
    • Window 11

  • 落地

    • 条件

      1. 真实数据库
      2. 逻辑数据库
      3. ShardingSphere-Proxy5.0 配置文件
    • 步骤

      1. 新建真实数据库和表【hmms.user 表为例】

        • 数据库表结构语句

          SET NAMES utf8mb4;
          SET FOREIGN_KEY_CHECKS = 0;
          
          -- ----------------------------
          -- Table structure for user
          -- ----------------------------
          DROP TABLE IF EXISTS `user`;
          CREATE TABLE `user`  (
            `useid` int(11) NOT NULL,
            `usenam` varchar(50) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL COMMENT '登录名',
            `usepwd` varchar(100) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '登录密码',
            `usestate` int(11) NULL DEFAULT 2 COMMENT '-1:删除1:注销 2:正常 3:挂失',
            `usekey` varchar(100) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '用户秘钥',
            `usetel` varchar(11) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '用户手机',
            `createbyid` varchar(50) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '添加人',
            `createbytime` datetime(0) NULL DEFAULT NULL COMMENT '添加时间',
            `modifybyid` varchar(50) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '修改人',
            `modifybytime` datetime(0) NULL DEFAULT NULL COMMENT '修改时间',
            PRIMARY KEY (`useid`) USING BTREE
          ) ENGINE = InnoDB CHARACTER SET = utf8 COLLATE = utf8_general_ci ROW_FORMAT = Dynamic;
          SET FOREIGN_KEY_CHECKS = 1;
          
        • 运行结果如下:

          在这里插入图片描述

      2. 修改ShardingSphere-Proxy5.0 配置文件,并连接

        config-sharding.yaml

        # 3、创建客户端连接库
        schemaName: hmms
        
        #1、连接mysql
        dataSources:
          hmmsdatasources-0:
            url: jdbc:mysql://localhost:3306/hmms?serverTimezone=UTC&useSSL=false
            username: root
            password: ****
            connectionTimeoutMilliseconds: 30000
            idleTimeoutMilliseconds: 60000
            maxLifetimeMilliseconds: 1800000
            maxPoolSize: 50
            minPoolSize: 1
            
        # 2、分片规则
        rules:
        - !SHARDING
          tables:
            user: #表名
              actualDataNodes: hmmsdatasources-0.user-${0..1}  #分表规则
              tableStrategy:
                standard:
                  shardingColumn: useid   #分片键
                  shardingAlgorithmName: use_MOD  #分表算法
          shardingAlgorithms:  #分表算法
            use_MOD:  #取模算法
              type: MOD
              props:
                sharding-count: 2
        

        server.yaml

        rules:
          - !AUTHORITY
            users:
              - root@%:*****
              - sharding@:sharding
            provider:
              type: ALL_PRIVILEGES_PERMITTED
        

        运行命令

        #在ShardingSphere-Proxy bin
        start.bat 端口号
        

        运行结果如下:

        在这里插入图片描述

      3. 新建逻辑数据连接,并执行表结构和数据脚本

        逻辑库执行结果如下:

        在这里插入图片描述

        逻辑数据库添加两条数据

        SQL语句

        INSERT INTO `user` VALUES (1, 'admin', '202CB962AC59075B964B07152D234B70', 2, '123', '123123', 'xiaogang', '2021-08-25 20:12:15', 'xiaogang', NULL);
        INSERT INTO `user` VALUES (2, 'admin', '202CB962AC59075B964B07152D234B70', 2, '123', '123123', 'xiaogang', '2021-08-25 20:12:15', 'xiaogang', NULL);
        

        执行结果如下:

        在这里插入图片描述
        在这里插入图片描述

    • 分库分表
      ShardingSphere-Proxy 5.0 配置

      # 3、创建客户端连接库
      schemaName: hmms
      
      #1、连接mysql
      dataSources:
        hmmsdatasources-0:
          url: jdbc:mysql://主机地址:端口号/hmms-0?serverTimezone=UTC&useSSL=false
          username: root
          password: 密码
          connectionTimeoutMilliseconds: 30000
          idleTimeoutMilliseconds: 60000
          maxLifetimeMilliseconds: 1800000
          maxPoolSize: 50
          minPoolSize: 1
      
        hmmsdatasources-1:
          url: jdbc:mysql://主机地址:端口号/hmms-1?serverTimezone=UTC&useSSL=false
          username: root
          password: 密码
          connectionTimeoutMilliseconds: 30000
          idleTimeoutMilliseconds: 60000
          maxLifetimeMilliseconds: 1800000
          maxPoolSize: 50
          minPoolSize: 1
          
      
      # 2、分片规则
      rules:
      - !SHARDING
        tables:
          user:
            actualDataNodes: hmmsdatasources-${0..1}.user-${0..1}   
            tableStrategy:
              standard:
                shardingColumn: useid
                shardingAlgorithmName: use_MOD
            databaseStrategy:  #分库规则
                standard:
                  shardingColumn: useid
                  shardingAlgorithmName: use_MOD
            keyGenerateStrategy: 
              column: useid
              keyGeneratorName: snowflake
        shardingAlgorithms:
          use_MOD:
            type: MOD
            props:
              sharding-count: 2 
          use_HASH_MOD:
            type: HASH_MOD
            props:
              sharding-count: '2'
        keyGenerators: 
          snowflake: 
             type: SNOWFLAKE
             props: 
               worker-id: 123
      
    • 分片算法

    1. 取模算法
     shardingAlgorithms:  #分表算法
        use_MOD:  #取模算法
          type: MOD
          props:
            sharding-count: 2  #分表数据和分表的表达式必须是一致的
    
  1. 范围算法

      shardingAlgorithms:
        use_BOUNDARY_RANGE:
          type: BOUNDARY_RANGE
          props:
            sharding-ranges: 2,100  #多个节点是以逗号分割  [是根据分的表结合配置节点]
     #备注
      #分片键为:useid  int类型
      #分表的为3个表
      #sharding-ranges: 2,100 是以2为节点,小于2的数据存到表0,2到99存到表1,100以上存到表3
    
  2. 容量算法

    shardingAlgorithms:
    	use_VOLUME_RANGE:
                type: VOLUME_RANGE
                props:
                  range-lower: '20000000'  #最小值
                  range-upper: '40000000'  #最大值
                  # 分片的区间的数据的间隔
                  sharding-volume: '20000000'
     #备注
        最小值为2000万,也就是说表数据量小于等于2000万,最大数量为4000万
        表与表的间隔为2000万
        比如说分了两张表:
        1-2000万       存到表0
        2001万-4000万   存到表1
        是根据分表的数量来定义最大值的
        分了三张表,那最大值为6000万
    
  3. HASH-CODE算法 【如果分片键是字符串类型,需要这种算法分表】

      shardingAlgorithms:
        use_HASH_MOD:
          type: HASH_MOD
          props:
            sharding-count: '2'  #分表数量,单引号必须要加
    
  4. 根据时间分表算法

    shardingAlgorithms:
        use_AUTO_INTERVAL:
            type: AUTO_INTERVAL
            props:
              datetime-lower: '2020-01-01 23:59:59'
              datetime-upper: '2022-12-31 23:59:59'
              # 以1年度为单位进行划分
              sharding-seconds: '31536000'  
              # 以1个月为单位进行划分
              #sharding-seconds: '2678400'   
              # 以1天为单位进行划分
              #sharding-seconds: '86400'
     #设置的最大值必须和分多少表匹配才行,否者报错,找不到表
    
  • 分布式ID

    config-sharding.yaml

    # 3、创建客户端连接库
    schemaName: hmms
    
    #1、连接mysql
    dataSources:
      hmmsdatasources-0:
        url: jdbc:mysql://localhost:3306/hmms?serverTimezone=UTC&useSSL=false
        username: root
        password: 1QAZ2WSX3EDC
        connectionTimeoutMilliseconds: 30000
        idleTimeoutMilliseconds: 60000
        maxLifetimeMilliseconds: 1800000
        maxPoolSize: 50
        minPoolSize: 1
        
    # 2、分片规则
    rules:
    - !SHARDING
      tables:
        user:
          actualDataNodes: hmmsdatasources-0.user-${0..1}
          tableStrategy:
            standard:
              shardingColumn: id
              shardingAlgorithmName: use_HASH_MOD
          keyGenerateStrategy: 
            column: id
            keyGeneratorName: snowflake
      shardingAlgorithms:
        use_MOD:
          type: MOD
          props:
            sharding-count: 2 
        use_HASH_MOD:
          type: HASH_MOD
          props:
            sharding-count: '2'
      keyGenerators: 
        snowflake: 
           type: SNOWFLAKE
           props: 
             worker-id: 123
          
    

    表结构sql语句

    SET NAMES utf8mb4;
    SET FOREIGN_KEY_CHECKS = 0;
    
    -- ----------------------------
    -- Table structure for user
    -- ----------------------------
    DROP TABLE IF EXISTS `user`;
    CREATE TABLE `user`  (
      `id` varchar(100),
      `useid` int(11) NOT NULL,
      `usenam` varchar(50) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL COMMENT '登录名',
      `usepwd` varchar(100) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '登录密码',
      `usestate` int(11) NULL DEFAULT 2 COMMENT '-1:删除1:注销 2:正常 3:挂失',
      `usekey` varchar(100) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '用户秘钥',
      `usetel` varchar(11) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '用户手机',
      `createbyid` varchar(50) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '添加人',
      `createbytime` datetime(0) NULL DEFAULT NULL COMMENT '添加时间',
      `modifybyid` varchar(50) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '修改人',
      `modifybytime` datetime(0) NULL DEFAULT NULL COMMENT '修改时间',
      PRIMARY KEY (`useid`) USING BTREE
    ) ENGINE = InnoDB CHARACTER SET = utf8 COLLATE = utf8_general_ci ROW_FORMAT = Dynamic;
    SET FOREIGN_KEY_CHECKS = 1;
    

    数据填充语句

    INSERT INTO `user`(useid,usenam,usepwd,usestate,usekey,usetel,createbyid,createbytime,modifybyid,modifybytime) VALUES (1, 'admin', '202CB962AC59075B964B07152D234B70', 2, '123', '123123', 'xiaogang', '2021-08-25 20:12:15', 'xiaogang', NULL);
    

    执行结构如下:

    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述

<think>好的,我现在需要帮助用户了解如何通过ShardingSphere-Proxy的日志验证分表路由的正确性。用户之前已经问过关于ShardingSphere-Proxy使用分表是否需要修改Spring Boot代码的问题,现在他根据我的回答,进步询问如何通过日志验证分表是否正确。我需要结合用户提供的引用内容和之前的对话来给出详细的步骤和说明。 首先,用户提供的引用内容中,引用[3]提到他使用的是ShardingSphere-Proxy 5.5.1版本,并给出了下载和安装步骤。这可能对日志的位置和配置有帮助。引用[4]提到了分片算法,比如哈希取模和范围分片,这可能涉及到路由策略的具体实现,这些信息可能在日志中体现出来。引用[1]和[2]则更多是关于ShardingSphere-Proxy配置和应用场景,可能对理解整体架构有帮助。 接下来,我需要回忆之前回答的内容。在之前的回答中,我提到验证分表路由的方法是通过Proxy执行SQL并观察日志,例如执行SELECT * FROM user WHERE id=5,然后查看Proxy日志中的实际路由到哪个物理表。现在用户希望更详细地了解这个过程,所以需要详细说明日志的位置、如何开启详细日志、具体的验证步骤以及常见问题处理。 首先,日志的位置可能根据安装路径不同而有所变化。用户安装路径是/ops/app/sharding-proxy,所以日志可能在logs目录下,比如stdout.log。然后,需要确认用户是否已经配置了日志级别为DEBUG,因为默认可能不是足够详细。需要指导用户如何修改logback.xml配置文件,调整日志级别。 接下来,具体的验证步骤需要分步骤说明:发送测试SQL,检查日志中的Actual SQL部分。这里需要给出具体的例子,比如插入和查询操作,对应的日志输出应该显示路由到哪个具体的分表。同时,要提醒用户注意分片键是否在SQL语句中出现,否则可能导致全路由,影响验证结果。 然后,常见问题处理部分需要涵盖没有分片键的情况,分片算法是否匹配,以及物理表是否存在。例如,如果用户漏掉了分片键,日志中会显示所有分表都被访问,这时候需要提醒用户检查SQL语句。如果分片算法配置错误,比如模数不对,路由结果就会出错,需要检查配置。另外,如果物理表不存在,即使路由正确也会报错,所以需要确认表结构是否已经正确创建。 最后,要确保回答结构清晰,分点说明,并参考用户提供的引用内容。比如引用[4]提到的分片算法,可以在解释分片算法类型时引用,说明不同算法在日志中的表现可能不同。同时,用户之前的问题中提到的分表规则配置,也需要在日志验证中对应起来,确保用户能够将配置和实际日志输出联系起来。 可能还需要考虑用户的实际操作环境,比如是否熟悉查看日志文件,是否有权限修改日志配置等。因此,在回答中需要给出具体的命令和配置示例,帮助用户步步操作。例如,修改logback.xml的具体位置,如何重启Proxy服务等。这些细节能帮助用户减少操作中的障碍,顺利验证分表路由的正确性。 总结来说,我需要将整个过程分解为日志位置、开启详细日志、验证步骤、示例分析以及常见问题处理,每个部分都要详细且易于理解。同时,结合用户提供的引用内容,确保回答的准确性和相关性。</think>以下是基于引用内容并结合实际经验的详细解答,说明如何通过ShardingSphere-Proxy日志验证分表路由的正确性: --- ### 、日志文件定位 1. **默认日志路径** Proxy的日志文件通常位于安装目录下的`logs`文件夹中(根据引用[3]的安装路径): ```bash /ops/app/sharding-proxy/logs/stdout.log # 标准输出日志 ``` 2. **关键日志标识** - **逻辑SQL**:业务代码中发送的原始SQL(使用逻辑表名) - **Actual SQL**:Proxy解析后实际执行的物理SQL(带分表后缀) - **Route**:分片路由结果(显示具体分库分表--- ### 二、验证步骤 #### 步骤1:开启DEBUG日志级别(若需更详细信息) 修改Proxy服务端`conf/logback.xml`,调整日志级别: ```xml <!-- 修改前 --> <logger name="org.apache.shardingsphere" level="INFO" /> <!-- 修改后 --> <logger name="org.apache.shardingsphere" level="DEBUG" /> # 输出详细路由信息 ``` 重启Proxy服务使配置生效: ```bash cd /ops/app/sharding-proxy && ./bin/stop.sh && ./bin/start.sh ``` #### 步骤2:执行测试SQL并观察日志 **示例场景**(基于引用[4]的分片算法): - **分表规则**:对`id`字段哈希取模(`sharding-count=4`) - **逻辑表名**:`user`,物理表名:`user_0`到`user_3` **测试用例1:精确分片键查询** ```sql -- 业务代码执行 SELECT * FROM user WHERE id = 7; ``` **日志验证**: ```log [DEBUG] [main] ShardingSphere-SQL - Logic SQL: SELECT * FROM user WHERE id = 7 [DEBUG] [main] ShardingSphere-SQL - Actual SQL: ds_0 ::: SELECT * FROM user_3 WHERE id = 7 # id=7 mod4=3 → user_3 ``` **测试用例2:无分片键查询** ```sql SELECT * FROM user WHERE name = 'Alice'; ``` **日志验证**: ```log [DEBUG] [main] ShardingSphere-SQL - Actual SQL: ds_0 ::: SELECT * FROM user_0 WHERE name = 'Alice' [DEBUG] [main] ShardingSphere-SQL - Actual SQL: ds_0 ::: SELECT * FROM user_1 WHERE name = 'Alice' [DEBUG] [main] ShardingSphere-SQL - Actual SQL: ds_0 ::: SELECT * FROM user_2 WHERE name = 'Alice' [DEBUG] [main] ShardingSphere-SQL - Actual SQL: ds_0 ::: SELECT * FROM user_3 WHERE name = 'Alice' # 广播全表 ``` --- ### 三、关键验证点 1. **分片键匹配性** 检查`Actual SQL`中的分表后缀是否与分片键值(如`id=7`)通过分片算法计算的结果致[^4]。 2. **路由范围正确性** - **精确路由**:当SQL包含分片键时,应仅命中个分表(如`user_3`) - **广播路由**:当SQL不包含分片键时,应命中所有分表(如`user_0`到`user_3`) --- ### 四、常见问题排查 | 问题现象 | 原因分析 | 解决方案 | |-----------------------------|--------------------------|------------------------------| | 实际SQL未替换分表后缀 | 分表规则未生效 | 检查Proxy配置`config-sharding.yaml` | | 分片结果与预期不符 | 分片算法类型或参数错误 | 验证分片算法实现(如HASH_MOD的`sharding-count`)[^4] | | 路由到不存在的物理表 | 物理表未实际创建 | 在数据中手动创建`user_0`到`user_3`表 | --- ### 五、扩展验证方法 通过Proxy的`SHOW`命令直接查看路由结果: ```sql -- 执行解析SQL(不实际执行) PREVIEW SELECT * FROM user WHERE id = 7; -- 输出结果 +------------------+----------------+ | data_source_name | actual_table | +------------------+----------------+ | ds_0 | user_3 | +------------------+----------------+ ``` --- ### 六、示例分析 **引用[4]的分区段算法验证**: 若分表规则为范围分片(如`[0-255]→user_0`,`[256-511]→user_1`): ```sql SELECT * FROM user WHERE id = 300; # 应路由到user_1 ``` **预期日志**: ```log Actual SQL: ds_0 ::: SELECT * FROM user_1 WHERE id = 300 ``` ---
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值