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

1. 前提准备

1.1 主机IP:192.168.186.77        

version: '3.8'services:mysql-master:image: mysql:latestcontainer_name: mysql-masterenvironment:MYSQL_ROOT_PASSWORD: 123456MYSQL_USER: masterMYSQL_PASSWORD: 123456MYSQL_DATABASE: db1  ports:- "3306:3306"volumes:- mysql-master-data:/var/lib/mysqlcommand: --server-id=1 --log-bin=mysql-bin --binlog-format=ROWcap_add:- SYS_NICEsecurity_opt:- seccomp:unconfinedmysql-slave:image: mysql:latestcontainer_name: mysql-slaveenvironment:MYSQL_ROOT_PASSWORD: 123456MYSQL_USER: slaveMYSQL_PASSWORD: 123456MYSQL_DATABASE: db1ports:- "3307:3306"volumes:- mysql-slave-data:/var/lib/mysqlcommand: --server-id=2 --log-bin=mysql-bin --binlog-format=ROW --relay-log=relay-bin --relay-log-index=relay-bin.indexdepends_on:- mysql-mastercap_add:- SYS_NICEsecurity_opt:- seccomp:unconfinedvolumes:mysql-master-data:mysql-slave-data:

注:3306端口扮演master数据库角色,3307端口扮演salve数据库角色。 

1.2 主机IP:192.168.186.216

version: '3.8'services:mysql-master:image: mysql:latestcontainer_name: mysql-masterenvironment:MYSQL_ROOT_PASSWORD: 123456MYSQL_USER: masterMYSQL_PASSWORD: 123456MYSQL_DATABASE: db2  ports:- "3306:3306"volumes:- mysql-master-data:/var/lib/mysqlcommand: --server-id=3 --log-bin=mysql-bin --binlog-format=ROWcap_add:- SYS_NICEsecurity_opt:- seccomp:unconfinedmysql-slave:image: mysql:latestcontainer_name: mysql-slaveenvironment:MYSQL_ROOT_PASSWORD: 123456MYSQL_USER: slaveMYSQL_PASSWORD: 123456MYSQL_DATABASE: db2  ports:- "3307:3306"volumes:- mysql-slave-data:/var/lib/mysqlcommand: --server-id=4 --log-bin=mysql-bin --binlog-format=ROW --relay-log=relay-bin --relay-log-index=relay-bin.indexdepends_on:- mysql-mastercap_add:- SYS_NICEsecurity_opt:- seccomp:unconfinedvolumes:mysql-master-data:mysql-slave-data:

 1.3 主机IP:192.168.186.216

version: '3.8'services:mysql-master:image: mysql:latestcontainer_name: mysql-masterenvironment:MYSQL_ROOT_PASSWORD: 123456MYSQL_USER: masterMYSQL_PASSWORD: 123456MYSQL_DATABASE: db3  ports:- "3306:3306"volumes:- mysql-master-data:/var/lib/mysqlcommand: --server-id=5 --log-bin=mysql-bin --binlog-format=ROWcap_add:- SYS_NICEsecurity_opt:- seccomp:unconfinedmysql-slave:image: mysql:latestcontainer_name: mysql-slaveenvironment:MYSQL_ROOT_PASSWORD: 123456MYSQL_USER: slaveMYSQL_PASSWORD: 123456MYSQL_DATABASE: db3 ports:- "3307:3306"volumes:- mysql-slave-data:/var/lib/mysqlcommand: --server-id=6 --log-bin=mysql-bin --binlog-format=ROW --relay-log=relay-bin --relay-log-index=relay-bin.indexdepends_on:- mysql-mastercap_add:- SYS_NICEsecurity_opt:- seccomp:unconfinedvolumes:mysql-master-data:mysql-slave-data:

注:每个 MySQL 实例必须有一个唯一的 server-id。这是必要的,因为在主从复制设置中,主服务器和从服务器需要能够互相识别,并避免循环复制和冲突。       

1.4 简单主从搭建过程

1.4.1 连接主服务器

1.4.2 连接从服务器 

1.4.3 配置主服务器
# 创建一个具有复制权限的用户
CREATE USER 'master_slave'@'%' IDENTIFIED BY '123456' REQUIRE SSL;
GRANT REPLICATION SLAVE ON *.* TO 'master_slave'@'%';
FLUSH PRIVILEGES;
SHOW MASTER STATUS;

1.4.4 配置从服务器
CHANGE MASTER TOMASTER_HOST ='192.168.186.216', # 主服务器的 IP 地址MASTER_USER ='master_slave', # 主服务器上配置的复制用户MASTER_PASSWORD ='123456', # 复制用户的密码MASTER_LOG_FILE ='mysql-bin.000003', # 主服务器的日志文件名MASTER_LOG_POS =920, # 日志文件的位置MASTER_SSL=1;
START SLAVE;
SHOW SLAVE STATUS;

        其余两台使用同样的方式进行配置。 

2. 安装 Apache ShardingSphere Proxy

2.1 安装合适的JDK版本

sudo apt install openjdk-8-jdk -y

2.2 验证JDK版本

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

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文件

 sudo tar -zxvf apache-shardingsphere-5.5.0-shardingsphere-proxy-bin.tar.gz

2.5 进入Apache ShardingSphere Proxy解压后的目录 

cd apache-shardingsphere-5.5.0-shardingsphere-proxy-bin

2.5 查看MySQL的版本 

        找台主服务器或者从服务器输入查看数据库的版本。

SELECT VERSION();

2.6 下载并安装MySQL Connector/J 8.0.27

sudo wget https://downloads.mysql.com/archives/get/p/3/file/mysql-connector-java-8.0.27.tar.gz

 

2.7 解压MySQL文件

sudo tar -zxvf mysql-connector-java-8.0.27.tar.gz

2.8 进入解压后的MySQL目录

cd mysql-connector-java-8.0.27

 2.9 将 JAR 文件放置到合适的位置

 需要将JAR文件复制到Apache ShardingSphere-Proxy解压目录的lib 目录中,因为我在Apache ShardingSphere-Proxy的解压目录中下载的MySQL压缩包,解压后只需要将JAR文件移动到上一级的lib目录即可。

sudo mv mysql-connector-java-8.0.27.jar  ../lib

  2.10 global.yaml

# 回退上一级目录
cd ..# 进入conf目录
cd conf# 编辑global.yaml文件
sudo nano global.yaml

      global.yaml 内容如下:

# 释放注解
authority:users:- user: root@%password: 123456- user: shardingpassword: 123456privilege:type: ALL_PERMITTED
sqlParser:sqlStatementCache:initialCapacity: 2000maximumSize: 65535parseTreeCache:initialCapacity: 128maximumSize: 1024
props:proxy-default-port: 3308 #修改端口,因为被占用了3307所以我修改了3308sql-show: true

2.11 创建物理表

use db1; # 每个主服务器都需要创建,只需要把db1,改db2,db3即可。CREATE TABLE t_order_0
(order_id   INT PRIMARY KEY,user_id    INT,order_date DATE,status     VARCHAR(15)
);CREATE TABLE t_order_1
(order_id   INT PRIMARY KEY,user_id    INT,order_date DATE,status     VARCHAR(15)
);

注: 每个主服务器的数据库都需要建立结构相同的物理表,只是库不一样db1,db2,db3。

2.12 database-sharding.yaml

sudo nano database-sharding.yaml
2.1.1 配置数据库源
dataSources:# 主库配置ds_77_master:url: jdbc:mysql://192.168.186.77:3306/db1?serverTimezone=UTC&useSSL=false&allowPublicKeyRetrieval=trueusername: root  # 数据库用户名password: 123456  # 数据库密码connectionTimeoutMilliseconds: 30000  # 连接超时时间,单位毫秒idleTimeoutMilliseconds: 60000  # 空闲连接超时时间,单位毫秒maxLifetimeMilliseconds: 1800000  # 连接最大生命周期,单位毫秒maxPoolSize: 50  # 连接池最大连接数minPoolSize: 1  # 连接池最小连接数# 从库配置ds_77_slave:url: jdbc:mysql://192.168.186.77:3307/db1?serverTimezone=UTC&useSSL=false&allowPublicKeyRetrieval=trueusername: slave  # 数据库用户名password: 123456  # 数据库密码connectionTimeoutMilliseconds: 30000  # 连接超时时间,单位毫秒idleTimeoutMilliseconds: 60000  # 空闲连接超时时间,单位毫秒maxLifetimeMilliseconds: 1800000  # 连接最大生命周期,单位毫秒maxPoolSize: 50  # 连接池最大连接数minPoolSize: 1  # 连接池最小连接数ds_216_master:url: jdbc:mysql://192.168.186.216:3306/db2?serverTimezone=UTC&useSSL=false&allowPublicKeyRetrieval=trueusername: rootpassword: 123456connectionTimeoutMilliseconds: 30000idleTimeoutMilliseconds: 60000maxLifetimeMilliseconds: 1800000maxPoolSize: 50minPoolSize: 1ds_216_slave:url: jdbc:mysql://192.168.186.216:3307/db2?serverTimezone=UTC&useSSL=false&allowPublicKeyRetrieval=trueusername: slavepassword: 123456connectionTimeoutMilliseconds: 30000idleTimeoutMilliseconds: 60000maxLifetimeMilliseconds: 1800000maxPoolSize: 50minPoolSize: 1ds_18_master:url: jdbc:mysql://192.168.186.18:3306/db3?serverTimezone=UTC&useSSL=false&allowPublicKeyRetrieval=trueusername: rootpassword: 123456connectionTimeoutMilliseconds: 30000idleTimeoutMilliseconds: 60000maxLifetimeMilliseconds: 1800000maxPoolSize: 50minPoolSize: 1ds_18_slave:url: jdbc:mysql://192.168.186.18:3307/db3?serverTimezone=UTC&useSSL=false&allowPublicKeyRetrieval=trueusername: slavepassword: 123456connectionTimeoutMilliseconds: 30000idleTimeoutMilliseconds: 60000maxLifetimeMilliseconds: 1800000maxPoolSize: 50minPoolSize: 1# 设置逻辑数据库名称
databaseName: my_database
2.1.2 读写分离规则
rules:- !READWRITE_SPLITTING# 定义用于读写分离的数据源配置dataSources:# 第一组读写分离规则,命名为 "readwrite_77"readwrite_77:writeDataSourceName: ds_77_master  # 指定写操作的数据源为 ds_77_master(主库)readDataSourceNames:- ds_77_slave  # 指定读操作的数据源列表,这里只包括 ds_77_slave(从库)transactionalReadQueryStrategy: PRIMARY  # 事务中的读查询策略设为 PRIMARY,即事务中所有读操作都将指向主库loadBalancerName: random  # 使用随机策略从可用的从库中选择readwrite_216:writeDataSourceName: ds_216_master  readDataSourceNames:- ds_216_slave  transactionalReadQueryStrategy: PRIMARY loadBalancerName: random  readwrite_18:writeDataSourceName: ds_18_master  # 主库readDataSourceNames:- ds_18_slave  transactionalReadQueryStrategy: PRIMARY  loadBalancerName: random  # 定义负载均衡器的配置loadBalancers:random:type: RANDOM  # 指定负载均衡器的类型为 RANDOM,随机选择读库
2.1.3 分库分表规则
- !SHARDING# 分片表的配置tables:t_order:# 定义分片表t_order在各个数据源的具体分布actualDataNodes: readwrite_77.t_order_${0..1}, readwrite_216.t_order_${0..1}, readwrite_18.t_order_${0..1}# 表的分片策略配置tableStrategy:standard:shardingColumn: order_id  # 使用订单ID作为分片键shardingAlgorithmName: t_order_inline  # 分片算法名称,指向后面定义的内联算法# 主键生成策略,用于插入操作时自动生成主键keyGenerateStrategy:column: order_id  # 主键列keyGeneratorName: snowflake  # 使用雪花算法生成主键# 默认数据库分片策略defaultDatabaseStrategy:standard:shardingColumn: user_id  # 使用用户ID作为分片键shardingAlgorithmName: database_inline  # 数据库分片使用的算法名称,指向后面定义的内联算法# 默认的表分片策略,此处未定义分片策略defaultTableStrategy:none:# 绑定表组,确保相互关联的表在同一数据库分片中bindingTables:- t_order  # 把t_order表标记为绑定表# 定义使用的分片算法shardingAlgorithms:# 定义数据库分片的内联算法database_inline:type: INLINEprops:algorithm-expression: "readwrite_${(user_id % 3 == 0) ? '77' : ((user_id % 3 == 1) ? '216' : '18')}"# 根据用户ID的值进行模3运算来决定数据分配到哪个数据源# 定义表分片的内联算法t_order_inline:type: INLINEprops:algorithm-expression: "t_order_${order_id % 2}"# 根据订单ID的值进行模2运算来决定数据存储在哪个分表# 主键生成器配置,指定使用雪花算法生成主键keyGenerators:snowflake:type: SNOWFLAKEprops:worker-id: 123  # 设置雪花算法的工作节点ID
2.1.4 完整配置信息 
dataSources:ds_77_master:url: jdbc:mysql://192.168.186.77:3306/db1?serverTimezone=UTC&useSSL=false&allowPublicKeyRetrieval=trueusername: rootpassword: 123456connectionTimeoutMilliseconds: 30000idleTimeoutMilliseconds: 60000maxLifetimeMilliseconds: 1800000maxPoolSize: 50minPoolSize: 1ds_77_slave:url: jdbc:mysql://192.168.186.77:3307/db1?serverTimezone=UTC&useSSL=false&allowPublicKeyRetrieval=trueusername: slavepassword: 123456connectionTimeoutMilliseconds: 30000idleTimeoutMilliseconds: 60000maxLifetimeMilliseconds: 1800000maxPoolSize: 50minPoolSize: 1ds_216_master:url: jdbc:mysql://192.168.186.216:3306/db2?serverTimezone=UTC&useSSL=false&allowPublicKeyRetrieval=trueusername: rootpassword: 123456connectionTimeoutMilliseconds: 30000idleTimeoutMilliseconds: 60000maxLifetimeMilliseconds: 1800000maxPoolSize: 50minPoolSize: 1ds_216_slave:url: jdbc:mysql://192.168.186.216:3307/db2?serverTimezone=UTC&useSSL=false&allowPublicKeyRetrieval=trueusername: slavepassword: 123456connectionTimeoutMilliseconds: 30000idleTimeoutMilliseconds: 60000maxLifetimeMilliseconds: 1800000maxPoolSize: 50minPoolSize: 1ds_18_master:url: jdbc:mysql://192.168.186.18:3306/db3?serverTimezone=UTC&useSSL=false&allowPublicKeyRetrieval=trueusername: rootpassword: 123456connectionTimeoutMilliseconds: 30000idleTimeoutMilliseconds: 60000maxLifetimeMilliseconds: 1800000maxPoolSize: 50minPoolSize: 1ds_18_slave:url: jdbc:mysql://192.168.186.18:3307/db3?serverTimezone=UTC&useSSL=false&allowPublicKeyRetrieval=trueusername: slavepassword: 123456connectionTimeoutMilliseconds: 30000idleTimeoutMilliseconds: 60000maxLifetimeMilliseconds: 1800000maxPoolSize: 50minPoolSize: 1
databaseName: my_database
rules:- !READWRITE_SPLITTINGdataSources:readwrite_77:writeDataSourceName: ds_77_masterreadDataSourceNames:- ds_77_slavetransactionalReadQueryStrategy: PRIMARYloadBalancerName: randomreadwrite_216:writeDataSourceName: ds_216_masterreadDataSourceNames:- ds_216_slavetransactionalReadQueryStrategy: PRIMARYloadBalancerName: randomreadwrite_18:writeDataSourceName: ds_18_masterreadDataSourceNames:- ds_18_slavetransactionalReadQueryStrategy: PRIMARYloadBalancerName: randomloadBalancers:random:type: RANDOM- !SHARDINGtables:t_order:actualDataNodes: readwrite_77.t_order_${0..1}, readwrite_216.t_order_${0..1}, readwrite_18.t_order_${0..1}tableStrategy:standard:shardingColumn: order_idshardingAlgorithmName: t_order_inlinekeyGenerateStrategy:column: order_idkeyGeneratorName: snowflakedefaultDatabaseStrategy:standard:shardingColumn: user_idshardingAlgorithmName: database_inlinedefaultTableStrategy:none:bindingTables:- t_ordershardingAlgorithms:database_inline:type: INLINEprops:algorithm-expression: "readwrite_${(user_id % 3 == 0) ? '77' : ((user_id % 3 == 1) ? '216' : '18')}"t_order_inline:type: INLINEprops:algorithm-expression: "t_order_${order_id % 2}"keyGenerators:snowflake:type: SNOWFLAKEprops:worker-id: 123

注:分片规则根据 user_id 的值对3取模,决定将数据分片到哪个数据库, 根据 order_id 的值对2取模,决定将数据分片到哪个表。

2.1.5 参考教程文献

 数据分片 :: ShardingSphere

 读写分离 :: ShardingSphere

 混合规则 :: ShardingSphere

2.13 启动程序

# 回退上一级
cd ..
# 进入bin目录
cd bin
# 启动程序
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 查看日志

cat /home/sp/apache-shardingsphere-5.5.0-shardingsphere-proxy-bin/logs/stdout.log
#显示该信息代表成功
[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
[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`
[INFO ] 2024-07-25 15:39:09.966 [main] o.a.s.p.frontend.ssl.ProxySSLContext - Proxy frontend SSL/TLS is not enabled.
[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的连接管理工具。

use my_database;INSERT INTO t_order (order_id, user_id, order_date, status) VALUES (1, 10, '2023-07-01', 'NEW');
INSERT INTO t_order (order_id, user_id, order_date, status) VALUES (2, 20, '2023-07-02', 'SHIPPED');
INSERT INTO t_order (order_id, user_id, order_date, status) VALUES (3, 30, '2023-07-03', 'DELIVERED');
INSERT INTO t_order (order_id, user_id, order_date, status) VALUES (14, 40, '2023-07-04', 'RETURNED');

运行日志:

[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')
[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')
解释:分片规则根据 user_id 的值对3取模,决定将数据分片到哪个数据库, 根据 order_id 的值对2取模,决定将数据分片到哪个表。数据库取模顺序:77=>0,216=>1,18=>2
user_id: 10%3=1,order_id: 1%2=1,所以分片到第2个数据库ds_216_master,t_order_1表。 [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')
[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')
解释:分片规则根据 user_id 的值对3取模,决定将数据分片到哪个数据库, 根据 order_id 的值对2取模,决定将数据分片到哪个表。数据库取模顺序:77=>0,216=>1,18=>2
user_id: 20%3=2,order_id: 2%2=0,所以分片到第3个数据库ds_18_master,t_order_0表。
[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')
[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')
解释:分片规则根据 user_id 的值对3取模,决定将数据分片到哪个数据库, 根据 order_id 的值对2取模,决定将数据分片到哪个表。数据库取模顺序:77=>0,216=>1,18=>2
user_id: 30%3=0,order_id: 3%2=1,所以分片到第1个数据库ds_77_master,t_order_1表。

[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')
[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')
解释:分片规则根据 user_id 的值对3取模,决定将数据分片到哪个数据库, 根据 order_id 的值对2取模,决定将数据分片到哪个表。数据库取模顺序:77=>0,216=>1,18=>2
user_id: 40%3=1,order_id: 14%2=0,所以分片到第2个数据库ds_216_master,t_order_0表。

2.18 读写分离验证 

select *from t_order;
运行日志:
[INFO ] 2024-07-25 15:57:22.968 [ShardingSphere-Command-2] ShardingSphere-SQL - Logic SQL: /* ApplicationName=IntelliJ IDEA 2024.1 */ select *from t_order
[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
[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
[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,仅供学习交流使用。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/bicheng/50079.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

ModuleNotFoundError: No module named ‘scrapy.utils.reqser‘

在scrapy中使用scrapy-rabbitmq-scheduler会出现报错 ModuleNotFoundError: No module named scrapy.utils.reqser原因是新的版本的scrapy已经摒弃了该方法,但是scrapy-rabbitmq-scheduler 没有及时的更新,所以此时有两种解决方法 方法一.将scrapy回退至旧版本,找到对应的旧版…

android13 Settings动态显示隐藏某一项

总纲 android13 rom 开发总纲说明 目录 1.前言 2.确定目标设置项 3.修改参考 3.1 方法1 3.2 方法2 4.编译测试 5.彩蛋 1.前言 在Android 13系统中,动态显示或隐藏Settings应用中的某一项通常涉及到对Settings应用的内部逻辑进行修改。由于Settings应用是一个系统应用…

Mybatis——快速入门

介绍 MyBatis是一款优秀的持久层(Dao层)框架,用于简化JDBC的开发。MyBatis 底层是基于 JDBC 实现的,它封装了 JDBC 的大部分功能,使得数据库操作更加便捷和高效。同时,MyBatis 也保留了 JDBC 的灵活性&…

通信原理-思科实验五:家庭终端以太网接入Internet实验

实验五 家庭终端以太网接入Internet实验 一实验内容 二实验目的 三实验原理 四实验步骤 1.按照上图选择对应的设备,并连接起来 为路由器R0两个端口配置IP 为路由器R1端口配置IP 为路由器设备增加RIP,配置接入互联网的IP的动态路由项 5.为路由器R1配置静…

锁相环 vivado FPGA

原理 同步状态/跟踪状态:相位差在2kπ附近,频率差为0到达上述状态的过程称为捕获过程锁相环的捕获带:delta w的最大值,大于这个值的话就不能捕获鉴相器(PD-phase discriminator):相乘加LPF&…

Vue3 FileReader:readAsBinaryString() 过时,要使用readAsArrayBuffer来代替。

1、先上张图: 2、官网 developer.mozilla.org https://developer.mozilla.org/zh-CN/docs/Web/API/FileReader/readAsBinaryString ​​​​​​​FileReader接口的 readAsBinaryString() 方法用于开始读取指定 Blob 或 File 对象的内容。当读操作完成后&#xff0…

免杀笔记 -->API的整理Shellcode加密(过DeFender)

最近更新频率明显下降我懒,那么今天就来记录一下我们的一些常用的API的整理以及ShellCode的加密。 1.WinAPI整理 问我为什么要整理? 就是用起来的时候要左翻右翻 :: 烦死了 1.VirtualAlloc VirtualAlloc(NULL,sizeof(buf),MEM_…

Redis 7.x 系列【29】集群原理之自动故障转移

有道无术,术尚可求,有术无道,止于术。 本系列Redis 版本 7.2.5 源码地址:https://gitee.com/pearl-organization/study-redis-demo 文章目录 1. 概述2. 案例演示3. 工作原理3.1 故障检测3.2 排名3.3 延迟等待3.4 投票3.5 上位 1.…

大型语言模型的生物医学知识图优化提示生成

大型语言模型的生物医学知识图优化提示生成 https://arxiv.org/abs/2311.17330 https://github.com/BaranziniLab/KG_RAG 大型语言模型的生物医学知识图优化提示生成 摘要 KG-RAG框架,较好的结合了生物医学知识图谱SPOKE和LLM的优势。SPOKE是一个开放知识图谱&…

东京裸机云多IP服务器全面分析

东京裸机云多IP服务器是一种提供多IP地址分配和高性能网络服务的云计算解决方案,广泛应用于需要多IP管理和高稳定性的网络应用。下面将从几个方面具体介绍东京裸机云多IP服务器,rak部落为您整理发布东京裸机云多IP服务器的全面分析。 在数字化时代&#…

深入探讨:如何在Shopee平台上安全运营多个店铺?

在Shopee平台上,卖家如何避免店铺被关联?这是一个关乎账号安全和业务持续性的重要问题。Shopee严格规定每个卖家只能拥有一个店铺,以维护市场竞争公平和购物体验的稳定性。如果你开了多个店铺被平台判定关联,会面临冻结或封禁的风…

扫雷-C语言

一、前言: 众所周知,扫雷是一款大众类的益智小游戏,它的游戏目标是在最短的时间内根据点击格子出现的数字找出所有非雷格子,同时避免踩雷,踩到一个雷即全盘皆输。 今天,我们的目的就是通过C语言来实现一个简…

SparkSql oom原因以及参数调优+数据倾斜解决方案

1、Spark历史版本对比 spark1 vs spark2 vs spark3 1、spark1引入内存计算的理念,解决中间结果落盘导致的效率低下。在理想状况下性能可达到MR的100倍。虽然提高了一定的计算效率,但也带来了大量的内存管理问题,典型的如内存oom问题频发。…

javaEE-02-servlet

文章目录 Servlet 技术servlet程序示例通过实现Servlet接口实现Servlet程序通过继承 HttpServlet 实现 Servlet 程序 Servlet的声明周期 ServletConfig 类ServletContext 类HttpServletRequest 类请求的转发 HttpServletResponse 类请求重定向 HTTP 协议GET 请求Post请求常用请…

LINUX -exec函数族

1、功能: *让父子进程来执行不相干的操作 *能够替换进程地址空间的代码.text段 *执行另外的程序,不需要创建额外的的地址空间 *当前程序中调用另外一个应用程序 2、执行目录下的程序: *指定执行目录下的程序 int execl(const char *path,…

网工最常用的10个网络命令,但凡有一个不会用都不算资深网工。

号主:老杨丨11年资深网络工程师,更多网工提升干货,请关注公众号:网络工程师俱乐部 下午好,我的网工朋友。 当网工,日常工作不仅需要面对各种各样的网络设备和配置,还需要处理不断出现的网络故障…

SpringBoot集成Sharding-JDBC实现分库分表

本文已收录于专栏 《中间件合集》 目录 版本介绍背景介绍拆分方式集成并测试1.引入依赖2.创建库和表3.pom文件配置3.编写测试类Entity层Mapper接口MapperXML文件测试类 4.运行结果 自定义分片规则定义分片类编写pom文件 总结提升 版本介绍 SpringBoot的版本是: 2.3.…

使用DataGrip连接DM达梦数据库(手动添加达梦数据库驱动)

文章目录 一、准备达梦数据库驱动从官网下载驱动下载后,解压,本次选择,DmJdbcDriver18安装: 二、配置达梦驱动打开DataGrip,点击左上角的"Database Explorer"下的加号按钮,选择"Driver"…

秋招复习笔记——八股文部分:网络TCP

TCP 三次握手和四次挥手 TCP 基本认识 序列号:在建立连接时由计算机生成的随机数作为其初始值,通过 SYN 包传给接收端主机,每发送一次数据,就「累加」一次该「数据字节数」的大小。用来解决网络包乱序问题。 确认应答号&#xf…

数据隐私保护与区块链技术的结合:新兴趋势分析

在当今数字化时代,数据隐私保护成为了一个备受关注的重要话题。随着个人数据的不断生成和流通,如何有效保护用户的隐私成为了技术创新的一个重要方向。区块链技术作为一种去中心化、安全性高且可追溯的技术手段,正在逐渐成为解决数据隐私保护…