使用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

配置文件里面的内容

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

复制代码
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

相关推荐
程序员云帆哥1 分钟前
MySQL JDBC Driver URL参数配置规范
数据库·mysql·jdbc
TDengine (老段)18 分钟前
TDengine 数学函数 FLOOR 用户手册
大数据·数据库·物联网·时序数据库·iot·tdengine·涛思数据
Olrookie38 分钟前
若依前后端分离版学习笔记(二十)——实现滑块验证码(vue3)
java·前端·笔记·后端·学习·vue·ruoyi
大气层煮月亮1 小时前
Oracle EBS ERP开发——报表生成Excel标准模板设计
数据库·oracle·excel
云和数据.ChenGuang1 小时前
达梦数据库的命名空间
数据库·oracle
倚栏听风雨1 小时前
java.lang.SecurityException异常
java
星河队长1 小时前
VS创建C++动态库和C#访问过程
java·c++·c#
三三木木七2 小时前
mysql拒绝连接
数据库·mysql
蹦跶的小羊羔2 小时前
sql数据库语法
数据库·sql
唐古乌梁海2 小时前
【mysql】InnoDB的聚簇索引和非聚簇索引工作原理
数据库·mysql