>  기사  >  Java  >  SpringBoot 프로젝트에서 MySQL 읽기 및 쓰기 분리를 구현하는 방법

SpringBoot 프로젝트에서 MySQL 읽기 및 쓰기 분리를 구현하는 방법

PHPz
PHPz앞으로
2023-05-16 13:31:061525검색

    1. MySQL 마스터-슬레이브 복제

    하지만 자세히 살펴보면 우리 프로젝트가 모두 단일 데이터베이스를 사용할 때 다음과 같은 문제가 있을 수 있습니다.

    • 모두 읽고 쓰기 압력은 모두 하나의 데이터베이스가 부담합니다. 높은 압력

    • 데이터베이스 서버 디스크가 손상되면 데이터가 손실됩니다, 이는 단일 실패 지점입니다

    위의 두 가지 문제를 해결하려면 위에서는 MySQL, 마스터(Master) 서버, 슬레이브(Slave) 서버 두 대를 준비할 수 있습니다. 마스터 데이터베이스의 데이터 변경(쓰기, 업데이트, 삭제 작업)이 필요합니다. 슬레이브 데이터베이스(마스터에서 복사됨)에 동기화됩니다. 사용자가 우리 프로젝트에 접근할 때 쓰기 작업(삽입, 업데이트, 삭제)이면 메인 라이브러리가 직접 작동되고, 읽기 작업(선택)이면 슬레이브 라이브러리가 작동됩니다. 이 구조는 읽기와 쓰기의 분리입니다.

    SpringBoot 프로젝트에서 MySQL 읽기 및 쓰기 분리를 구현하는 방법

    이 읽기-쓰기 분리 구조에는 여러 슬레이브 라이브러리가 있을 수 있습니다.

    1.1 소개

    MySQL 마스터-슬레이브 복제는

    비동기 복제 프로세스입니다. 바이너리 로그 기능. 이는 하나 이상의 MySQL 데이터베이스(슬레이브, 즉 슬레이브 데이터베이스)가 다른 MySQL 데이터베이스(마스터, 즉 메인 데이터베이스)의 로그를 복사한 후 로그를 구문 분석하여 자신에게 적용한다는 의미이며, 마침내 를 달성했습니다. 라이브러리 의 데이터가 메인 라이브러리의 데이터와 일치합니다. MySQL 마스터-슬레이브 복제는 MySQL 데이터베이스에 내장된 기능이며 타사 도구를 사용할 필요가 없습니다.

    바이너리 로그:
    바이너리 로그(BINLOG)는 모든 DDL(데이터 정의 언어) 문과 DML(데이터 조작 언어) 문을 기록하지만 데이터 쿼리 문은 포함하지 않습니다. 이 로그는 재해 발생 시 데이터 복구에 매우 중요한 역할을 합니다. MySQL의 마스터-슬레이브 복제는 이 binlog를 통해 구현됩니다. 기본적으로 MySQL은 이 로그를 활성화하지 않습니다.

    MySQL 복제 프로세스는 세 단계로 나뉩니다.
    • MySQL 마스터는 데이터 변경 사항을 바이너리 로그(

      바이너리 로그)에 기록합니다.

    • 슬레이브는 마스터의 바이너리 로그를 릴레이 로그(

      relay log)에 복사합니다. )

    • 릴레이 로그에 슬레이브 REDO 이벤트를 적용하고 데이터 변경 사항을 자체 데이터에 반영합니다

    SpringBoot 프로젝트에서 MySQL 읽기 및 쓰기 분리를 구현하는 방법

    1.2. 마스터-슬레이브 라이브러리 구축

    환경을 설정하기 전에 서버 두 대를 준비해야 합니다. 당신의 삶이 풍요롭고 두 개의 클라우드 서버를 사용한다면 보안 그룹, 즉 방화벽을 열어야 한다는 것을 기억하십시오. 당신의 삶이 Gouzi의 것보다 낫지만 여전히 가상 머신을 사용한다면, 시작하기 위해 너무 많은 메모리를 사용하지 마십시오. 블루 스크린(어떻게 아는지 묻지 마세요)

    여기에서는 데이터베이스 설치와 방화벽 작동을 보여주지 않겠습니다. 마스터-슬레이브 라이브러리를 구축하다 보니 MySQL 버전이 일관성이 있을 텐데요. 별로 신경 쓰지 않고 이전 MySQL에서 직접 확인해 봤습니다.

    1.2.1. 메인 라이브러리 구성
    서버: 192.168.150.100 (해킹하지 마세요. 가상 머신의 IP입니다.)

    1.Mysql 데이터베이스 vim /etc/my 구성 파일을 수정하세요. .cnf

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

    SpringBoot 프로젝트에서 MySQL 읽기 및 쓰기 분리를 구현하는 방법

    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. 마스터 동기화 상태를 확인하세요

    이때, 다음 명령은 여전히 ​​SQL 명령이기 때문에 MySQL을 종료할 필요는 없습니다. 다음 SQL을 실행하면 두 가지 중요한 매개변수를 얻을 수 있습니다. 나중에 필요해요.

    show master status;

    이 SQL 문장을 실행한 후 == 다시는 메인 데이터베이스를 운영하지 마세요! 더 이상 본관을 운영하지 마세요! 더 이상 본관을 운영하지 마세요! ==중요한 점을 세 번 말씀드립니다. 메인 라이브러리를 운영하다 보면 SpringBoot 프로젝트에서 MySQL 읽기 및 쓰기 분리를 구현하는 방법빨간색 상자 안의 두 가지 속성 값이 변경될 수 있기 때문입니다

    .

    1.2.2、从库配置

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

    1、 修改Mysql数据库的配置文件 vim /etc/my.cnf

    SpringBoot 프로젝트에서 MySQL 읽기 및 쓰기 분리를 구현하는 방법

    这里要注意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;

    SpringBoot 프로젝트에서 MySQL 읽기 및 쓰기 분리를 구현하는 방법

    1.3、坑位介绍

    1.3.1、UUID报错

    这可能是由于linux 是复制出来的,MySQL中还有一个 server_uuid 是一样的,我们也需要修改。 vim /var/lib/mysql/auto.cnf

    SpringBoot 프로젝트에서 MySQL 읽기 및 쓰기 분리를 구현하는 방법

    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层提供的额外服务。 它使用客户端直连数据库,以 jar包 形式提供服务,无需额外部署和依赖,可理解为增强版的JDBC驱动, 完全兼容JDBC和各种ORM框架 。

    使用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、测试跑路

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

    • 更新操作(写操作)

    SpringBoot 프로젝트에서 MySQL 읽기 및 쓰기 분리를 구현하는 방법

    • 查询操作(读操作)

    SpringBoot 프로젝트에서 MySQL 읽기 및 쓰기 분리를 구현하는 방법

    완료! ! ! 프로그램은 예상대로 정상적으로 성공적으로 실행되었으며 ShardingJDBC를 사용하여 프로젝트에서 데이터베이스 읽기 및 쓰기 분리를 성공적으로 실현했습니다.

    위 내용은 SpringBoot 프로젝트에서 MySQL 읽기 및 쓰기 분리를 구현하는 방법의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

    성명:
    이 기사는 yisu.com에서 복제됩니다. 침해가 있는 경우 admin@php.cn으로 문의하시기 바랍니다. 삭제