Apache ShardingSphere Proxy5.5.0实现MySQL分库分表与读写分离

打印 上一主题 下一主题

主题 531|帖子 531|积分 1608

1. 条件准备

1.1 主机IP:192.168.186.77        

  1. version: '3.8'
  2. services:
  3.   mysql-master:
  4.     image: mysql:latest
  5.     container_name: mysql-master
  6.     environment:
  7.       MYSQL_ROOT_PASSWORD: 123456
  8.       MYSQL_USER: master
  9.       MYSQL_PASSWORD: 123456
  10.       MYSQL_DATABASE: db1  
  11.     ports:
  12.       - "3306:3306"
  13.     volumes:
  14.       - mysql-master-data:/var/lib/mysql
  15.     command: --server-id=1 --log-bin=mysql-bin --binlog-format=ROW
  16.     cap_add:
  17.       - SYS_NICE
  18.     security_opt:
  19.       - seccomp:unconfined
  20.   mysql-slave:
  21.     image: mysql:latest
  22.     container_name: mysql-slave
  23.     environment:
  24.       MYSQL_ROOT_PASSWORD: 123456
  25.       MYSQL_USER: slave
  26.       MYSQL_PASSWORD: 123456
  27.       MYSQL_DATABASE: db1
  28.     ports:
  29.       - "3307:3306"
  30.     volumes:
  31.       - mysql-slave-data:/var/lib/mysql
  32.     command: --server-id=2 --log-bin=mysql-bin --binlog-format=ROW --relay-log=relay-bin --relay-log-index=relay-bin.index
  33.     depends_on:
  34.       - mysql-master
  35.     cap_add:
  36.       - SYS_NICE
  37.     security_opt:
  38.       - seccomp:unconfined
  39. volumes:
  40.   mysql-master-data:
  41.   mysql-slave-data:
复制代码
注:3306端口扮演master数据库角色,3307端口扮演salve数据库角色。 
1.2 主机IP:192.168.186.216

  1. version: '3.8'
  2. services:
  3.   mysql-master:
  4.     image: mysql:latest
  5.     container_name: mysql-master
  6.     environment:
  7.       MYSQL_ROOT_PASSWORD: 123456
  8.       MYSQL_USER: master
  9.       MYSQL_PASSWORD: 123456
  10.       MYSQL_DATABASE: db2  
  11.     ports:
  12.       - "3306:3306"
  13.     volumes:
  14.       - mysql-master-data:/var/lib/mysql
  15.     command: --server-id=3 --log-bin=mysql-bin --binlog-format=ROW
  16.     cap_add:
  17.       - SYS_NICE
  18.     security_opt:
  19.       - seccomp:unconfined
  20.   mysql-slave:
  21.     image: mysql:latest
  22.     container_name: mysql-slave
  23.     environment:
  24.       MYSQL_ROOT_PASSWORD: 123456
  25.       MYSQL_USER: slave
  26.       MYSQL_PASSWORD: 123456
  27.       MYSQL_DATABASE: db2  
  28.     ports:
  29.       - "3307:3306"
  30.     volumes:
  31.       - mysql-slave-data:/var/lib/mysql
  32.     command: --server-id=4 --log-bin=mysql-bin --binlog-format=ROW --relay-log=relay-bin --relay-log-index=relay-bin.index
  33.     depends_on:
  34.       - mysql-master
  35.     cap_add:
  36.       - SYS_NICE
  37.     security_opt:
  38.       - seccomp:unconfined
  39. volumes:
  40.   mysql-master-data:
  41.   mysql-slave-data:
复制代码
 1.3 主机IP:192.168.186.216

  1. version: '3.8'
  2. services:
  3.   mysql-master:
  4.     image: mysql:latest
  5.     container_name: mysql-master
  6.     environment:
  7.       MYSQL_ROOT_PASSWORD: 123456
  8.       MYSQL_USER: master
  9.       MYSQL_PASSWORD: 123456
  10.       MYSQL_DATABASE: db3  
  11.     ports:
  12.       - "3306:3306"
  13.     volumes:
  14.       - mysql-master-data:/var/lib/mysql
  15.     command: --server-id=5 --log-bin=mysql-bin --binlog-format=ROW
  16.     cap_add:
  17.       - SYS_NICE
  18.     security_opt:
  19.       - seccomp:unconfined
  20.   mysql-slave:
  21.     image: mysql:latest
  22.     container_name: mysql-slave
  23.     environment:
  24.       MYSQL_ROOT_PASSWORD: 123456
  25.       MYSQL_USER: slave
  26.       MYSQL_PASSWORD: 123456
  27.       MYSQL_DATABASE: db3
  28.     ports:
  29.       - "3307:3306"
  30.     volumes:
  31.       - mysql-slave-data:/var/lib/mysql
  32.     command: --server-id=6 --log-bin=mysql-bin --binlog-format=ROW --relay-log=relay-bin --relay-log-index=relay-bin.index
  33.     depends_on:
  34.       - mysql-master
  35.     cap_add:
  36.       - SYS_NICE
  37.     security_opt:
  38.       - seccomp:unconfined
  39. volumes:
  40.   mysql-master-data:
  41.   mysql-slave-data:
复制代码
注:每个 MySQL 实例必须有一个唯一的 server-id。这是必要的,因为在主从复制设置中,主服务器和从服务器需要能够相互识别,并制止循环复制和冲突。       
1.4 简朴主从搭建过程

1.4.1 毗连主服务器


1.4.2 毗连从服务器 


1.4.3 配置主服务器

  1. # 创建一个具有复制权限的用户
  2. CREATE USER 'master_slave'@'%' IDENTIFIED BY '123456' REQUIRE SSL;
  3. GRANT REPLICATION SLAVE ON *.* TO 'master_slave'@'%';
  4. FLUSH PRIVILEGES;
  5. SHOW MASTER STATUS;
复制代码

1.4.4 配置从服务器

  1. CHANGE MASTER TO
  2.     MASTER_HOST ='192.168.186.216', # 主服务器的 IP 地址
  3.     MASTER_USER ='master_slave', # 主服务器上配置的复制用户
  4.     MASTER_PASSWORD ='123456', # 复制用户的密码
  5.     MASTER_LOG_FILE ='mysql-bin.000003', # 主服务器的日志文件名
  6.     MASTER_LOG_POS =920, # 日志文件的位置
  7.     MASTER_SSL=1;
  8. START SLAVE;
  9. SHOW SLAVE STATUS;
复制代码

        其余两台利用同样的方式进行配置。 
2. 安装 Apache ShardingSphere Proxy

2.1 安装符合的JDK版本

  1. sudo apt install openjdk-8-jdk -y
复制代码
2.2 验证JDK版本

  1. java -version
复制代码
  liber@liber-VMware-Virtual-Platform:/home/sp$ java -version
openjdk version "1.8.0_412"
OpenJDK Runtime Environment (build 1.8.0_412-8u412-ga-1~24.04.2-b08)
OpenJDK 64-Bit Server VM (build 25.412-b08, mixed mode)
  2.3 利用wget下载Apache ShardingSphere Proxy

  1. sudo wget https://dlcdn.apache.org/shardingsphere/5.5.0/apache-shardingsphere-5.5.0-shardingsphere-proxy-bin.tar.gz
复制代码

2.4 解压Apache ShardingSphere Proxy文件

  1. sudo tar -zxvf apache-shardingsphere-5.5.0-shardingsphere-proxy-bin.tar.gz
复制代码
2.5 进入Apache ShardingSphere Proxy解压后的目次 

  1. cd apache-shardingsphere-5.5.0-shardingsphere-proxy-bin
复制代码
2.5 检察MySQL的版本 

        找台主服务器大概从服务器输入检察数据库的版本。
  1. SELECT VERSION();
复制代码

2.6 下载并安装MySQL Connector/J 8.0.27

  1. sudo wget https://downloads.mysql.com/archives/get/p/3/file/mysql-connector-java-8.0.27.tar.gz
复制代码
 
2.7 解压MySQL文件

  1. sudo tar -zxvf mysql-connector-java-8.0.27.tar.gz
复制代码
2.8 进入解压后的MySQL目次

  1. cd mysql-connector-java-8.0.27
复制代码
 2.9 将 JAR 文件放置到符合的位置

 需要将JAR文件复制到Apache ShardingSphere-Proxy解压目次的lib 目次中,因为我在Apache ShardingSphere-Proxy的解压目次中下载的MySQL压缩包,解压后只需要将JAR文件移动到上一级的lib目次即可。
  1. sudo mv mysql-connector-java-8.0.27.jar  ../lib
复制代码
  2.10 global.yaml

  1. # 回退上一级目录
  2. cd ..
  3. # 进入conf目录
  4. cd conf
  5. # 编辑global.yaml文件
  6. sudo nano global.yaml
复制代码
      global.yaml 内容如下:
  1. # 释放注解
  2. authority:
  3.   users:
  4.     - user: root@%
  5.       password: 123456
  6.     - user: sharding
  7.       password: 123456
  8.   privilege:
  9.     type: ALL_PERMITTED
  10. sqlParser:
  11.   sqlStatementCache:
  12.     initialCapacity: 2000
  13.     maximumSize: 65535
  14.   parseTreeCache:
  15.     initialCapacity: 128
  16.     maximumSize: 1024
  17. props:
  18.   proxy-default-port: 3308 #修改端口,因为被占用了3307所以我修改了3308
  19.   sql-show: true
复制代码
2.11 创建物理表

  1. use db1; # 每个主服务器都需要创建,只需要把db1,改db2,db3即可。
  2. CREATE TABLE t_order_0
  3. (
  4.     order_id   INT PRIMARY KEY,
  5.     user_id    INT,
  6.     order_date DATE,
  7.     status     VARCHAR(15)
  8. );
  9. CREATE TABLE t_order_1
  10. (
  11.     order_id   INT PRIMARY KEY,
  12.     user_id    INT,
  13.     order_date DATE,
  14.     status     VARCHAR(15)
  15. );
复制代码
注: 每个主服务器的数据库都需要建立结构相同的物理表,只是库不一样db1,db2,db3。
2.12 database-sharding.yaml

  1. sudo nano database-sharding.yaml
复制代码
2.1.1 配置数据库源

  1. dataSources:
  2.   # 主库配置
  3.   ds_77_master:
  4.     url: jdbc:mysql://192.168.186.77:3306/db1?serverTimezone=UTC&useSSL=false&allowPublicKeyRetrieval=true
  5.     username: root  # 数据库用户名
  6.     password: 123456  # 数据库密码
  7.     connectionTimeoutMilliseconds: 30000  # 连接超时时间,单位毫秒
  8.     idleTimeoutMilliseconds: 60000  # 空闲连接超时时间,单位毫秒
  9.     maxLifetimeMilliseconds: 1800000  # 连接最大生命周期,单位毫秒
  10.     maxPoolSize: 50  # 连接池最大连接数
  11.     minPoolSize: 1  # 连接池最小连接数
  12.   # 从库配置
  13.   ds_77_slave:
  14.     url: jdbc:mysql://192.168.186.77:3307/db1?serverTimezone=UTC&useSSL=false&allowPublicKeyRetrieval=true
  15.     username: slave  # 数据库用户名
  16.     password: 123456  # 数据库密码
  17.     connectionTimeoutMilliseconds: 30000  # 连接超时时间,单位毫秒
  18.     idleTimeoutMilliseconds: 60000  # 空闲连接超时时间,单位毫秒
  19.     maxLifetimeMilliseconds: 1800000  # 连接最大生命周期,单位毫秒
  20.     maxPoolSize: 50  # 连接池最大连接数
  21.     minPoolSize: 1  # 连接池最小连接数
  22.   ds_216_master:
  23.     url: jdbc:mysql://192.168.186.216:3306/db2?serverTimezone=UTC&useSSL=false&allowPublicKeyRetrieval=true
  24.     username: root
  25.     password: 123456
  26.     connectionTimeoutMilliseconds: 30000
  27.     idleTimeoutMilliseconds: 60000
  28.     maxLifetimeMilliseconds: 1800000
  29.     maxPoolSize: 50
  30.     minPoolSize: 1
  31.   ds_216_slave:
  32.     url: jdbc:mysql://192.168.186.216:3307/db2?serverTimezone=UTC&useSSL=false&allowPublicKeyRetrieval=true
  33.     username: slave
  34.     password: 123456
  35.     connectionTimeoutMilliseconds: 30000
  36.     idleTimeoutMilliseconds: 60000
  37.     maxLifetimeMilliseconds: 1800000
  38.     maxPoolSize: 50
  39.     minPoolSize: 1
  40.   ds_18_master:
  41.     url: jdbc:mysql://192.168.186.18:3306/db3?serverTimezone=UTC&useSSL=false&allowPublicKeyRetrieval=true
  42.     username: root
  43.     password: 123456
  44.     connectionTimeoutMilliseconds: 30000
  45.     idleTimeoutMilliseconds: 60000
  46.     maxLifetimeMilliseconds: 1800000
  47.     maxPoolSize: 50
  48.     minPoolSize: 1
  49.   ds_18_slave:
  50.     url: jdbc:mysql://192.168.186.18:3307/db3?serverTimezone=UTC&useSSL=false&allowPublicKeyRetrieval=true
  51.     username: slave
  52.     password: 123456
  53.     connectionTimeoutMilliseconds: 30000
  54.     idleTimeoutMilliseconds: 60000
  55.     maxLifetimeMilliseconds: 1800000
  56.     maxPoolSize: 50
  57.     minPoolSize: 1
  58. # 设置逻辑数据库名称
  59. databaseName: my_database
复制代码
2.1.2 读写分离规则

  1. rules:
  2.   - !READWRITE_SPLITTING
  3.     # 定义用于读写分离的数据源配置
  4.     dataSources:
  5.       # 第一组读写分离规则,命名为 "readwrite_77"
  6.       readwrite_77:
  7.         writeDataSourceName: ds_77_master  # 指定写操作的数据源为 ds_77_master(主库)
  8.         readDataSourceNames:
  9.           - ds_77_slave  # 指定读操作的数据源列表,这里只包括 ds_77_slave(从库)
  10.         transactionalReadQueryStrategy: PRIMARY  # 事务中的读查询策略设为 PRIMARY,即事务中所有读操作都将指向主库
  11.         loadBalancerName: random  # 使用随机策略从可用的从库中选择
  12.       readwrite_216:
  13.         writeDataSourceName: ds_216_master  
  14.         readDataSourceNames:
  15.           - ds_216_slave  
  16.         transactionalReadQueryStrategy: PRIMARY
  17.         loadBalancerName: random  
  18.       readwrite_18:
  19.         writeDataSourceName: ds_18_master  # 主库
  20.         readDataSourceNames:
  21.           - ds_18_slave  
  22.         transactionalReadQueryStrategy: PRIMARY  
  23.         loadBalancerName: random  
  24.     # 定义负载均衡器的配置
  25.     loadBalancers:
  26.       random:
  27.         type: RANDOM  # 指定负载均衡器的类型为 RANDOM,随机选择读库
复制代码
2.1.3 分库分表规则

  1. - !SHARDING
  2.   # 分片表的配置
  3.   tables:
  4.     t_order:
  5.       # 定义分片表t_order在各个数据源的具体分布
  6.       actualDataNodes: readwrite_77.t_order_${0..1}, readwrite_216.t_order_${0..1}, readwrite_18.t_order_${0..1}
  7.       # 表的分片策略配置
  8.       tableStrategy:
  9.         standard:
  10.           shardingColumn: order_id  # 使用订单ID作为分片键
  11.           shardingAlgorithmName: t_order_inline  # 分片算法名称,指向后面定义的内联算法
  12.       # 主键生成策略,用于插入操作时自动生成主键
  13.       keyGenerateStrategy:
  14.         column: order_id  # 主键列
  15.         keyGeneratorName: snowflake  # 使用雪花算法生成主键
  16.   # 默认数据库分片策略
  17.   defaultDatabaseStrategy:
  18.     standard:
  19.       shardingColumn: user_id  # 使用用户ID作为分片键
  20.       shardingAlgorithmName: database_inline  # 数据库分片使用的算法名称,指向后面定义的内联算法
  21.   # 默认的表分片策略,此处未定义分片策略
  22.   defaultTableStrategy:
  23.     none:
  24.   # 绑定表组,确保相互关联的表在同一数据库分片中
  25.   bindingTables:
  26.     - t_order  # 把t_order表标记为绑定表
  27.   # 定义使用的分片算法
  28.   shardingAlgorithms:
  29.     # 定义数据库分片的内联算法
  30.     database_inline:
  31.       type: INLINE
  32.       props:
  33.         algorithm-expression: "readwrite_${(user_id % 3 == 0) ? '77' : ((user_id % 3 == 1) ? '216' : '18')}"
  34.         # 根据用户ID的值进行模3运算来决定数据分配到哪个数据源
  35.     # 定义表分片的内联算法
  36.     t_order_inline:
  37.       type: INLINE
  38.       props:
  39.         algorithm-expression: "t_order_${order_id % 2}"
  40.         # 根据订单ID的值进行模2运算来决定数据存储在哪个分表
  41.   # 主键生成器配置,指定使用雪花算法生成主键
  42.   keyGenerators:
  43.     snowflake:
  44.       type: SNOWFLAKE
  45.       props:
  46.         worker-id: 123  # 设置雪花算法的工作节点ID
复制代码
2.1.4 完备配置信息 

  1. dataSources:
  2.   ds_77_master:
  3.     url: jdbc:mysql://192.168.186.77:3306/db1?serverTimezone=UTC&useSSL=false&allowPublicKeyRetrieval=true
  4.     username: root
  5.     password: 123456
  6.     connectionTimeoutMilliseconds: 30000
  7.     idleTimeoutMilliseconds: 60000
  8.     maxLifetimeMilliseconds: 1800000
  9.     maxPoolSize: 50
  10.     minPoolSize: 1
  11.   ds_77_slave:
  12.     url: jdbc:mysql://192.168.186.77:3307/db1?serverTimezone=UTC&useSSL=false&allowPublicKeyRetrieval=true
  13.     username: slave
  14.     password: 123456
  15.     connectionTimeoutMilliseconds: 30000
  16.     idleTimeoutMilliseconds: 60000
  17.     maxLifetimeMilliseconds: 1800000
  18.     maxPoolSize: 50
  19.     minPoolSize: 1
  20.   ds_216_master:
  21.     url: jdbc:mysql://192.168.186.216:3306/db2?serverTimezone=UTC&useSSL=false&allowPublicKeyRetrieval=true
  22.     username: root
  23.     password: 123456
  24.     connectionTimeoutMilliseconds: 30000
  25.     idleTimeoutMilliseconds: 60000
  26.     maxLifetimeMilliseconds: 1800000
  27.     maxPoolSize: 50
  28.     minPoolSize: 1
  29.   ds_216_slave:
  30.     url: jdbc:mysql://192.168.186.216:3307/db2?serverTimezone=UTC&useSSL=false&allowPublicKeyRetrieval=true
  31.     username: slave
  32.     password: 123456
  33.     connectionTimeoutMilliseconds: 30000
  34.     idleTimeoutMilliseconds: 60000
  35.     maxLifetimeMilliseconds: 1800000
  36.     maxPoolSize: 50
  37.     minPoolSize: 1
  38.   ds_18_master:
  39.     url: jdbc:mysql://192.168.186.18:3306/db3?serverTimezone=UTC&useSSL=false&allowPublicKeyRetrieval=true
  40.     username: root
  41.     password: 123456
  42.     connectionTimeoutMilliseconds: 30000
  43.     idleTimeoutMilliseconds: 60000
  44.     maxLifetimeMilliseconds: 1800000
  45.     maxPoolSize: 50
  46.     minPoolSize: 1
  47.   ds_18_slave:
  48.     url: jdbc:mysql://192.168.186.18:3307/db3?serverTimezone=UTC&useSSL=false&allowPublicKeyRetrieval=true
  49.     username: slave
  50.     password: 123456
  51.     connectionTimeoutMilliseconds: 30000
  52.     idleTimeoutMilliseconds: 60000
  53.     maxLifetimeMilliseconds: 1800000
  54.     maxPoolSize: 50
  55.     minPoolSize: 1
  56. databaseName: my_database
  57. rules:
  58.   - !READWRITE_SPLITTING
  59.     dataSources:
  60.       readwrite_77:
  61.         writeDataSourceName: ds_77_master
  62.         readDataSourceNames:
  63.           - ds_77_slave
  64.         transactionalReadQueryStrategy: PRIMARY
  65.         loadBalancerName: random
  66.       readwrite_216:
  67.         writeDataSourceName: ds_216_master
  68.         readDataSourceNames:
  69.           - ds_216_slave
  70.         transactionalReadQueryStrategy: PRIMARY
  71.         loadBalancerName: random
  72.       readwrite_18:
  73.         writeDataSourceName: ds_18_master
  74.         readDataSourceNames:
  75.           - ds_18_slave
  76.         transactionalReadQueryStrategy: PRIMARY
  77.         loadBalancerName: random
  78.     loadBalancers:
  79.       random:
  80.         type: RANDOM
  81.   - !SHARDING
  82.     tables:
  83.       t_order:
  84.         actualDataNodes: readwrite_77.t_order_${0..1}, readwrite_216.t_order_${0..1}, readwrite_18.t_order_${0..1}
  85.         tableStrategy:
  86.           standard:
  87.             shardingColumn: order_id
  88.             shardingAlgorithmName: t_order_inline
  89.         keyGenerateStrategy:
  90.           column: order_id
  91.           keyGeneratorName: snowflake
  92.     defaultDatabaseStrategy:
  93.       standard:
  94.         shardingColumn: user_id
  95.         shardingAlgorithmName: database_inline
  96.     defaultTableStrategy:
  97.       none:
  98.     bindingTables:
  99.       - t_order
  100.     shardingAlgorithms:
  101.       database_inline:
  102.         type: INLINE
  103.         props:
  104.           algorithm-expression: "readwrite_${(user_id % 3 == 0) ? '77' : ((user_id % 3 == 1) ? '216' : '18')}"
  105.       t_order_inline:
  106.         type: INLINE
  107.         props:
  108.           algorithm-expression: "t_order_${order_id % 2}"
  109.     keyGenerators:
  110.       snowflake:
  111.         type: SNOWFLAKE
  112.         props:
  113.           worker-id: 123
复制代码
注:分片规则根据 user_id 的值对3取模,决定将数据分片到哪个数据库, 根据 order_id 的值对2取模,决定将数据分片到哪个表。
2.1.5 参考教程文献

 数据分片 :: ShardingSphere
 读写分离 :: ShardingSphere
 混合规则 :: ShardingSphere
2.13 启动步伐

  1. # 回退上一级
  2. cd ..
  3. # 进入bin目录
  4. cd bin
  5. # 启动程序
  6. sudo ./start.sh
复制代码
  liber@liber-VMware-Virtual-Platform:/home/sp/apache-shardingsphere-5.5.0-shardingsphere-proxy-bin/conf$ cd ..
liber@liber-VMware-Virtual-Platform:/home/sp/apache-shardingsphere-5.5.0-shardingsphere-proxy-bin$ cd bin
liber@liber-VMware-Virtual-Platform:/home/sp/apache-shardingsphere-5.5.0-shardingsphere-proxy-bin/bin$ sudo ./start.sh
/usr/bin/java
we find java version: java8, full_version=1.8.0_412, full_path=/usr/bin/java
The classpath is /home/sp/apache-shardingsphere-5.5.0-shardingsphere-proxy-bin/conf:/home/sp/apache-shardingsphere-5.5.0-shardingsphere-proxy-bin/conf:.:/home/sp/apache-shardingsphere-5.5.0-shardingsphere-proxy-bin/lib/*:/home/sp/apache-shardingsphere-5.5.0-shardingsphere-proxy-bin/ext-lib/*
main class org.apache.shardingsphere.proxy.Bootstrap -1 /home/sp/apache-shardingsphere-5.5.0-shardingsphere-proxy-bin/conf 0.0.0.0 false
Starting the ShardingSphere-Proxy ... PID: 128452
Please check the STDOUT file: /home/sp/apache-shardingsphere-5.5.0-shardingsphere-proxy-bin/logs/stdout.log #日记路径可以通过cat进行检察
liber@liber-VMware-Virtual-Platform:/home/sp/apache-shardingsphere-5.5.0-shardingsphere-proxy-bin/bin$ 
   2.15 检察日记

  1. cat /home/sp/apache-shardingsphere-5.5.0-shardingsphere-proxy-bin/logs/stdout.log
复制代码
  1. #显示该信息代表成功
  2. [INFO ] 2024-07-25 15:39:09.724 [main] o.a.s.d.p.c.l.PipelineContextManagerLifecycleListener - mode type is not Cluster, mode type='Standalone', ignore
  3. [INFO ] 2024-07-25 15:39:09.933 [main] o.a.s.p.v.ShardingSphereProxyVersion - Database type is `MySQL`, version is `8.0.27`, database name is `my_database`
  4. [INFO ] 2024-07-25 15:39:09.966 [main] o.a.s.p.frontend.ssl.ProxySSLContext - Proxy frontend SSL/TLS is not enabled.
  5. [INFO ] 2024-07-25 15:39:12.683 [main] o.a.s.p.frontend.ShardingSphereProxy - ShardingSphere-Proxy Standalone mode started successfully
复制代码
2.16 测试毗连 


2.17 分库分表验证 

        在ShardingSphere-Proxy毗连的客户端进行操作,因为t_order是ShardingSphere-Proxy创建的逻辑表,以是现实上通过第三方毗连工具是看不到存在的实体表,比如我利用的是IDEA自带的MySQL的毗连管理工具。
  1. use my_database;
  2. INSERT INTO t_order (order_id, user_id, order_date, status) VALUES (1, 10, '2023-07-01', 'NEW');
  3. INSERT INTO t_order (order_id, user_id, order_date, status) VALUES (2, 20, '2023-07-02', 'SHIPPED');
  4. INSERT INTO t_order (order_id, user_id, order_date, status) VALUES (3, 30, '2023-07-03', 'DELIVERED');
  5. INSERT INTO t_order (order_id, user_id, order_date, status) VALUES (14, 40, '2023-07-04', 'RETURNED');
复制代码
  运行日记:
  1. [INFO ] 2024-07-25 15:43:21.874 [ShardingSphere-Command-1] ShardingSphere-SQL - Logic SQL: /* ApplicationName=IntelliJ IDEA 2024.1 */ INSERT INTO t_order (order_id, user_id, order_date, status) VALUES (1, 10, '2023-07-01', 'NEW')
  2. [INFO ] 2024-07-25 15:43:21.874 [ShardingSphere-Command-1] ShardingSphere-SQL - Actual SQL: ds_216_master ::: /* ApplicationName=IntelliJ IDEA 2024.1 */ INSERT INTO t_order_1 (order_id, user_id, order_date, status) VALUES (1, 10, '2023-07-01', 'NEW')
  3. 解释:分片规则根据 user_id 的值对3取模,决定将数据分片到哪个数据库, 根据 order_id 的值对2取模,决定将数据分片到哪个表。数据库取模顺序:77=>0,216=>1,18=>2
  4. user_id: 10%3=1,order_id: 1%2=1,所以分片到第2个数据库ds_216_master,t_order_1表。
  5. [INFO ] 2024-07-25 15:43:21.976 [ShardingSphere-Command-1] ShardingSphere-SQL - Logic SQL: /* ApplicationName=IntelliJ IDEA 2024.1 */ INSERT INTO t_order (order_id, user_id, order_date, status) VALUES (2, 20, '2023-07-02', 'SHIPPED')
  6. [INFO ] 2024-07-25 15:43:21.976 [ShardingSphere-Command-1] ShardingSphere-SQL - Actual SQL: ds_18_master ::: /* ApplicationName=IntelliJ IDEA 2024.1 */ INSERT INTO t_order_0 (order_id, user_id, order_date, status) VALUES (2, 20, '2023-07-02', 'SHIPPED')
  7. 解释:分片规则根据 user_id 的值对3取模,决定将数据分片到哪个数据库, 根据 order_id 的值对2取模,决定将数据分片到哪个表。数据库取模顺序:77=>0,216=>1,18=>2
  8. user_id: 20%3=2,order_id: 2%2=0,所以分片到第3个数据库ds_18_master,t_order_0表。
  9. [INFO ] 2024-07-25 15:43:22.108 [ShardingSphere-Command-1] ShardingSphere-SQL - Logic SQL: /* ApplicationName=IntelliJ IDEA 2024.1 */ INSERT INTO t_order (order_id, user_id, order_date, status) VALUES (3, 30, '2023-07-03', 'DELIVERED')
  10. [INFO ] 2024-07-25 15:43:22.108 [ShardingSphere-Command-1] ShardingSphere-SQL - Actual SQL: ds_77_master ::: /* ApplicationName=IntelliJ IDEA 2024.1 */ INSERT INTO t_order_1 (order_id, user_id, order_date, status) VALUES (3, 30, '2023-07-03', 'DELIVERED')
  11. 解释:分片规则根据 user_id 的值对3取模,决定将数据分片到哪个数据库, 根据 order_id 的值对2取模,决定将数据分片到哪个表。数据库取模顺序:77=>0,216=>1,18=>2
  12. user_id: 30%3=0,order_id: 3%2=1,所以分片到第1个数据库ds_77_master,t_order_1表。
  13. [INFO ] 2024-07-25 15:43:22.248 [ShardingSphere-Command-1] ShardingSphere-SQL - Logic SQL: /* ApplicationName=IntelliJ IDEA 2024.1 */ INSERT INTO t_order (order_id, user_id, order_date, status) VALUES (14, 40, '2023-07-04', 'RETURNED')
  14. [INFO ] 2024-07-25 15:43:22.248 [ShardingSphere-Command-1] ShardingSphere-SQL - Actual SQL: ds_216_master ::: /* ApplicationName=IntelliJ IDEA 2024.1 */ INSERT INTO t_order_0 (order_id, user_id, order_date, status) VALUES (14, 40, '2023-07-04', 'RETURNED')
  15. 解释:分片规则根据 user_id 的值对3取模,决定将数据分片到哪个数据库, 根据 order_id 的值对2取模,决定将数据分片到哪个表。数据库取模顺序:77=>0,216=>1,18=>2
  16. user_id: 40%3=1,order_id: 14%2=0,所以分片到第2个数据库ds_216_master,t_order_0表。
复制代码
2.18 读写分离验证 

  1. select *from t_order;
复制代码
  1. 运行日志:
  2. [INFO ] 2024-07-25 15:57:22.968 [ShardingSphere-Command-2] ShardingSphere-SQL - Logic SQL: /* ApplicationName=IntelliJ IDEA 2024.1 */ select *from t_order
  3. [INFO ] 2024-07-25 15:57:22.969 [ShardingSphere-Command-2] ShardingSphere-SQL - Actual SQL: ds_77_slave ::: /* ApplicationName=IntelliJ IDEA 2024.1 */ select *from t_order_0 UNION ALL /* ApplicationName=IntelliJ IDEA 2024.1 */ select *from t_order_1
  4. [INFO ] 2024-07-25 15:57:22.969 [ShardingSphere-Command-2] ShardingSphere-SQL - Actual SQL: ds_216_slave ::: /* ApplicationName=IntelliJ IDEA 2024.1 */ select *from t_order_0 UNION ALL /* ApplicationName=IntelliJ IDEA 2024.1 */ select *from t_order_1
  5. [INFO ] 2024-07-25 15:57:22.973 [ShardingSphere-Command-2] ShardingSphere-SQL - Actual SQL: ds_18_slave ::: /* ApplicationName=IntelliJ IDEA 2024.1 */ select *from t_order_0 UNION ALL /* ApplicationName=IntelliJ IDEA 2024.1 */ select *from t_order_1
复制代码
 
3. 总结 

        Ubtun24.04 TLS,JDK8,shardingsphere proxy/5.5.0,MySQL Connector/J 8.0.27,仅供学习交流利用。

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

大连全瓷种植牙齿制作中心

金牌会员
这个人很懒什么都没写!

标签云

快速回复 返回顶部 返回列表