본문 바로가기
CS/Database

Mysql Replication

by clearinging 2021. 10. 6.
반응형

기본 사용 기술

  • MySQL 5.7
  • Docker
  • docker-composer

Replication

정의

  • DB의 저장된 data가 손실될 경우를 대비해서 저장소(Storage)를 복제하는 것

특징

구성

  • master, slave 구조를 가짐
  • master : main db로서 실제 application 요청을 처리하는 DB
  • slave : backup db

데이터 동기화 사진

부하 분산

부하 분산

  • slave를 읽기 전용으로 설정하게 되면 부하를 분산시켜 DB에 부하를 줄일 수 있음

설치 방법

Docker와 docker-composer로 Mysql 설치

Docker로 사용하지 않고 docker-composer를 선택한이유

  • docker로 container 2개를 각각 생성할 경우 network를 생성해서 연동해야합니다.
  • 이유
    • docker로 container를 띄우는 경우 완벽히 격리된 상태에서 구동됩니다.
    • 2개의 container는 분리된 bridge로 local pc와 통신 하기 때문에 container끼리 통신할 수 없는 이슈가 있습니다.
  • 해결 책
    • network 생성해서 2개의 container 연결
    • docker composer로 실행
  • docker-composer: default로 자동으로 같으 네트워크 형태로 실행하기 때문에 network 생성으로 인한 추가 작업을 안해도 되서 docker composer로 사용하게 되었습니다.

Docker로 mysql 설치

  • docker로 설치하는 방법입니다.
  • 참고 사항으로 여기 작성하게 되었습니다.
docker run -d -p 3306:3306 -e MYSQL_ROOT_PASSWORD=root --name mysql57 mysql:5.7 --character-set-server=utf8mb4 --collation-server=utf8mb4_unicode_ci
  • character set 을 utf8mb4로 설정한 이유 : 이모티콘과 한글과 같은 다양한 캐릭터 형태를 깨지지 않고 저장하기 위해서 사용

docker-compose.yml 사용하기

  • docker-compose.yml
version: "3"
services:
  master:
    image: mysql:5.7
    container_name: mysql-master
    ports:
      - "3307:3306"
    environment:
      MYSQL_ROOT_PASSWORD: "root"
    command:
      - --character-set-server=utf8mb4
      - --collation-server=utf8mb4_unicode_ci
    volumes:
      - d:/dev/docker/db/mysql-master
  slave:
    image: mysql:5.7
    container_name: mysql-slave
    ports:
      - "3308:3306"
    environment:
      MYSQL_ROOT_PASSWORD: "root"
    command:
      - --character-set-server=utf8mb4
      - --collation-server=utf8mb4_unicode_ci
    volumes:
      - d:/dev/docker/db/mysql-slave

mysql 공통 설정

  1. mysql terminal로 접속 및 필요한 module 설치
docker exec -it mysql-master /bin/bash # mysql 접속

# vim install
apt-get update
apt-get install vim

mysql-master 설정

  1. /etc/mysql/mysql.conf.d/mysqld.cnf 파일 수정
vim /etc/mysql/mysql.conf.d/mysqld.cnf # 접속

추가

  1. master mysql 재실행
  2. slave와 연동할 계정 생성
mysql -uroot -p # mysql 접속 

mysql > CREATE USER 'master_usr'@'%' IDENTIFIED BY 'root';
mysql > GRANT REPLICATION SLAVE ON *.* TO 'master_usr'@'%' IDENTIFIED BY 'root';  
mysql > FLUSH PRIVILEGES;  
mysql > show grants for 'master\_usr'@'%';
  1. 권한 확인
    grant 확인
  2. show master status;으로 log file 명과 위치 확인하기

mysql-slave 설정

  1. /etc/mysql/mysql.conf.d/mysqld.cnf 파일 수정
vim /etc/mysql/mysql.conf.d/mysqld.cnf # 접속

추가

  1. slave mysql 재실행
  2. slave 설정 추가
  3. mysql -uroot -p # mysql 접속

mysql > stop slave; # slave 실행 중지
mysql > reset slave; # slave 정보 reset
mysql > change master to master_host='172.20.0.2', master_user='master_usr', master_port=3306, master_password='root', master_log_file='mysql-bin.000003', master_log_pos=55433;
mysql > start slave;

- masetr_log_file : master 서버의 mysql log 파일 이름
- master_log_pos: mysql 서버 log 파일 내에 replication시작 위치
- master_host : `docker inspect mysql-master`를 통해 mysql private ip 주소를 알 수 있음
{  
#...
  "Gateway": "172.20.0.1",
  "IPAddress": "172.20.0.2", // ip 주소
# ...  
}

mysql replication 이중화가 정상 작동하는지 확인하기

  • 확인 명령어 : show slave status\G;

확인 방법

  • 확인 방법 : 아래의 3개가 만족하면 정상 동작
    • Slave_IO_State : Waiting for master to send event
    • Slave_IO_Running : Yes
    • Slave_SQL_Running : Yes
  • mysql master의 master_usr로 접속해서 query실행하면 복재되는걸 확인할 수 있음

참고

NHN 이중화 영상

반응형

'CS > Database' 카테고리의 다른 글

RDB Join 방식  (0) 2021.12.09
NamingLock을 이용한 동시성 이슈, Deadlock query 이슈 해결  (0) 2021.12.01
DB Isolation  (0) 2021.10.30
DB 스키마  (0) 2021.06.05
RDB Join Query  (0) 2021.06.05