MySQL 복제 실습
1. MySQL Docker 이미지 기반으로 서버 실행하기
사전 준비
Git bash가 아닌 cmd에서 실행
docker 설치
MySQL 이미지 가져오기
docker pull mysql받아온 이미지 확인
docker imagesSOURCE(master) 서버 실행
[mysql-source 컨테이너에서 실행]
docker run -p 3306 --name mysql-source -e MYSQL_ROOT_PASSWORD=1234 -d docker.io/mysqlSOURCE 서버(컨테이너) 실행 확인
docker ps -aMySQL 컨테이너 내부로 접근
docker exec -it mysql-source /bin/bash복제를 적용하기 위해 설정 파일 수정하기
mysql이 설정 파일을 읽어들이는 순서 및 경로 확인하기
mysqld --verbose --help | grep -A 1 "Default options"실행 결과
Default options are read from the following files in the given order:
/etc/my.cnf /etc/mysql/my.cnf /usr/etc/my.cnf ~/.my.cnf
mysql 컨테이너 내에서 vim 설치
microdnf install vim기본적으로 컨테이너는 불변(Immutable) 인프라 모델을 지향함
실행 중인 컨테이너에서 수정한 설정값은 컨테이너가 중지되면 유지되지 않음
본 과정에서는 실습의 간소화를 위해 vim을 설치하고 설정 파일(my.cnf)을 수정함
복제를 적용하기 위해 설정파일 열기
vim /etc/my.cnf아래의 내용을 추가
[mysqld]
...
pid-file=...
log-bin=mysql-bin
server-id=1
[client]
socket=...log-bin
실행되는 쿼리들은 모두 Binary log 파일에 기록됨
Binary log 파일은 MySQL의 data directory인 /var/lib/mysql/ 에 호스트명-bin.000001, 호스트명-bin.000002의 형태로 생성됨
server-id
특정 DB 서버를 식별하기 위한 식별자
SOURCE 컨테이너 내부에서 벗어나기
exitSOURCE 컨테이너 재시작
docker restart mysql-source설정 파일대로 적용되었는지 확인하기 위해 컨테이너 내부로 재접속
docker exec -it mysql-source /bin/bash컨테이너에서 내부에서 MySQL 쉘로 접속하기
mysql -u root -p
# 비밀번호 1234바이너리 로그 정보 확인
SHOW BINARY LOG STATUS\G;실행 결과
*************************** 1. row ***************************
File: mysql-bin.000001
Position: 158
Binlog_Do_DB:
Binlog_Ignore_DB:
Executed_Gtid_Set: d1dccff7-0fbd-11f1-8d29-96ff16b09b90:1-5
1 row in set (0.000 sec)
File - 바이너리 로그(binlog) 파일명
Position: 현재 로그의 위치
Source DB에 계정 생성하기
CREATE USER 'gugu'@'%' IDENTIFIED BY '1234';GRANT REPLICATION SLAVE ON *.* TO 'gugu'@'%';FLUSH PRIVILEGES;생성된 계정 확인
SELECT User, Host FROM mysql.user;테스트용 데이터 생성
CREATE DATABASE testdb;생성한 Database 사용하기
use testdb;테스트용 테이블 생성
CREATE TABLE products ( text varchar(40) );더미 데이터 삽입
INSERT INTO products VALUES ('apple');SELECT * FROM products;MySQL 프롬프트 종료하고 컨테이너 내부 프롬프트로 이동하기
exitdump 작업 수행
mysqldump -u root -p testdb > dump.sql비밀번호 1234
mysql 컨테이너 내부에서 로컬 환경으로 나가기
exit로컬 환경에 dump파일 백업하기
docker cp mysql-source:dump.sql .dump 파일 내용 확인
type dump.sql복제용 DB(Replica, Slave) 생성하기
복제용 DB 생성은 별도의 터미널에서 진행
docker run -p 3306 --name mysql-replica -e MYSQL_ROOT_PASSWORD=1234 --link mysql-source -d docker.io/mysql—link mysql-source는 mysql-source 컨테이너를 Host 주소로 사용하기 위해 사용
실행 중인 컨테이너 확인
docker ps -aReplica 컨테이너 내부로 접속
docker exec -it mysql-replica /bin/bashvim 설치
microdnf install vim설정파일 수정
vim /etc/my.cnf[mysqld]
pid-file=...
log-bin=mysql-bin
server-id=2컨테이너 내부에서 로컬 환경으로 벗어나기
exitReplica 컨테이너 재시작
docker restart mysql-replica로컬 환경의 dump를 Replica 컨테이너에 복사하기
docker cp dump.sql mysql-replica:.Replica 컨테이너 내부로 접속
docker exec -it mysql-replica /bin/bash컨테이너 내부에서 mysql 쉘로 접속
mysql -u root -pCREATE DATABASE testdb;MySQL 쉘 종료
exitReplica에 dump 파일 적용하기
mysql -u root -p testdb < dump.sqlmysql 쉘에 다시 접속하여 복제가 성공적으로 이루어졌는지 확인
mysql -u root -puse testdb;
show tables;+-------+
| text |
+-------+
| apple |
+-------+Source(Master)와 Replica(Slave) 연결하기
mysql-replica에 접속하여 Source를 mysql-source로 적용
mysql 쉘에 접속되었는지 확인
[mysql-replica 컨테이너에서 실행]mysql -u root -p[mysql-source 컨테이너에서 실행]
SHOW BINARY LOG STATUS\G;Position 값 확인
*************************** 1. row ***************************
File: mysql-bin.000001
Position: 1549
Binlog_Do_DB:
Binlog_Ignore_DB:
Executed_Gtid_Set: 10cc9254-1006-11f1-a6c3-b6a0a13c1375:1-11
1 row in set (0.000 sec)[mysql-replica 컨테이너에서 실행]
CHANGE REPLICATION SOURCE TO
SOURCE_HOST='mysql-source',
SOURCE_USER='gugu',
SOURCE_PASSWORD='1234',
SOURCE_LOG_FILE='mysql-bin.000001',
SOURCE_LOG_POS={직접 확인};SOURCE_HOST : SOURCE 서버의 호스트명
SOURCE_USER : SOURCE 서버의 mysql에서 REPLICATION SLAVE 권한을 가진 User 계정의 이름
SOURCE_PASSWORD : SOURCE 서버의 mysql에서 REPLICATION SLAVE 권한을 가진 User 계정의 비밀번호
SOURCE_LOG_FILE : SOURCE 서버의 바이너리 로그 파일명
SOURCE_LOG_POS : SOURCE 서버의 현재 로그의 위치
Replica 실행
START REPLICA;Replica 정보 조회
SHOW REPLICA STATUS\G;Replica_SQL_Running_State: Replica has read all relay log; waiting for more updates
복제 동작 테스트하기
mysql-source에 접속하여 데이터 INSERT 작업 수행
INSERT INTO products VALUES ('new product');mysql-replica에 접속하여 데이터 복제 여부 확인
SELECT * FROM products;