찾다
Javajava지도 시간SpringBoot 프로젝트에서 MySQL 읽기 및 쓰기 분리를 구현하는 방법

    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 중국어 웹사이트의 기타 관련 기사를 참조하세요!

    성명
    이 기사는 亿速云에서 복제됩니다. 침해가 있는 경우 admin@php.cn으로 문의하시기 바랍니다. 삭제
    고급 Java 프로젝트 관리, 구축 자동화 및 종속성 해상도에 Maven 또는 Gradle을 어떻게 사용합니까?고급 Java 프로젝트 관리, 구축 자동화 및 종속성 해상도에 Maven 또는 Gradle을 어떻게 사용합니까?Mar 17, 2025 pm 05:46 PM

    이 기사에서는 Java 프로젝트 관리, 구축 자동화 및 종속성 해상도에 Maven 및 Gradle을 사용하여 접근 방식과 최적화 전략을 비교합니다.

    적절한 버전 및 종속성 관리로 Custom Java 라이브러리 (JAR Files)를 작성하고 사용하려면 어떻게해야합니까?적절한 버전 및 종속성 관리로 Custom Java 라이브러리 (JAR Files)를 작성하고 사용하려면 어떻게해야합니까?Mar 17, 2025 pm 05:45 PM

    이 기사에서는 Maven 및 Gradle과 같은 도구를 사용하여 적절한 버전 및 종속성 관리로 사용자 정의 Java 라이브러리 (JAR Files)를 작성하고 사용하는 것에 대해 설명합니다.

    카페인 또는 구아바 캐시와 같은 라이브러리를 사용하여 자바 애플리케이션에서 다단계 캐싱을 구현하려면 어떻게해야합니까?카페인 또는 구아바 캐시와 같은 라이브러리를 사용하여 자바 애플리케이션에서 다단계 캐싱을 구현하려면 어떻게해야합니까?Mar 17, 2025 pm 05:44 PM

    이 기사는 카페인 및 구아바 캐시를 사용하여 자바에서 다단계 캐싱을 구현하여 응용 프로그램 성능을 향상시키는 것에 대해 설명합니다. 구성 및 퇴거 정책 관리 Best Pra와 함께 설정, 통합 및 성능 이점을 다룹니다.

    캐싱 및 게으른 하중과 같은 고급 기능을 사용하여 객체 관계 매핑에 JPA (Java Persistence API)를 어떻게 사용하려면 어떻게해야합니까?캐싱 및 게으른 하중과 같은 고급 기능을 사용하여 객체 관계 매핑에 JPA (Java Persistence API)를 어떻게 사용하려면 어떻게해야합니까?Mar 17, 2025 pm 05:43 PM

    이 기사는 캐싱 및 게으른 하중과 같은 고급 기능을 사용하여 객체 관계 매핑에 JPA를 사용하는 것에 대해 설명합니다. 잠재적 인 함정을 강조하면서 성능을 최적화하기위한 설정, 엔티티 매핑 및 모범 사례를 다룹니다. [159 문자]

    Java의 클래스로드 메커니즘은 다른 클래스 로더 및 대표 모델을 포함하여 어떻게 작동합니까?Java의 클래스로드 메커니즘은 다른 클래스 로더 및 대표 모델을 포함하여 어떻게 작동합니까?Mar 17, 2025 pm 05:35 PM

    Java의 클래스 로딩에는 부트 스트랩, 확장 및 응용 프로그램 클래스 로더가있는 계층 적 시스템을 사용하여 클래스로드, 링크 및 초기화 클래스가 포함됩니다. 학부모 위임 모델은 핵심 클래스가 먼저로드되어 사용자 정의 클래스 LOA에 영향을 미치도록합니다.

    See all articles

    핫 AI 도구

    Undresser.AI Undress

    Undresser.AI Undress

    사실적인 누드 사진을 만들기 위한 AI 기반 앱

    AI Clothes Remover

    AI Clothes Remover

    사진에서 옷을 제거하는 온라인 AI 도구입니다.

    Undress AI Tool

    Undress AI Tool

    무료로 이미지를 벗다

    Clothoff.io

    Clothoff.io

    AI 옷 제거제

    AI Hentai Generator

    AI Hentai Generator

    AI Hentai를 무료로 생성하십시오.

    인기 기사

    R.E.P.O. 에너지 결정과 그들이하는 일 (노란색 크리스탈)
    3 몇 주 전By尊渡假赌尊渡假赌尊渡假赌
    R.E.P.O. 최고의 그래픽 설정
    3 몇 주 전By尊渡假赌尊渡假赌尊渡假赌
    R.E.P.O. 아무도들을 수없는 경우 오디오를 수정하는 방법
    3 몇 주 전By尊渡假赌尊渡假赌尊渡假赌
    WWE 2K25 : Myrise에서 모든 것을 잠금 해제하는 방법
    4 몇 주 전By尊渡假赌尊渡假赌尊渡假赌

    뜨거운 도구

    ZendStudio 13.5.1 맥

    ZendStudio 13.5.1 맥

    강력한 PHP 통합 개발 환경

    SublimeText3 영어 버전

    SublimeText3 영어 버전

    권장 사항: Win 버전, 코드 프롬프트 지원!

    DVWA

    DVWA

    DVWA(Damn Vulnerable Web App)는 매우 취약한 PHP/MySQL 웹 애플리케이션입니다. 주요 목표는 보안 전문가가 법적 환경에서 자신의 기술과 도구를 테스트하고, 웹 개발자가 웹 응용 프로그램 보안 프로세스를 더 잘 이해할 수 있도록 돕고, 교사/학생이 교실 환경 웹 응용 프로그램에서 가르치고 배울 수 있도록 돕는 것입니다. 보안. DVWA의 목표는 다양한 난이도의 간단하고 간단한 인터페이스를 통해 가장 일반적인 웹 취약점 중 일부를 연습하는 것입니다. 이 소프트웨어는

    SublimeText3 중국어 버전

    SublimeText3 중국어 버전

    중국어 버전, 사용하기 매우 쉽습니다.

    에디트플러스 중국어 크랙 버전

    에디트플러스 중국어 크랙 버전

    작은 크기, 구문 강조, 코드 프롬프트 기능을 지원하지 않음