반응형
기본 사용 기술
- 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 공통 설정
- mysql terminal로 접속 및 필요한 module 설치
docker exec -it mysql-master /bin/bash # mysql 접속
# vim install
apt-get update
apt-get install vim
mysql-master 설정
/etc/mysql/mysql.conf.d/mysqld.cnf
파일 수정
vim /etc/mysql/mysql.conf.d/mysqld.cnf # 접속
- master mysql 재실행
- 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'@'%';
- 권한 확인
grant 확인 show master status;
으로 log file 명과 위치 확인하기
mysql-slave 설정
/etc/mysql/mysql.conf.d/mysqld.cnf
파일 수정
vim /etc/mysql/mysql.conf.d/mysqld.cnf # 접속
- slave mysql 재실행
- slave 설정 추가
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실행하면 복재되는걸 확인할 수 있음
참고
반응형
'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 |