Skip to Content
Suffering builds character

MySQL 복제 실습

1. MySQL Docker 이미지 기반으로 서버 실행하기

사전 준비

Git bash가 아닌 cmd에서 실행
docker 설치

MySQL 이미지 가져오기

terminal
docker pull mysql

받아온 이미지 확인

terminal
docker images

SOURCE(master) 서버 실행
[mysql-source 컨테이너에서 실행]

terminal
docker run -p 3306 --name mysql-source -e MYSQL_ROOT_PASSWORD=1234 -d docker.io/mysql

SOURCE 서버(컨테이너) 실행 확인

terminal
docker ps -a

MySQL 컨테이너 내부로 접근

terminal
docker exec -it mysql-source /bin/bash

복제를 적용하기 위해 설정 파일 수정하기

mysql이 설정 파일을 읽어들이는 순서 및 경로 확인하기

terminal
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 설치

terminal
microdnf install vim
⚠️
Warning

기본적으로 컨테이너는 불변(Immutable) 인프라 모델을 지향함

실행 중인 컨테이너에서 수정한 설정값은 컨테이너가 중지되면 유지되지 않음

본 과정에서는 실습의 간소화를 위해 vim을 설치하고 설정 파일(my.cnf)을 수정함

복제를 적용하기 위해 설정파일 열기

terminal
vim /etc/my.cnf

아래의 내용을 추가

my.cnf
[mysqld] ... pid-file=... log-bin=mysql-bin server-id=1 [client] socket=...
Note

log-bin
실행되는 쿼리들은 모두 Binary log 파일에 기록됨
Binary log 파일은 MySQL의 data directory인 /var/lib/mysql/ 에 호스트명-bin.000001, 호스트명-bin.000002의 형태로 생성됨

server-id
특정 DB 서버를 식별하기 위한 식별자

SOURCE 컨테이너 내부에서 벗어나기

terminal
exit

SOURCE 컨테이너 재시작

terminal
docker restart mysql-source

설정 파일대로 적용되었는지 확인하기 위해 컨테이너 내부로 재접속

terminal
docker exec -it mysql-source /bin/bash

컨테이너에서 내부에서 MySQL 쉘로 접속하기

terminal
mysql -u root -p # 비밀번호 1234

바이너리 로그 정보 확인

(SOURCE) mysql>
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에 계정 생성하기

(SOURCE) mysql>
CREATE USER 'gugu'@'%' IDENTIFIED BY '1234';
(SOURCE) mysql>
GRANT REPLICATION SLAVE ON *.* TO 'gugu'@'%';
(SOURCE) mysql>
FLUSH PRIVILEGES;

생성된 계정 확인

(SOURCE) mysql>
SELECT User, Host FROM mysql.user;

테스트용 데이터 생성

(SOURCE) mysql>
CREATE DATABASE testdb;

생성한 Database 사용하기

(SOURCE) mysql>
use testdb;

테스트용 테이블 생성

(SOURCE) mysql>
CREATE TABLE products ( text varchar(40) );

더미 데이터 삽입

(SOURCE) mysql>
INSERT INTO products VALUES ('apple');
(SOURCE) mysql>
SELECT * FROM products;

MySQL 프롬프트 종료하고 컨테이너 내부 프롬프트로 이동하기

(SOURCE) mysql>
exit

dump 작업 수행

terminal
mysqldump -u root -p testdb > dump.sql

비밀번호 1234

mysql 컨테이너 내부에서 로컬 환경으로 나가기

terminal
exit

로컬 환경에 dump파일 백업하기

terminal
docker cp mysql-source:dump.sql .

dump 파일 내용 확인

terminal
type dump.sql

복제용 DB(Replica, Slave) 생성하기

복제용 DB 생성은 별도의 터미널에서 진행

terminal
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 주소로 사용하기 위해 사용

실행 중인 컨테이너 확인

terminal
docker ps -a

Replica 컨테이너 내부로 접속

terminal
docker exec -it mysql-replica /bin/bash

vim 설치

terminal
microdnf install vim

설정파일 수정

terminal
vim /etc/my.cnf
my.cnf
[mysqld] pid-file=... log-bin=mysql-bin server-id=2

컨테이너 내부에서 로컬 환경으로 벗어나기

terminal
exit

Replica 컨테이너 재시작

terminal
docker restart mysql-replica

로컬 환경의 dump를 Replica 컨테이너에 복사하기

terminal
docker cp dump.sql mysql-replica:.

Replica 컨테이너 내부로 접속

terminal
docker exec -it mysql-replica /bin/bash

컨테이너 내부에서 mysql 쉘로 접속

terminal
mysql -u root -p
(REPLICA) mysql>
CREATE DATABASE testdb;

MySQL 쉘 종료

(REPLICA) mysql>
exit

Replica에 dump 파일 적용하기

terminal
mysql -u root -p testdb < dump.sql

mysql 쉘에 다시 접속하여 복제가 성공적으로 이루어졌는지 확인

terminal
mysql -u root -p
(REPLICA) mysql>
use testdb; show tables;
+-------+ | text | +-------+ | apple | +-------+

Source(Master)와 Replica(Slave) 연결하기

mysql-replica에 접속하여 Source를 mysql-source로 적용

mysql 쉘에 접속되었는지 확인

[mysql-replica 컨테이너에서 실행]
terminal
mysql -u root -p

[mysql-source 컨테이너에서 실행]
terminal
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 컨테이너에서 실행]
(REPLICA) mysql>
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 서버의 현재 로그의 위치

CHANGE 쿼리 레퍼런스

Replica 실행

(REPLICA) mysql>
START REPLICA;

Replica 정보 조회

(REPLICA) mysql>
SHOW REPLICA STATUS\G;

Replica_SQL_Running_State: Replica has read all relay log; waiting for more updates

복제 동작 테스트하기

mysql-source에 접속하여 데이터 INSERT 작업 수행

(SOURCE) mysql>
INSERT INTO products VALUES ('new product');

mysql-replica에 접속하여 데이터 복제 여부 확인

(REPLICA) mysql>
SELECT * FROM products;
Last updated on