参考课程
尚硅谷ShardingSphere5实战教程(快速入门掌握核心)_哔哩哔哩_bilibili
主服务器
创建容器
docker run -d \
-p 3306:3306 \
-v /kira/mysql/master/conf:/etc/mysql/conf.d \
-v /kira/mysql/master/data:/var/lib/mysql \
-e MYSQL_ROOT_PASSWORD=382673 \
--name mysql-kira-master \
mysql:8.0.29
修改配置文件
默认模式下,binlog日志是自动开启的
vim /kira/mysql/master/conf/my.cnf
配置文件里面的内容
[mysqld]
服务器唯一id,默认值1
server-id=1
设置日志格式,默认值ROW
binlog_format=STATEMENT
二进制日志名,默认binlog
log-bin=binlog
设置需要复制的数据库,默认复制全部数据库
#binlog-do-db=mytestdb
设置不需要复制的数据库
#binlog-ignore-db=mysql
#binlog-ignore-db=infomation_schema
重启容器
docker restart mysql-kira-master
进入容器内部
#进入容器:env LANG=C.UTF-8 避免容器中显示中文乱码
docker exec -it mysql-kira-master env LANG=C.UTF-8 /bin/bash
#进入容器内的mysql命令行
mysql -u root -p
#修改默认密码校验方式
ALTER USER 'root'@'%' IDENTIFIED WITH mysql_native_password BY '382673';
创建用户,方便从库连接的时候使用该用户连接
-- 创建slave用户
CREATE USER 'KIRA'@'%';
-- 设置密码
ALTER USER 'KIRA'@'%' IDENTIFIED BY '382673';
-- 授予复制权限
GRANT REPLICATION SLAVE ON *.* TO 'KIRA'@'%';
-- 刷新权限
FLUSH PRIVILEGES;
显示和记录Master状态
SHOW MASTER STATUS;
从服务器
创建容器
docker run -d \
-p 3308:3306 \
-v /kira/mysql/slave3/conf:/etc/mysql/conf.d \
-v /kira/mysql/slave3/data:/var/lib/mysql \
-e MYSQL_ROOT_PASSWORD=382673 \
--name mysql-kira-slave3 \
mysql:8.0.29
修改配置文件
vim /kira/mysql/slave3/conf/my.cnf
配置文件的内容
[mysqld]
服务器唯一id,每台服务器的id必须不同,如果配置其他从机,注意修改id
server-id=3
中继日志名,默认xxxxxxxxxxxx-relay-bin
#relay-log=relay-bin
重启容器
docker restart mysql-kira-slave3
进入容器操作
#进入容器:
docker exec -it mysql-kira-slave3 env LANG=C.UTF-8 /bin/bash
#进入容器内的mysql命令行
mysql -uroot -p
#修改默认密码校验方式
ALTER USER 'root'@'%' IDENTIFIED WITH mysql_native_password BY '382673';
配置主从关系
CHANGE MASTER TO MASTER_HOST='192.168.88.130',
MASTER_USER='KIRA',MASTER_PASSWORD='382673', MASTER_PORT=3306,
MASTER_LOG_FILE='binlog.000003',MASTER_LOG_POS=1361;
具体的值要根据我们之前查出来的主库的值来配置
开启主从同步
START SLAVE;
-- 查看状态(不需要分号)
SHOW SLAVE STATUS\G
这两个都是YES,那么我们就是成功了
这个位置查看我们的错误
两个常见报错
这个是我们没关防火墙时就启动了docker,即使后面我们关闭防火墙docker里面还是没用
搭建主从集群时遇到的错误
用户插件错误
我们要修改我们的身份验证插件
我们在主库重新弄我们的KIRA用户的认证插件
ALTER USER 'KIRA'@'%' IDENTIFIED BY '382673';
ALTER USER 'KIRA'@'%' IDENTIFIED WITH mysql_native_password BY '382673';
docker restart mysql-kira-master
小重点
这两个KIRA用户是不同的,我们配置的是%的KIRA用户
如果我们修改的是上面那个指定IP的KIRA用户
那我们还是失败的
因为我们主机创建的KIRA用户是下面的
上面的用户都不存在
而且我们使用的KIRA用户也是%的KIRA用户
你看,我们的用户创建的时候,没有指定IP地址,而是%
经典报错
我们修改完认证插件后,我们呢还要重启我们的主库
我们的主库的状态如果我们不刷新,我们看不到改变的,一般错误都是那个指定主库的代码出错了
你看,刷新之后我们的file的版本号就变了
解决报错的经典代码,一般这些步骤就够了
-- 在从机停止slave
SLAVE STOP;
-- 在主机查看mater状态
SHOW MASTER STATUS;
-- 在主机刷新日志
FLUSH LOGS;
-- 再次在主机查看mater状态(会发现File和Position发生了变化)
SHOW MASTER STATUS;
-- 修改从机连接主机的SQL,并重新连接即可
ShardingSphere搭建mysql数据库的读写分离
尚硅谷的课程教的是properties格式
我觉得这个可读性太差了
所以我用的是yml格式
记住不同版本的依赖对应不同的官方文档,不然会启动不了或者许多配置和之前不同从而导致错误
跟着官网配置
且我们使用的YAML格式的配置,不是properties格式的配置
我们不同的版本要根据不同的文档来进行配置
我用的是5.4.1
经典的Spring配置文件
server:
port: 8001
spring:
application:
name: ShardingSphere-test
datasource:
# ShardingSphere 的驱动
driver-class-name: org.apache.shardingsphere.driver.ShardingSphereDriver
# ShardingSphere 的url
url: jdbc:shardingsphere:classpath:shardingsphere--config.yaml
读写分离配置
记得我们url后面要加很多东西,不然连接不上
还有单表配置必须写,不然shardingsphere找不到表
dataSources:
master:
dataSourceClassName: com.zaxxer.hikari.HikariDataSource
driverClassName: com.mysql.cj.jdbc.Driver
jdbcUrl: jdbc:mysql://192.168.88.130:3306/db_user?useUnicode=true&characterEncoding=UTF-8&rewriteBatchedStatements=true&allowMultiQueries=true&serverTimezone=Asia/Shanghai&allowPublicKeyRetrieval=true
username: root
password: 382673
slave1:
dataSourceClassName: com.zaxxer.hikari.HikariDataSource
driverClassName: com.mysql.cj.jdbc.Driver
jdbcUrl: jdbc:mysql://192.168.88.130:3307/db_user?useUnicode=true&characterEncoding=UTF-8&rewriteBatchedStatements=true&allowMultiQueries=true&serverTimezone=Asia/Shanghai&allowPublicKeyRetrieval=true
username: root
password: 382673
slave3:
dataSourceClassName: com.zaxxer.hikari.HikariDataSource
driverClassName: com.mysql.cj.jdbc.Driver
jdbcUrl: jdbc:mysql://192.168.88.130:3308/db_user?useUnicode=true&characterEncoding=UTF-8&rewriteBatchedStatements=true&allowMultiQueries=true&serverTimezone=Asia/Shanghai&allowPublicKeyRetrieval=true
username: root
password: 382673
# 这个是我们的读写分离配置
rules:
- !READWRITE_SPLITTING
dataSources:
readwrite_ds:
writeDataSourceName: master
readDataSourceNames:
- slave1
- slave3
transactionalReadQueryStrategy: PRIMARY
loadBalancerName: kira
loadBalancers:
kira:
type: ROUND_ROBIN
- !SINGLE
tables: #我们的单表配置
- "*.*.*"
defaultDataSource: master # 默认数据源,仅在执行 CREATE TABLE 创建单表时有效。缺失值为空,表示随机单播路由。
props: #我们打印SQL语句
sql-show: true
垂直分片配置
dataSources:
user:
dataSourceClassName: com.zaxxer.hikari.HikariDataSource
driverClassName: com.mysql.cj.jdbc.Driver
jdbcUrl: jdbc:mysql://192.168.88.130:3301/db_user?useUnicode=true&characterEncoding=UTF-8&rewriteBatchedStatements=true&allowMultiQueries=true&serverTimezone=Asia/Shanghai&allowPublicKeyRetrieval=true
username: root
password: 123456
order:
dataSourceClassName: com.zaxxer.hikari.HikariDataSource
driverClassName: com.mysql.cj.jdbc.Driver
jdbcUrl: jdbc:mysql://192.168.88.130:3302/db_order?useUnicode=true&characterEncoding=UTF-8&rewriteBatchedStatements=true&allowMultiQueries=true&serverTimezone=Asia/Shanghai&allowPublicKeyRetrieval=true
username: root
password: 123456
rules:
- !SINGLE
tables: #我们的单表配置
- "*.*.*"
defaultDataSource: user # 默认数据源,仅在执行 CREATE TABLE 创建单表时有效。缺失值为空,表示随机单播路由。
- !SHARDING
tables:
t_user: #逻辑表
actualDataNodes: user.t_user #不同的表在不同的数据源,配置我们对应的数据源 这样我们就把逻辑表和真实节点映射了
t_order: #逻辑表
actualDataNodes: order.t_order #不同的表在不同的数据源,配置我们对应的数据源 这样我们就把逻辑表和真实节点映射了
props: #我们打印SQL语句
sql-show: true
水平分片配置
dataSources:
user:
dataSourceClassName: com.zaxxer.hikari.HikariDataSource
driverClassName: com.mysql.cj.jdbc.Driver
jdbcUrl: jdbc:mysql://192.168.88.130:3301/db_user?useUnicode=true&characterEncoding=UTF-8&rewriteBatchedStatements=true&allowMultiQueries=true&serverTimezone=Asia/Shanghai&allowPublicKeyRetrieval=true
username: root
password: 123456
order0:
dataSourceClassName: com.zaxxer.hikari.HikariDataSource
driverClassName: com.mysql.cj.jdbc.Driver
jdbcUrl: jdbc:mysql://192.168.88.130:3310/db_order?useUnicode=true&characterEncoding=UTF-8&rewriteBatchedStatements=true&allowMultiQueries=true&serverTimezone=Asia/Shanghai&allowPublicKeyRetrieval=true
username: root
password: 123456
order1:
dataSourceClassName: com.zaxxer.hikari.HikariDataSource
driverClassName: com.mysql.cj.jdbc.Driver
jdbcUrl: jdbc:mysql://192.168.88.130:3311/db_order?useUnicode=true&characterEncoding=UTF-8&rewriteBatchedStatements=true&allowMultiQueries=true&serverTimezone=Asia/Shanghai&allowPublicKeyRetrieval=true
username: root
password: 123456
rules:
- !SINGLE
tables: #我们的单表配置
- "*.*.*"
defaultDataSource: user # 默认数据源,仅在执行 CREATE TABLE 创建单表时有效。缺失值为空,表示随机单播路由。
- !SHARDING
tables:
t_user: #逻辑表
actualDataNodes: user.t_user #不同的表在不同的数据源,配置我们对应的数据源 这样我们就把逻辑表和真实节点映射了
t_order:
#逻辑表
actualDataNodes: order${0..1}.t_order${0..1} #不同的表在不同的数据源,配置我们对应的数据源 这样我们就把逻辑表和真实节点映射了
databaseStrategy :
# 用于单分片键的标准分片场景
standard:
# 分片键
shardingColumn: order_no
# 分片算法
shardingAlgorithmName: kira
# 分表策略
tableStrategy:
# 用于单分片键的标准分片场景
standard:
# 分片键
shardingColumn: user_id
# 分片算法
shardingAlgorithmName: kira
# 分片算法
shardingAlgorithms:
# 数据表分片算法
kira:
# 根据分片键 Hash 分片
type: HASH_MOD
# 分片数量
props:
sharding-count: 16
props: #我们打印SQL语句
sql-show: true
用到的依赖
前面3个额外的依赖是好像是要引入的,不然会有什么类缺失,导致不兼容
然后我们的mybatisplus要指定boot3的版本,不然我们boot3好像执行mybatisplus的时候会报错
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<!-- https://mvnrepository.com/artifact/org.apache.shardingsphere/shardingsphere-jdbc-core -->
<dependency>
<groupId>org.apache.shardingsphere</groupId>
<artifactId>shardingsphere-jdbc-core</artifactId>
<version>5.4.1</version>
</dependency>
<!-- https://mvnrepository.com/artifact/com.mysql/mysql-connector-j -->
<dependency>
<groupId>com.mysql</groupId>
<artifactId>mysql-connector-j</artifactId>
<version>8.4.0</version>
</dependency>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<optional>true</optional>
</dependency>
<dependency>
<groupId>javax.xml.bind</groupId>
<artifactId>jaxb-api</artifactId>
<version>2.3.1</version>
</dependency>
<dependency>
<groupId>org.glassfish.jaxb</groupId>
<artifactId>jaxb-runtime</artifactId>
<version>2.3.1</version>
</dependency>
<dependency>
<groupId>org.yaml</groupId>
<artifactId>snakeyaml</artifactId>
</dependency>
<!-- https://mvnrepository.com/artifact/com.baomidou/mybatis-plus-spring-boot3-starter -->
<dependency>
<groupId>com.baomidou</groupId>
<artifactId>mybatis-plus-spring-boot3-starter</artifactId>
<version>3.5.7</version>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-jdbc</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
</dependencies>
我在真实项目中使用的是5.4.1版本
首先我配置好了mysql的主从模式
然后在shardingsphere里面来配置我们的读写分离
基本使用+报错
mybatis依赖冲突,启动报错
我们使用这个boot3的依赖包
因为一些特殊的报错,我还引入了这三个依赖
现在是目前有的依赖
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<!-- https://mvnrepository.com/artifact/org.apache.shardingsphere/shardingsphere-jdbc-core -->
<dependency>
<groupId>org.apache.shardingsphere</groupId>
<artifactId>shardingsphere-jdbc-core</artifactId>
<version>5.4.1</version>
</dependency>
<!-- https://mvnrepository.com/artifact/com.mysql/mysql-connector-j -->
<dependency>
<groupId>com.mysql</groupId>
<artifactId>mysql-connector-j</artifactId>
<version>8.4.0</version>
</dependency>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<optional>true</optional>
</dependency>
<dependency>
<groupId>javax.xml.bind</groupId>
<artifactId>jaxb-api</artifactId>
<version>2.3.1</version>
</dependency>
<dependency>
<groupId>org.glassfish.jaxb</groupId>
<artifactId>jaxb-runtime</artifactId>
<version>2.3.1</version>
</dependency>
<dependency>
<groupId>org.yaml</groupId>
<artifactId>snakeyaml</artifactId>
</dependency>
<!-- https://mvnrepository.com/artifact/com.baomidou/mybatis-plus-spring-boot3-starter -->
<dependency>
<groupId>com.baomidou</groupId>
<artifactId>mybatis-plus-spring-boot3-starter</artifactId>
<version>3.5.7</version>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-jdbc</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
</dependencies>
配置mysql读写分离后,shardingsphere找不到对应的表的问题(mybatis找不到表) (单表配置规则)
捏m个bei的,弄了我3个小时
新版本的shardingsphere有个坑比的地方,就是它如果要读取表的话
我们这里要有个单表规则类配置
不然我们成功连接后,shardingsphere竟然莫名奇妙地找不到我们的对应的表
我配置规则
可以管理所有数据库里面的所有表
然后指定我们的默认数据库
这上面目前是一个数据源,然后我们配置成功了,终于可以成功连接了
读写分离配置
记住,我们要跟着对应版本的文档来进行操作,不同版本文档配置是不同的
基本的读写分离配置
这个是我们的shardingsphere配置
dataSources:
master:
dataSourceClassName: com.zaxxer.hikari.HikariDataSource
driverClassName: com.mysql.cj.jdbc.Driver
jdbcUrl: jdbc:mysql://192.168.88.130:3306/db_user?useUnicode=true&characterEncoding=UTF-8&rewriteBatchedStatements=true&allowMultiQueries=true&serverTimezone=Asia/Shanghai&allowPublicKeyRetrieval=true
username: root
password: 382673
slave1:
dataSourceClassName: com.zaxxer.hikari.HikariDataSource
driverClassName: com.mysql.cj.jdbc.Driver
jdbcUrl: jdbc:mysql://192.168.88.130:3307/db_user?useUnicode=true&characterEncoding=UTF-8&rewriteBatchedStatements=true&allowMultiQueries=true&serverTimezone=Asia/Shanghai&allowPublicKeyRetrieval=true
username: root
password: 382673
slave3:
dataSourceClassName: com.zaxxer.hikari.HikariDataSource
driverClassName: com.mysql.cj.jdbc.Driver
jdbcUrl: jdbc:mysql://192.168.88.130:3308/db_user?useUnicode=true&characterEncoding=UTF-8&rewriteBatchedStatements=true&allowMultiQueries=true&serverTimezone=Asia/Shanghai&allowPublicKeyRetrieval=true
username: root
password: 382673
rules:
- !READWRITE_SPLITTING
dataSources:
readwrite_ds:
writeDataSourceName: master
readDataSourceNames:
- slave1
- slave3
transactionalReadQueryStrategy: PRIMARY
loadBalancerName: kira
loadBalancers:
kira:
type: ROUND_ROBIN
- !SINGLE
tables: #我们的单表配置
- "*.*.*"
defaultDataSource: master # 默认数据源,仅在执行 CREATE TABLE 创建单表时有效。缺失值为空,表示随机单播路由。
props: #我们打印SQL语句
sql-show: true