# 명령어
docker run -d -p {할당할 포트}:3306 \
-e MYSQL_ROOT_PASSWORD={Root 패스워드} \
-v {mysql data를 저장할 경로}:/var/lib/mysql \
-v {mysql 적용할 config파일 경로}:/etc/mysql/conf.d/my.cnf \
-v {mysql log를 저장할 경로}:/var/log/mysql \
--name {docker container 이름} \
mysql:8.0
# 아래는 예시
docker run -d -p 23306:3306 \
-e MYSQL_ROOT_PASSWORD=test \
-v /Users/hwaneehwanee/Desktop/mysql_docker/slave/data:/var/lib/mysql \
-v /Users/hwaneehwanee/Desktop/mysql_docker/slave/config/my.cnf:/etc/mysql/conf.d/my.cnf \
-v /Users/hwaneehwanee/Desktop/mysql_docker/slave/log:/var/log/mysql \
--name mysql_slave_container \
mysql:8.0
컨테이너가 실행된 모습
도커 컨테이너의 MySQL 접속
아래 명령어를 실행하여 MySQL로 접속한다. 패스워드는 docker로 mysql 컨테이너를 실행할때 설정한 ROOT 패스워드이다.
# 명령어
docker exec -it {컨테이너명 또는 컨테이너아이디} mysql -u root -p
# 아래는 예시
docker exec -it mysql_master_container mysql -u root -p
MySQL Replication 복제 방식 (GTID, Global Transaction ID)
전통적인 복제 방식에서는 binlog 파일과 포지션을 기반으로 복제를 설정했지만, 복제를 더 효율적이고 안전하게 관리하기위해 GTID방식으로 진행하였다.
GTID 방식은 각 트랜잭션이 실행될때, 고유한 ID가 할당된다.
GTID 구성은 "server_uuid:트랜잭션_ID"로 구성되어 있다.
위와 같이 구성된 GTID 덕분에 슬레이브 서버는 정확히 어떤 트랜잭션이 마스터에서 실행되었는지 파악하고, 어떤 트랜잭션을 복제해야 하는지 쉽게 결정할 수 있다. 즉, 슬레이브는 이미 적용된 GTID를 기억하고, 이후에 실행되지 않은 트랜잭션만 복사하여 적용해야한다. 이러한 방식은 장애 복구 또는 서버 재시작시 상당히 편리하다.
이와 같은 기능 덕분에 binlog파일로 복제를 관리하던 전통적인 방식보다 간편히 관리할 수 있게 되었다.
gtid_mode 활성화 확인
my.cnf에서 gtid 모드를 활성화하였다면 실제 MySQL 서버에서 다음과 같은 설정값이 조회되어야 한다. 마스터, 슬레이브 서버 모두 실행하여 확인.
mysql > SHOW VARIABLES LIKE '%gtid_mode%'
MySQL 마스터에서 Replication을 위한 전용 유저 생성하기
마스터 MySQL로 접속하여 유저를 생성하고 권한을 부여한다.
MySQL8.0 이상 부터는 기본 비밀번호 인증 플러그인이 mysql_native_password에서 caching_sha2_password로 변경되어,
유저 생성시 mysql_native_password로 사용하도록 설정한다.
# 명령어
mysql > CREATE USER '{아이디}'@'%' IDENTIFIED WITH mysql_native_password BY '{패스워드}';
mysql > GRANT REPLICATION SLAVE,REPLICATION CLIENT ON *.* TO '{아이디}'@'%';
mysql > FLUSH PRIVILEGES;
mysql > SELECT user,host,authentication_string FROM mysql.user;
# 아래는 예시
mysql > CREATE USER 'replication'@'%' IDENTIFIED WITH mysql_native_password BY 'test';
mysql > GRANT REPLICATION SLAVE,REPLICATION CLIENT ON *.* TO 'replication'@'%';
mysql > FLUSH PRIVILEGES;
mysql > SELECT user,host,authentication_string FROM mysql.user;
이제 슬레이브에서 마스터를 연결하고 실행해보자
슬레이브 MySQL로 접속하여 마스터 서버에 대한 연결정보를 셋팅한다. 본문에서는 로컬환경에서 구축했기 때문에 마스터 서버아이피를 PC IP로 설정하였다. 도커 컨테이너 환경이기 때문에 localhot, 또는 127.0.0.1로 하면 안된다.
# 명령어 (MySQL v8.0.23 이상)
mysql > CHANGE REPLICATION SOURCE TO
SOURCE_HOST='{마스터 아이피}',
SOURCE_PORT=13306,
SOURCE_USER='{마스터 replication 유저}',
SOURCE_PASSWORD='{마스터 replication 패스워드}',
SOURCE_AUTO_POSITION=1;
# 아래는 예시
mysql > CHANGE REPLICATION SOURCE TO
SOURCE_HOST='192.168.1.83',
SOURCE_PORT=13306,
SOURCE_USER='replication',
SOURCE_PASSWORD='test',
SOURCE_AUTO_POSITION=1;
---------------------------------------------------
# 명령어 (MySQL v8.0.22 이하)
mysql > CHANGE MASTER TO
MASTER_HOST='{마스터 아이피}',
MASTER_PORT=13306,
MASTER_USER='{마스터 replication 유저}',
MASTER_PASSWORD='{마스터 replication 패스워드}',
MASTER_AUTO_POSITION=1;
# 아래는 예시
mysql > CHANGE MASTER TO
MASTER_HOST='192.168.1.83',
MASTER_PORT=13306,
MASTER_USER='replication',
MASTER_PASSWORD='test',
MASTER_AUTO_POSITION=1;
슬레이브 실행
아래 명령어로 슬레이브를 실행한다.
mysql > start slave;
슬레이브 상태 확인
아래 명령어로 슬레이브 상태를 확인한다. "Slave_IO_Running", "Slave_SQL_Running" 값이 모두 "YES"여야 정상적으로 연결된 상태이다.
mysql > show slave status \G;
Replication 설정완료, 복제 테스트를 해보자
마스터 서버에서 쓰기작업을 진행해 본다. 간단하게 데이터베이스 스키마를 만들고 테이블을 만든 뒤 데이터를 insert 해본다.
데이터 베이스 스키마 생성
mysql > create database test_replication;
mysql > use test_replication;
테이블 생성
mysql > CREATE TABLE MY_TABLE (
id INT(11) NOT NULL AUTO_INCREMENT,
name VARCHAR(20),
CONSTRAINT MY_TABLE_PK PRIMARY KEY(id)
);
데이터 생성
mysql > INSERT INTO MY_TABLE (name) VALUES ('test');
슬레이브에서 위의 작업들이 복제되었는지 확인
mysql > show databases;
mysql > use test_replication;
mysql > show tables;
mysql > select * from my_table;
마치며
도커환경에서 MySQL을 실행하고, Replication 설정을 통해 쓰기작업들이 자동으로 슬레이브로 복제된것을 확인하였다.
다음 내용에서는 Replication 운영시 맞이하게 될 장애상황들과 상황별 복구 방법을 여러가지로 정리해볼까 한다.