使用Docker搭建MySql的主从同步+ShardingSphere搭建Mysql的读写分离 ...

打印 上一主题 下一主题

主题 520|帖子 520|积分 1560

参考课程

尚硅谷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格式
记住差别版本的依靠对应差别的官方文档,不然会启动不了大概许多配置和之前差别从而导致错误

跟着官网配置
数据源配置 :: ShardingSphere
且我们使用的YAML格式的配置,不是properties格式的配置


我们差别的版本要根据差别的文档来进行配置


我用的是5.4.1

经典的Spring配置文件


  1. server:
  2.   port: 8001
  3. spring:
  4.   application:
  5.   name: ShardingSphere-test
  6.   datasource:
  7.     # ShardingSphere 的驱动
  8.     driver-class-name: org.apache.shardingsphere.driver.ShardingSphereDriver
  9.     # ShardingSphere 的url
  10.     url: jdbc:shardingsphere:classpath:shardingsphere--config.yaml
复制代码

读写分离配置
记得我们url背面要加许多东西,不然连接不上
还有单表配置必须写,不然shardingsphere找不到表
  1. dataSources:
  2.   master:
  3.     dataSourceClassName: com.zaxxer.hikari.HikariDataSource
  4.     driverClassName: com.mysql.cj.jdbc.Driver
  5.     jdbcUrl: jdbc:mysql://192.168.88.130:3306/db_user?useUnicode=true&characterEncoding=UTF-8&rewriteBatchedStatements=true&allowMultiQueries=true&serverTimezone=Asia/Shanghai&allowPublicKeyRetrieval=true
  6.     username: root
  7.     password: 382673
  8.   slave1:
  9.     dataSourceClassName: com.zaxxer.hikari.HikariDataSource
  10.     driverClassName: com.mysql.cj.jdbc.Driver
  11.     jdbcUrl: jdbc:mysql://192.168.88.130:3307/db_user?useUnicode=true&characterEncoding=UTF-8&rewriteBatchedStatements=true&allowMultiQueries=true&serverTimezone=Asia/Shanghai&allowPublicKeyRetrieval=true
  12.     username: root
  13.     password: 382673
  14.   slave3:
  15.     dataSourceClassName: com.zaxxer.hikari.HikariDataSource
  16.     driverClassName: com.mysql.cj.jdbc.Driver
  17.     jdbcUrl: jdbc:mysql://192.168.88.130:3308/db_user?useUnicode=true&characterEncoding=UTF-8&rewriteBatchedStatements=true&allowMultiQueries=true&serverTimezone=Asia/Shanghai&allowPublicKeyRetrieval=true
  18.     username: root
  19.     password: 382673
  20. # 这个是我们的读写分离配置
  21. rules:
  22.   - !READWRITE_SPLITTING
  23.     dataSources:
  24.       readwrite_ds:
  25.         writeDataSourceName: master
  26.         readDataSourceNames:
  27.           - slave1
  28.           - slave3
  29.         transactionalReadQueryStrategy: PRIMARY
  30.         loadBalancerName: kira
  31.     loadBalancers:
  32.       kira:
  33.         type: ROUND_ROBIN
  34.   - !SINGLE
  35.     tables:        #我们的单表配置
  36.       - "*.*.*"
  37.     defaultDataSource: master # 默认数据源,仅在执行 CREATE TABLE 创建单表时有效。缺失值为空,表示随机单播路由。
  38. props:         #我们打印SQL语句
  39.   sql-show: true
复制代码

垂直分片配置

  1. dataSources:
  2.   user:
  3.     dataSourceClassName: com.zaxxer.hikari.HikariDataSource
  4.     driverClassName: com.mysql.cj.jdbc.Driver
  5.     jdbcUrl: jdbc:mysql://192.168.88.130:3301/db_user?useUnicode=true&characterEncoding=UTF-8&rewriteBatchedStatements=true&allowMultiQueries=true&serverTimezone=Asia/Shanghai&allowPublicKeyRetrieval=true
  6.     username: root
  7.     password: 123456
  8.   order:
  9.     dataSourceClassName: com.zaxxer.hikari.HikariDataSource
  10.     driverClassName: com.mysql.cj.jdbc.Driver
  11.     jdbcUrl: jdbc:mysql://192.168.88.130:3302/db_order?useUnicode=true&characterEncoding=UTF-8&rewriteBatchedStatements=true&allowMultiQueries=true&serverTimezone=Asia/Shanghai&allowPublicKeyRetrieval=true
  12.     username: root
  13.     password: 123456
  14. rules:
  15.   - !SINGLE
  16.     tables:        #我们的单表配置
  17.       - "*.*.*"
  18.     defaultDataSource: user # 默认数据源,仅在执行 CREATE TABLE 创建单表时有效。缺失值为空,表示随机单播路由。
  19.   - !SHARDING
  20.     tables:
  21.       t_user:  #逻辑表
  22.         actualDataNodes: user.t_user #不同的表在不同的数据源,配置我们对应的数据源  这样我们就把逻辑表和真实节点映射了
  23.       t_order:  #逻辑表
  24.         actualDataNodes: order.t_order #不同的表在不同的数据源,配置我们对应的数据源      这样我们就把逻辑表和真实节点映射了
  25. props:         #我们打印SQL语句
  26.   sql-show: true
复制代码

水平分片配置

  1. dataSources:
  2.   user:
  3.     dataSourceClassName: com.zaxxer.hikari.HikariDataSource
  4.     driverClassName: com.mysql.cj.jdbc.Driver
  5.     jdbcUrl: jdbc:mysql://192.168.88.130:3301/db_user?useUnicode=true&characterEncoding=UTF-8&rewriteBatchedStatements=true&allowMultiQueries=true&serverTimezone=Asia/Shanghai&allowPublicKeyRetrieval=true
  6.     username: root
  7.     password: 123456
  8.   order0:
  9.     dataSourceClassName: com.zaxxer.hikari.HikariDataSource
  10.     driverClassName: com.mysql.cj.jdbc.Driver
  11.     jdbcUrl: jdbc:mysql://192.168.88.130:3310/db_order?useUnicode=true&characterEncoding=UTF-8&rewriteBatchedStatements=true&allowMultiQueries=true&serverTimezone=Asia/Shanghai&allowPublicKeyRetrieval=true
  12.     username: root
  13.     password: 123456
  14.   order1:
  15.     dataSourceClassName: com.zaxxer.hikari.HikariDataSource
  16.     driverClassName: com.mysql.cj.jdbc.Driver
  17.     jdbcUrl: jdbc:mysql://192.168.88.130:3311/db_order?useUnicode=true&characterEncoding=UTF-8&rewriteBatchedStatements=true&allowMultiQueries=true&serverTimezone=Asia/Shanghai&allowPublicKeyRetrieval=true
  18.     username: root
  19.     password: 123456
  20. rules:
  21.   - !SINGLE
  22.     tables:        #我们的单表配置
  23.       - "*.*.*"
  24.     defaultDataSource: user # 默认数据源,仅在执行 CREATE TABLE 创建单表时有效。缺失值为空,表示随机单播路由。
  25.   - !SHARDING
  26.     tables:
  27.       t_user:  #逻辑表
  28.         actualDataNodes: user.t_user #不同的表在不同的数据源,配置我们对应的数据源  这样我们就把逻辑表和真实节点映射了
  29.       t_order:
  30.         #逻辑表
  31.         actualDataNodes: order${0..1}.t_order${0..1} #不同的表在不同的数据源,配置我们对应的数据源      这样我们就把逻辑表和真实节点映射了
  32.         databaseStrategy :
  33.           # 用于单分片键的标准分片场景
  34.           standard:
  35.             # 分片键
  36.             shardingColumn: order_no
  37.             # 分片算法
  38.             shardingAlgorithmName: kira
  39.         # 分表策略
  40.         tableStrategy:
  41.           # 用于单分片键的标准分片场景
  42.           standard:
  43.             # 分片键
  44.             shardingColumn: user_id
  45.             # 分片算法
  46.             shardingAlgorithmName: kira
  47.     # 分片算法
  48.     shardingAlgorithms:
  49.       # 数据表分片算法
  50.       kira:
  51.         # 根据分片键 Hash 分片
  52.         type: HASH_MOD
  53.         # 分片数量
  54.         props:
  55.           sharding-count: 16
  56. props:         #我们打印SQL语句
  57.   sql-show: true
复制代码

用到的依靠

前面3个额外的依靠是好像是要引入的,不然会有什么类缺失,导致不兼容
然后我们的mybatisplus要指定boot3的版本,不然我们boot3好像执行mybatisplus的时候会报错



  1. <dependencies>
  2.     <dependency>
  3.         <groupId>org.springframework.boot</groupId>
  4.         <artifactId>spring-boot-starter-web</artifactId>
  5.     </dependency>
  6.     <!-- https://mvnrepository.com/artifact/org.apache.shardingsphere/shardingsphere-jdbc-core -->
  7.     <dependency>
  8.         <groupId>org.apache.shardingsphere</groupId>
  9.         <artifactId>shardingsphere-jdbc-core</artifactId>
  10.         <version>5.4.1</version>
  11.     </dependency>
  12.     <!-- https://mvnrepository.com/artifact/com.mysql/mysql-connector-j -->
  13.     <dependency>
  14.         <groupId>com.mysql</groupId>
  15.         <artifactId>mysql-connector-j</artifactId>
  16.         <version>8.4.0</version>
  17.     </dependency>
  18.     <dependency>
  19.         <groupId>org.projectlombok</groupId>
  20.         <artifactId>lombok</artifactId>
  21.         <optional>true</optional>
  22.     </dependency>
  23.     <dependency>
  24.         <groupId>javax.xml.bind</groupId>
  25.         <artifactId>jaxb-api</artifactId>
  26.         <version>2.3.1</version>
  27.     </dependency>
  28.     <dependency>
  29.         <groupId>org.glassfish.jaxb</groupId>
  30.         <artifactId>jaxb-runtime</artifactId>
  31.         <version>2.3.1</version>
  32.     </dependency>
  33.     <dependency>
  34.         <groupId>org.yaml</groupId>
  35.         <artifactId>snakeyaml</artifactId>
  36.     </dependency>
  37.     <!-- https://mvnrepository.com/artifact/com.baomidou/mybatis-plus-spring-boot3-starter -->
  38.     <dependency>
  39.         <groupId>com.baomidou</groupId>
  40.         <artifactId>mybatis-plus-spring-boot3-starter</artifactId>
  41.         <version>3.5.7</version>
  42.     </dependency>
  43.     <dependency>
  44.         <groupId>org.springframework.boot</groupId>
  45.         <artifactId>spring-boot-starter-jdbc</artifactId>
  46.     </dependency>
  47.     <dependency>
  48.         <groupId>org.springframework.boot</groupId>
  49.         <artifactId>spring-boot-starter-test</artifactId>
  50.         <scope>test</scope>
  51.     </dependency>
  52. </dependencies>
复制代码

我在真实项目中使用的是5.4.1版本


首先我配置好了mysql的主从模式
然后在shardingsphere里面来配置我们的读写分离
根本使用+报错












mybatis依靠冲突,启动报错

我们使用这个boot3的依靠包







由于一些特别的报错,我还引入了这三个依靠



现在是目前有的依靠
  1. <dependencies>
  2.     <dependency>
  3.         <groupId>org.springframework.boot</groupId>
  4.         <artifactId>spring-boot-starter-web</artifactId>
  5.     </dependency>
  6.     <!-- https://mvnrepository.com/artifact/org.apache.shardingsphere/shardingsphere-jdbc-core -->
  7.     <dependency>
  8.         <groupId>org.apache.shardingsphere</groupId>
  9.         <artifactId>shardingsphere-jdbc-core</artifactId>
  10.         <version>5.4.1</version>
  11.     </dependency>
  12.     <!-- https://mvnrepository.com/artifact/com.mysql/mysql-connector-j -->
  13.     <dependency>
  14.         <groupId>com.mysql</groupId>
  15.         <artifactId>mysql-connector-j</artifactId>
  16.         <version>8.4.0</version>
  17.     </dependency>
  18.     <dependency>
  19.         <groupId>org.projectlombok</groupId>
  20.         <artifactId>lombok</artifactId>
  21.         <optional>true</optional>
  22.     </dependency>
  23.     <dependency>
  24.         <groupId>javax.xml.bind</groupId>
  25.         <artifactId>jaxb-api</artifactId>
  26.         <version>2.3.1</version>
  27.     </dependency>
  28.     <dependency>
  29.         <groupId>org.glassfish.jaxb</groupId>
  30.         <artifactId>jaxb-runtime</artifactId>
  31.         <version>2.3.1</version>
  32.     </dependency>
  33.     <dependency>
  34.         <groupId>org.yaml</groupId>
  35.         <artifactId>snakeyaml</artifactId>
  36.     </dependency>
  37.     <!-- https://mvnrepository.com/artifact/com.baomidou/mybatis-plus-spring-boot3-starter -->
  38.     <dependency>
  39.         <groupId>com.baomidou</groupId>
  40.         <artifactId>mybatis-plus-spring-boot3-starter</artifactId>
  41.         <version>3.5.7</version>
  42.     </dependency>
  43.     <dependency>
  44.         <groupId>org.springframework.boot</groupId>
  45.         <artifactId>spring-boot-starter-jdbc</artifactId>
  46.     </dependency>
  47.     <dependency>
  48.         <groupId>org.springframework.boot</groupId>
  49.         <artifactId>spring-boot-starter-test</artifactId>
  50.         <scope>test</scope>
  51.     </dependency>
  52. </dependencies>
复制代码

配置mysql读写分离后,shardingsphere找不到对应的表的问题(mybatis找不到表) (单表配置规则)

捏m个bei的,弄了我3个小时

新版本的shardingsphere有个坑比的地方,就是它如果要读取表的话
我们这里要有个单表规则类配置
不然我们成功连接后,shardingsphere竟然莫名奇妙地找不到我们的对应的表





我配置规则
可以管理所有数据库里面的所有表
然后指定我们的默认数据库



这上面目前是一个数据源,然后我们配置成功了,终于可以成功连接了


读写分离配置

记住,我们要跟着对应版本的文档来进行操纵,差别版本文档配置是差别的

根本的读写分离配置

这个是我们的shardingsphere配置
  1. dataSources:
  2.   master:
  3.     dataSourceClassName: com.zaxxer.hikari.HikariDataSource
  4.     driverClassName: com.mysql.cj.jdbc.Driver
  5.     jdbcUrl: jdbc:mysql://192.168.88.130:3306/db_user?useUnicode=true&characterEncoding=UTF-8&rewriteBatchedStatements=true&allowMultiQueries=true&serverTimezone=Asia/Shanghai&allowPublicKeyRetrieval=true
  6.     username: root
  7.     password: 382673
  8.   slave1:
  9.     dataSourceClassName: com.zaxxer.hikari.HikariDataSource
  10.     driverClassName: com.mysql.cj.jdbc.Driver
  11.     jdbcUrl: jdbc:mysql://192.168.88.130:3307/db_user?useUnicode=true&characterEncoding=UTF-8&rewriteBatchedStatements=true&allowMultiQueries=true&serverTimezone=Asia/Shanghai&allowPublicKeyRetrieval=true
  12.     username: root
  13.     password: 382673
  14.   slave3:
  15.     dataSourceClassName: com.zaxxer.hikari.HikariDataSource
  16.     driverClassName: com.mysql.cj.jdbc.Driver
  17.     jdbcUrl: jdbc:mysql://192.168.88.130:3308/db_user?useUnicode=true&characterEncoding=UTF-8&rewriteBatchedStatements=true&allowMultiQueries=true&serverTimezone=Asia/Shanghai&allowPublicKeyRetrieval=true
  18.     username: root
  19.     password: 382673
  20. rules:
  21.   - !READWRITE_SPLITTING
  22.     dataSources:
  23.       readwrite_ds:
  24.         writeDataSourceName: master
  25.         readDataSourceNames:
  26.           - slave1
  27.           - slave3
  28.         transactionalReadQueryStrategy: PRIMARY
  29.         loadBalancerName: kira
  30.     loadBalancers:
  31.       kira:
  32.         type: ROUND_ROBIN
  33.   - !SINGLE
  34.     tables:        #我们的单表配置
  35.       - "*.*.*"
  36.     defaultDataSource: master # 默认数据源,仅在执行 CREATE TABLE 创建单表时有效。缺失值为空,表示随机单播路由。
  37. props:         #我们打印SQL语句
  38.   sql-show: true
复制代码























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

使用道具 举报

0 个回复

正序浏览

快速回复

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

本版积分规则

我爱普洱茶

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

标签云

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