Springboot+Mysql 8 읽 기와 쓰기 분리 기능 구현

실제 생산 환경 에서 데이터 뱅 크 의 안정성 을 확보 하기 위해 저 희 는 데이터 베이스 에 더 블 핫 준비 체 제 를 설정 합 니 다.그러면 master 데이터 베이스 가 붕 괴 된 후에 slave 데이터 베 이 스 는 즉시 메 인 데이터 베이스 로 전환 할 수 있 습 니 다.메 인 복사 방식 으로 데 이 터 를 메 인 라 이브 러 리 에서 라 이브 러 리 로 같은 단계 로 복사 할 수 있 습 니 다.비 즈 니스 코드 에서 코드 를 작성 하여 읽 기와 쓰기 분 리 를 실현 합 니 다.

다음은 최신 버 전의 Mysql 데이터베이스(8.0.16)를 사용 하여 SpringBoot 와 결합 하여 이 완전한 절 차 를 실현 합 니 다.
설치 설정 mysql
https://dev.mysql.com/downloads/mysql/페이지 에서 my sql 설치 패 키 지 를 다운로드 합 니 다.제 가 다운로드 한 것 은mysql8.0.16 Linux-Generic.입 니 다.
가상 컴퓨터 두 대 를 준비 하여 my sql 을 설치 하고 다운로드 한 파일mysql-8.0.16-linux-glibc2.12-x86_64.tar.xz을 서버/app/my sql 에 업로드 합 니 다.
192.168.249.131 CENTOS 7 주
CENTOS 7 에서
방화벽 상 태 를 살 펴 보고 시동 을 걸 려 면 방화벽 을 닫 아야 합 니 다.

service firewalld status ##        
service firewalld stop  ##      
       xz     tar  
xz -d mysql-8.0.16-linux-glibc2.12-x86_64.tar.xz
압축 해제 패키지

tar -xvf mysql-8.0.16-linux-gl-ibc2.12-x86_64.tar
데 이 터 를 저장 하기 위해/app/mysql 에 data 폴 더 를 만 듭 니 다.
my sql 사용자 그룹 과 my sql 사용 자 를 만 듭 니 다.

groupadd mysql                 ##      
useradd -g mysql -d /app/mysql mysql  ##        mysql         
groupdel mysql                 ##       (          )
userdel mysql   ##     (         )
my sql 데이터베이스 초기 화

./mysql-8.0.16-linux-glibc2.12-x86_64/bin/mysqld --user=mysql --basedir=/app/mysql --datadir=/app/mysql/data --initialize

2019-07-01T02:05:52.681626Z 0 [Warning] [MY-011070] [Server] 'Disabling symbolic links using --skip-symbolic-links (or equivalent) is the default. Consider not using this option as it' is deprecated and will be removed in a future release.
2019-07-01T02:05:52.681694Z 0 [System] [MY-013169] [Server] /app/mysql/mysql-8.0.16-linux-glibc2.12-x86_64/bin/mysqld (mysqld 8.0.16) initializing of server in progress as process 1479
2019-07-01T02:05:52.681726Z 0 [ERROR] [MY-010338] [Server] Can't find error-message file '/app/mysql/share/errmsg.sys'. Check error-message file location and 'lc-messages-dir' configuration directive.
2019-07-01T02:05:55.713747Z 5 [Note] [MY-010454] [Server] A temporary password is generated for root@localhost: xa6(H>rK/r<E
2019-07-01T02:05:57.303240Z 0 [System] [MY-013170] [Server] /app/mysql/mysql-8.0.16-linux-glibc2.12-x86_64/bin/mysqld (mysqld 8.0.16) initializing of server has completed
이 때 my sql 은 기본 임시 암 호 를 생 성 합 니 다.위 와 같이 저장 한 다음 수정 해 야 합 니 다.
my sql 서 비 스 를 만 들 고 실행 권한 을 증가 합 니 다.

cp mysql-8.0.16-linux-glibc2.12-x86_64/support-files/mysql.server /etc/init.d/mysqld
mysql 프로필 vi/etc/my.cnf 를 수정 하려 면 다음 설정 을 추가 하 십시오

[mysqld]
port=3306
basedir=/app/mysql/mysql-8.0.16-linux-glibc2.12-x86_64
datadir=/app/mysql/data
socket=/tmp/mysql.sock
symbolic-links=0

[mysqld_safe]
log-error=/app/mysql/data/log/error.log
pid-file=/app/mysql/data/mysql.pid
user=mysql
tmpdir=/tmp
character_set_server=utf8
default-storage-engine=INNODB
init_connect='SET NAMES utf8'

!includedir /etc/my.cnf.d
로그 권한 에 대한 오류 가 발생 하면 해당 로그 파일 을 만 들 고 my sql 사용자 에 게 권한 을 부여 하 십시오.

chown -R mysql:mysql /app/mysql/data/log/error.log
mysql 서비스 시작service mysqld startmysql 클 라 이언 트 소프트 연결 만 들 기

ln -s /app/mysql/mysql-8.0.16-linux-glibc2.12-x86_64/bin/mysql /usr/local/bin/mysql
비밀번호 변경

mysql -uroot -p      ##    
ALTER USER 'root'@'localhost' IDENTIFIED WITH mysql_native_password BY '000000';
원 격 로그 인 설정

use mysql;
update user set host='%' where user='root' limit 1;
flush privileges;
my sql 마스터 동기 화 설정(binlog)
복제 원리
  • Master 는 데 이 터 를 바 꾸 어 바 이 너 리 로그(binary log)에 기록 합 니 다.즉,설정 파일 log-bin 이 지정 한 파일 입 니 다.이 기록 들 을 바 이 너 리 로그 이벤트(binary log events)
  • 라 고 합 니 다.
  • Slave 는 I/O 스 레 드 를 통 해 Master 의 binary log 이 벤트 를 읽 고 중계 로그(relay log)
  • 에 기록 합 니 다.
  • Slave 는 중계 로그 의 이 벤트 를 다시 만 들 고 중계 로그 의 이벤트 정 보 를 하나씩 로 컬 에서 실행 하 며 데 이 터 를 로 컬 에 저장 하여 자신의 데이터(데이터 재생)에 반영 합 니 다.
  • 복사 요구 사항
  • 서버 운영 체제 버 전과 자릿수 일치
  • Master 와 Slave 데이터베이스 버 전이 일치 해 야 합 니 다
  • Master 와 Slave 데이터베이스 의 데이터 가 일치 해 야 합 니 다
  • Master 바 이 너 리 로그,Master 와 Slave 의 server 오픈id 는 랜 내 에서 유일 해 야 합 니 다
  • 배치 절차
    주 데이터베이스(192.168.249.131)
    동기 화 사용 자 를 만 들 고 권한 을 부여 합 니 다.
    
    CREATE USER 'slave'@'192.168.249.129' IDENTIFIED WITH 'mysql_native_password' BY '000000';
    GRANT REPLICATION SLAVE, REPLICATION CLIENT ON *.* TO 'slave'@'192.168.249.129';
    FLUSH PRIVILEGES;
    사용 자 를 만 들 때mysql_native_password암호 화 방식 플러그 인 을 사용 해 야 합 니 다.그렇지 않 으 면 기본적으로 caching 을 사용 합 니 다.sha2_password 암호 화 방식 은 동기 화 할 때 SSL 의 신분 을 사용 하여 검증 해 야 합 니 다.간단 하고 편리 하도록 저 희 는 my sql 을 직접 사용 합 니 다.native_암호 방식
    설정 수정/etc/my.cnf,다음 설정 을 추가 하여 binlog 를 열 고 my sql 서 비 스 를 다시 시작 합 니 다.
    [mysqld]\#바 이 너 리 로그 기능log-bin=mysql-bin #설정 serverid,네트워크 내 에서 유일 하 게 server-id=131\#(설정 가능)동기 화 할 데이터베이스 이름 을 주의 하 십시오.여러 데이터 베 이 스 를 동기 화 하려 면 replicate-db-db=데이터베이스 이름binlog-do-db=mydb #(을 추가 하여 무시 할 데이터베이스binlog-ignore-db=mysql를 추가 하 십시오.
    홈 서버 상태 보기
    
    show master status
    file

    안에 있 는 인 자 를 주의 하 세 요.특히 앞의 두 File 과 Position 은 서버(Slave)에서 주종 관 계 를 설정 하 는 데 도움 이 될 것 입 니 다.
    데이터베이스 에서(192.168.249.129)
    /etc/my.cnf 를 수정 하고 다음 설정 을 추가 하 며 서 비 스 를 다시 시작 합 니 다.
    
    [mysqld]
    server-id=129
    log-bin=mysql-bin
    replicate-do-db=mydb
    replicate-ignore-db=mysql
    slave 에 master 정 보 를 설정 하고 동기 화 위 치 를 지정 합 니 다.
    
    stop slave;
    change master to master_host='192.168.249.131',master_user='slave',master_password='000000',master_log_file='mysql-bin.000001',master_log_pos=155;
    start slave;
    매개 변수 설명:
    master_host='192.168.249.131'\#Master 의 IP 주소
    master_user='slave'\#\#데 이 터 를 동기 화 하 는 사용자(Master 에서 권한 을 수 여 받 은 사용자)
    master_password='000000'\#동기 화 데이터 사용자 의 비밀번호
    master_port=3306\##Master 데이터베이스 서비스의 포트
    masterlogfile='my sql-bin.00001'\#Slave 가 로그 파일 부터 복사 데 이 터 를 읽 을 지 지정 합 니 다(Master 에서 명령 을 실행 한 결과 의 File 필드)
    masterlogpos=155\##어떤 POSITION 번호 부터 읽 습 니까?(Master 에서 명령 을 실행 한 결과 의 Position 필드)
    masterconnectretry=30\##홈 연결 을 다시 만 들 때 연결 이 실패 하면 얼마 간격 으로 다시 시도 합 니 다.단 위 는 초 이 고 기본 값 은 60 초 이 며 동기 지연 변조 인자 입 니 다.
    서버 상태 보기show slave status\G;
    이로써 데이터베이스 차원 에서 설정 이 완료 되 었 습 니 다.
    SpringBoot 에서 읽 기와 쓰기 분리 설정
    주종 모드 에서 다음 과 같은 규칙 을 준수 하 십시오.
    주 데이터 베 이 스 는 INSERT,UPDATE,DELETE 작업 만 수행 합 니 다.
    데이터베이스 에서 SELECT 작업 만 수행 합 니 다.
    저 희 는 원본 프로젝트[dynamic-datasource-spring-boot-starter]https://gitee.com/baomidou/dynamic-datasource-spring-boot-starter/wikis/를 읽 기와 쓰기 분리 도구 패키지 로 사용 합 니 다.
    사용 방법
    mydb 메 인 데이터베이스 에 간단 한 데이터 테이블 user 를 만 들 면 데이터베이스 에서 자동 으로 동기 화 됩 니 다
    
    DROP TABLE IF EXISTS `user`;
    CREATE TABLE `user` (
    `id` int(11) NOT NULL AUTO_INCREMENT,
    `account` varchar(255) COLLATE utf8mb4_unicode_ci DEFAULT NULL,
    `name` varchar(255) COLLATE utf8mb4_unicode_ci DEFAULT NULL,
    `position` varchar(255) COLLATE utf8mb4_unicode_ci DEFAULT NULL,
    PRIMARY KEY (`id`)
    ) ENGINE=InnoDB AUTO_INCREMENT=5 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
    관련 의존 도입
    
    <dependencies>
        <dependency>
          <groupId>org.springframework.boot</groupId>
          <artifactId>spring-boot-starter</artifactId>
        </dependency>
        <dependency>
          <groupId>org.springframework.boot</groupId>
          <artifactId>spring-boot-starter-web</artifactId>
        </dependency>
        <dependency>
          <groupId>org.mybatis.spring.boot</groupId>
          <artifactId>mybatis-spring-boot-starter</artifactId>
          <version>2.0.1</version>
        </dependency>
        <dependency>
          <groupId>com.baomidou</groupId>
          <artifactId>dynamic-datasource-spring-boot-starter</artifactId>
          <version>2.5.5</version>
        </dependency>
        <dependency>
          <groupId>mysql</groupId>
          <artifactId>mysql-connector-java</artifactId>
          <version>8.0.15</version>
        </dependency>
        <dependency>
          <groupId>org.projectlombok</groupId>
          <artifactId>lombok</artifactId>
          <optional>true</optional>
        </dependency>
        <dependency>
          <groupId>org.springframework.boot</groupId>
          <artifactId>spring-boot-starter-test</artifactId>
          <scope>test</scope>
        </dependency>
      </dependencies>
    데이터 원본 설정
    
    spring:
     datasource:
      dynamic:
       primary: master #              ,     master
       strict: false #      ,  false   .                     ,           .
       datasource:
        master:
         type: com.zaxxer.hikari.HikariDataSource
         url: jdbc:mysql://192.168.249.131:3306/mydb?characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=false
         username: root
         password: '000000'
         driver-class-name: com.mysql.cj.jdbc.Driver
        slave_1:
         type: com.zaxxer.hikari.HikariDataSource
         url: jdbc:mysql://192.168.249.129:3306/mydb?characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=false
         username: root
         password: '000000'
         driver-class-name: com.mysql.cj.jdbc.Driver
    시작 클래스 입구 에 my batis 스 캔 패 키 지 를 추가 합 니 다.
    
    @SpringBootApplication@MapperScan("com.jianzh5.dynamic.mapper")
    public class DynamicDatsourceBootstrap {  
      public static void main(String[] args) {    
        SpringApplication.run(DynamicDatsourceBootstrap.class, args);
      }
    }
    실체 클래스 사용자 만 들 기
    
    @Data
    public class User {
      private int id;
      private String account;
      private String name;
      private String position;
    }
    
    
    mapper 인터페이스 파일 을 만 들 고 두 가지 방법 을 추가 합 니 다 addUser(User user),getById(int id)
    
    public interface UserDao {
      @Insert("INSERT INTO user(account, name, position) VALUES(#{account}, #{name}, #{position})")
      @Options(useGeneratedKeys = true,keyProperty = "id")
      int addUser(User user);
    
      @Select("SELECT * FROM user WHERE id = #{id}")
      User getById(int id);
    }
    
    
    서비스 계층 구축 관련 실현
    
    public interface UserService {
        int addUser(User user);
        User getById(int id);
    }
    @Service
    public class UserServiceImpl implements UserService {
        @Resource
        private UserDao userDao;
    
        @Override
        public int addUser(User user) {
          return userDao.addUser(user);
        }
        @DS("slave")
        @Override
        public User getById(int id) {
          return userDao.getById(id);
        }
    }
    
    
    데이터 원본 에 primary:master 가 설정 되 어 있 기 때문에 기본 동작 은 주 라 이브 러 리 에서 실 행 됩 니 다.주해@DS 를 사용 하여 데이터 원본 을 전환 합 니 다.이 주 해 는 클래스 파일 에 직접 사용 할 수 있 으 며,동시에 존재 하 는 방법 주 해 는 클래스 주해 보다 우선 합 니 다.
    유닛 테스트 작성 테스트 진행
    
    public class UserServiceTest extends DynamicDatsourceBootstrapTests {
      @Autowired
      private UserService userService;
      @Test
      public void testAddUser(){
        User user = new User();
        user.setName("  ");
        user.setAccount("sili");
        user.setPosition("JAVA     ");
        int i = userService.addUser(user);
        System.out.println(user);
      }
      @Test
      public void testGetById(){
        int id = 4;
        User user = userService.getById(id);
        Assert.assertEquals("sanzhang",user.getAccount());
      }
    }
    실행 로 그 를 살 펴 보면 읽 기와 쓰기 데이터 베 이 스 는@DS 주석 에 따라 전환 되 며,이로써 Springboot 통합 데이터 베 이 스 는 읽 기와 쓰기 에서 분 리 됩 니 다.
    총결산
    위 에서 말씀 드 린 것 은 편집장 님 께 서 소개 해 주신 Springboot+Mysql 8 읽 기와 쓰기 분리 기능 입 니 다.여러분 께 도움 이 되 셨 으 면 좋 겠 습 니 다.궁금 한 점 이 있 으 시 면 메 시 지 를 남 겨 주세요.편집장 님 께 서 바로 답 해 드 리 겠 습 니 다.여기 서도 저희 사이트 에 대한 여러분 의 지지 에 감 사 드 립 니 다!
    만약 당신 이 본문 이 당신 에 게 도움 이 된다 고 생각한다 면,전 재 를 환영 합 니 다.번 거 로 우 시 겠 지만 출처 를 밝 혀 주 십시오.감사합니다!

    좋은 웹페이지 즐겨찾기