我爱普洱茶 发表于 2024-7-28 17:30:02

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

参考课程

尚硅谷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



配置文件里面的内容



# 服务器唯一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;

https://img-blog.csdnimg.cn/img_convert/7241d5a156afc0a3caf7a83b92551549.png

从服务器



创建容器


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


配置文件的内容



# 服务器唯一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;
具体的值要根据我们之前查出来的主库的值来配置

https://img-blog.csdnimg.cn/img_convert/7241d5a156afc0a3caf7a83b92551549.png

开启主从同步

START SLAVE;

-- 检察状态(不需要分号)
SHOW SLAVE STATUS\G

这两个都是YES,那么我们就是成功了

https://img-blog.csdnimg.cn/img_convert/1cb0492591cacd8aeb596447c6748160.png
这个位置检察我们的错误

https://img-blog.csdnimg.cn/img_convert/07011a18eed8b051ad2f8002289dbba5.png
两个常见报错


https://img-blog.csdnimg.cn/img_convert/840afe48f072ae6bb29c0a1f28a5776e.png
这个是我们没关防火墙时就启动了docker,即使背面我们关闭防火墙docker里面还是没用

https://img-blog.csdnimg.cn/img_convert/b3f2347b6947c140cfcf360645e91cd6.png

搭建主从集群时碰到的错误


用户插件错误

https://img-blog.csdnimg.cn/img_convert/85ec53aee94499b9c0e3eb40a8a0487b.png
我们要修改我们的身份验证插件

https://img-blog.csdnimg.cn/img_convert/e87d47dda6357331d98068c19f0ed756.png

https://img-home.csdnimg.cn/images/20230724024159.png?origin_url=https%3A%2F%2Fcdn.nlark.com%2Fyuque%2F0%2F2024%2Fpng%2F40367092%2F1718521480288-05c5d072-2217-46b0-b463-498194c9118c.png&pos_id=GVPjs8ZH
我们在主库重新弄我们的KIRA用户的认证插件


ALTER USER 'KIRA'@'%' IDENTIFIED BY '382673';

ALTER USER 'KIRA'@'%' IDENTIFIED WITH mysql_native_password BY '382673';

docker restart mysql-kira-master


小重点


https://img-blog.csdnimg.cn/img_convert/be21dded6a735c95e40d3b141ccb11dc.png

https://img-blog.csdnimg.cn/img_convert/eb97f4050ed44b2a86a019d914e10d12.png
这两个KIRA用户是差别的,我们配置的是%的KIRA用户
如果我们修改的是上面那个指定IP的KIRA用户
那我们还是失败的
由于我们主机创建的KIRA用户是下面的
上面的用户都不存在
而且我们使用的KIRA用户也是%的KIRA用户
https://img-blog.csdnimg.cn/img_convert/de1313fd81254f8a79a7109626cce620.png
你看,我们的用户创建的时候,没有指定IP地址,而是%
https://img-blog.csdnimg.cn/img_convert/fc2895f1af69b29dc2feab1a34978c09.png
经典报错

我们修改完认证插件后,我们呢还要重启我们的主库

我们的主库的状态如果我们不刷新,我们看不到改变的,一样寻常错误都是那个指定主库的代码堕落了

https://img-blog.csdnimg.cn/img_convert/bf75a90e48477260ccfef1d5c23dfb75.png
你看,刷新之后我们的file的版本号就变了

解决报错的经典代码,一样寻常这些步调就够了


-- 在从机制止slave
SLAVE STOP;

-- 在主机检察mater状态
SHOW MASTER STATUS;

-- 在主机刷新日志
FLUSH LOGS;

-- 再次在主机检察mater状态(会发现File和Position发生了变化)

SHOW MASTER STATUS;
-- 修改从机连接主机的SQL,并重新连接即可
ShardingSphere搭建mysql数据库的读写分离

尚硅谷的课程教的是properties格式
我以为这个可读性太差了
所以我用的是yml格式
记住差别版本的依靠对应差别的官方文档,不然会启动不了大概许多配置和之前差别从而导致错误

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

https://img-blog.csdnimg.cn/img_convert/17fde329214b948dfcd85556ffedf2df.png
我们差别的版本要根据差别的文档来进行配置

https://img-blog.csdnimg.cn/img_convert/e8e21978cedbd43a61d6f58e621f604b.png
我用的是5.4.1
经典的Spring配置文件

https://img-blog.csdnimg.cn/img_convert/a75a1a9d5ca9f677a79669f57a4b80c6.png
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的时候会报错
https://img-blog.csdnimg.cn/img_convert/0031c76cb936263fb4ab7118ffce4a19.png


<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里面来配置我们的读写分离
根本使用+报错


https://img-blog.csdnimg.cn/img_convert/df2ad4e4c2fdab6f705bc5e5829e9f07.png


https://img-blog.csdnimg.cn/img_convert/9946ba1c41f8d97865ecd353517e9a04.png


https://img-blog.csdnimg.cn/img_convert/43210d84f6d2607ebd4c94bc7770317c.png



mybatis依靠冲突,启动报错
https://img-blog.csdnimg.cn/img_convert/20de36f9f3626c1ad8bd6c089d8c5ecf.png
我们使用这个boot3的依靠包

https://img-blog.csdnimg.cn/img_convert/756d552b91e166f955442317b3232324.png



https://img-blog.csdnimg.cn/img_convert/7bfec50db11dd72f6c0bfeb2234a72a3.png

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


https://img-blog.csdnimg.cn/img_convert/00ed2456cdef8b9b378e3cd948a419a9.png
现在是目前有的依靠
<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竟然莫名奇妙地找不到我们的对应的表

https://img-blog.csdnimg.cn/img_convert/608be2eb3bff6a40a1be18ad1399a134.png


https://img-blog.csdnimg.cn/img_convert/d9849cd755090a0d92a7c0a00e97892a.png
我配置规则
可以管理所有数据库里面的所有表
然后指定我们的默认数据库

https://img-blog.csdnimg.cn/img_convert/55ebd9f1340ae4877131af92bf7dfea4.png

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

读写分离配置

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

根本的读写分离配置

这个是我们的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





















免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。
页: [1]
查看完整版本: 使用Docker搭建MySql的主从同步+ShardingSphere搭建Mysql的读写分离