<
>

SpringBoot项目中如何实现MySQL读写分离详解

2022-07-10 09:48:11 来源:易采站长站 作者:

目录
1、MySQL主从复制1.1、介绍二进制日志:MySQL复制过程分成三步:1.2、主从库搭建1.2.1、主库配置1.2.2、从库配置1.3、坑位介绍1.3.1、UUID报错1.3.2、server_id报错1.3.3、同步异常解决操作不规范,亲人两行泪……2、项目中实现2.1、ShardingJDBC2.2、依赖导入2.3、配置文件2.4、测试跑路总结

1、MySQL主从复制

但我们仔细观察我们会发现,当我们的项目都是用的单体数据库时,那么就可能会存在如下问题:

    读和写所有压力都由一台数据库承担, 压力大数据库服务器磁盘损坏则 数据丢失 ,单点故障

    为了解决上述提到的两个问题,我们可以准备两>

    在这种读写分离的结构中,从库是可以有多个的

    1.1、介绍

    MySQL主从复制是一个 异步 的复制过程,底层是基于Mysql数据库自带的 二进制日志 功能。就是一台或多台MySQL数据库(slave,即 从库 )从另一台MySQL数据库(master,即 主库 )进行日志的复制,然后再解析日志并应用到自身,最终实现 从库 的数据和 主库 的数据保持一致。MySQL主从复制是>

    二进制日志:

    二进制日志(BINLOG)记录了所有的>

    MySQL复制过程分成三步:

      MySQL>slave将master的binary log拷贝到它的中继日志( relay log )slave重做中继日志中的事件,将数据变更反映它自己的数据

      1.2、主从库搭建

      在环境搭建之前,我们需要准备好两台服务器,如果生活富裕使用的是两台云服务器的时候记得要开放安全组,即防火墙;如果是比狗子我生活好点但也是用的虚拟机的话,记得别分这么多内存启动蓝屏了(别问怎么知道的)

      这里就不给大家展示数据库的安装和防火墙的操作了,这个我感觉网上好多资源都能够满足遇到的问题,在搭建主从库的时候有在网上见到过说MySQL版本要一致的,我也没太留意直接就在之前的MySQL上操作了,大家可以自己去验证一下。

      1.2.1、主库配置

      服务器:192.168.150.100(别试了黑不了的,这是虚拟机的ip)

      1、修改Mysql数据库的配置文件 vim>

      在打开的文件中加入下面两行,其中的server-id不一定是100,确保唯一即可
      log-bin=mysql-bin   #[必须]启用二进制日志
      server-id=100       #[必须]服务器唯一ID
      

      2、重启Mysql服务

      这里有三个方法都能重启MySQL,最简单的无疑就是一关一开:

      net stop mysql;net start mysql;
      systemctl restart mysqld
      service mysqld restart
      

      3、创建数据同步的用户并授权

      登录进去MySQL之后才能够执行下面的命令,因为这是SQL命令,Linux不认识这玩意是啥。

      GRANT REPLICATION SLAVE ON *.* to '用户名'@'开放的地址' identified by '密码';
      eg: GRANT REPLICATION SLAVE ON *.* to 'masterDb'@'%' identified by 'Master@123456';
      记得刷一下权限
      FLUSH PRIVILEGES;
      

      4、查看master同步状态

      这个时候还 不用退出MySQL ,因为下面的命令还是SQL命令,执行下面的SQL,可以拿到我们后面需要的两个重要参数。

      show master status;
      

      执行完这一句SQL之后,==不要再操作主库!不要再操作主库!不要再操作主库!==重要的事情说三遍,因为再操作主库之后可能会导致红框中的 两个属性值会发生变化 ,后面如果发生了错误可能就和这里有那么两毛钱关系了。

      1.2.2、从库配置

      服务器:192.168.150.101(别试了黑不了的,这也是虚拟机的ip)

      1、>

      这里要注意server-id和主库以及其他从库都不能相同,否则后面将会配置不成功。

      2、重启Mysql服务

      这里有三个方法都能重启MySQL,最简单的无疑就是一关一开:

      net stop mysql;net start mysql;
      systemctl restart mysqld
      service mysqld restart
      

      3、设置主库地址及同步位置

      登录进去MySQL之后才能够执行下面的命令,因为这是SQL命令

      设置主库地址和同步位置
      change master to master_host='192.168.150.100',master_user='masterDb',master_password='Master@123456',master_log_file='mysql-bin.000010',master_log_pos=68479;
      记得记得开启从库配置
      start slave;
      

      参数说明:

        master_host: 主库的 IP地址master_user: 访问主库进行主从复制的 用户名 ( 上面在主库创建的 )master_password: 访问主库进行主从复制的用户名对应的 密码master_log_file: 从哪个 日志文件 开始同步 ( 即1.2.1中第4步获取的 File )master_log_pos: 从指定日志文件的哪个 位置 开始同步 ( 即1.2.1中第4步获取的 Position )

        4、查看从数据库的状态

        这个时候还 不用退出MySQL ,因为下面的命令还是SQL命令,执行下面的SQL,可以看到从库的状态信息。通过状态信息中的 Slave_IO_running 和 Slave_SQL_running 可以看出主从同步是否就绪,如果这两个参数全为 Yes ,表示主从同步已经配置完成。

        show slave status\G;
        

        1.3、坑位介绍

        1.3.1、UUID报错

        这可能是由于linux>vim /var/lib/mysql/auto.cnf

        1.3.2、server_id报错

        这应该就是各位大牛设置server_id的时候不小心设置相同的id了,修改过来就行,步骤在上面的配置中。

        1.3.3、同步异常解决

        这是狗子在操作过程中搞出来的一个错误……

        出错的原因是在主库中删除了用户信息,但是在从库中同步的时候失败导致同步停止,下面记录自己的操作(是在进入MySQL的操作且是从库)。

        MASTER_LOG_POS
        
        STOP SLAVE;
        SET GLOBAL SQL_SLAVE_SKIP_COUNTER=1;
        START SLAVE;
        SHOW SLAVE STATUS\G;
        

        在数据库中操作时,一定要注意当前所在的数据库是哪个,作为一个良好的实践:在SQL语句前加 USE dbname 。

        操作不规范,亲人两行泪……

        2、项目中实现

        2.1、ShardingJDBC

        Sharding-JDBC定位为 轻量级Java框架 ,在Java的JDBC层提供的额外服务。>

        使用Sharding-JDBC可以在程序中轻松的实现数据库 读写分离 。

        Sharding-JDBC具有以下几个特点:

          适用于任何基于JDBC的ORM框架,如:JPA, Hibernate, Mybatis, Spring JDBC Template或直接使用JDBC。支持任何第三方的数据库连接池,如:DBCP, C3P0, BoneCP, Druid, HikariCP等。支持任意实现JDBC规范的数据库。目前支持MySQL,Oracle,SQLServer,PostgreSQL以及任何遵循SQL92标准的数据库。

          下面我们将用ShardingJDBC在项目中实现MySQL的读写分离。

          2.2、依赖导入

          在pom.xml文件中导入ShardingJDBC的依赖坐标

          <!--sharding-jdbc-->
          <dependency>
              <groupId>org.apache.shardingsphere</groupId>
              <artifactId>sharding-jdbc-spring-boot-starter</artifactId>
              <version>4.0.0-RC1</version>
          </dependency>
          

          2.3、配置文件

          在application.yml中增加数据源的配置

          spring:
            shardingsphere:
              datasource:
                names:
                  master,slave
                # 主数据源
                master:
                  type: com.alibaba.druid.pool.DruidDataSource
                  driver-class-name: com.mysql.cj.jdbc.Driver
                  url: jdbc:mysql://192.168.150.100:3306/db_test?useUnicode=true&characterEncoding=utf-8&useSSL=false
                  username: root
                  password: 123456
                # 从数据源
                slave:
                  type: com.alibaba.druid.pool.DruidDataSource
                  driver-class-name: com.mysql.cj.jdbc.Driver
                  url: jdbc:mysql://192.168.150.101:3306/db_test?useUnicode=true&characterEncoding=utf-8&useSSL=false
                  username: root
                  password: 123456
              masterslave:
                # 读写分离配置,设置负载均衡的模式为轮询
                load-balance-algorithm-type: round_robin
                # 最终的数据源名称
                name: dataSource
                # 主库数据源名称
                master-data-source-name: master
                # 从库数据源名称列表,多个逗号分隔
                slave-data-source-names: slave
              props:
                sql:
                  show: true #开启SQL显示,默认false
            # 覆盖注册bean,后面创建数据源会覆盖前面创建的数据源
            main:
              allow-bean-definition-overriding: true
          

          2.4、测试跑路

          这时我们就可以对我们项目中的配置进行一个测试,下面分别调用一个更新接口和一个查询接口,通过查看日志中记录的数据源来判断是否能够按照我们预料中的跑。

            更新操作(写操作)

              查询操作(读操作)

              搞定!!!程序正常按照我们预期的成功跑起来了,成功借助ShardingJDBC在我们项目中实现了数据库的读写分离。

              总结

              到此这篇关于SpringBoot项目中如何实现MySQL读写分离的文章就介绍到这了,更多相关SpringBoot MySQL读写分离内容请搜索易采站长站以前的文章或继续浏览下面的相关文章希望大家以后多多支持易采站长站!

暂时禁止评论

微信扫一扫

易采站长站微信账号