Database/Maria,Mysql

인프런 - 따라하며 배우는 MySQL on Docker 학습 정리 - Master/Slave Replication 구성

bluebamus 2022. 1. 8.

1. Master-Slave Replication 구성 방법 ( IP 기반 )

  - db001 : master

  - db002, db003 : slave

  - 시나리오 : 각각은 /db/ 폴더 안에 db001, db002, db003이라는 폴더를 가지고 있고 

                  해당 폴더안에는 data, log, conf 폴더가 각각 존재한다. my.cnf 파일도 포함한다.

  - 작업 중 에러가 발생함, 이유는 권한문제!!! 모든 폴더는 777, my.cnf는 644

  - Databse 업버전으로 암호화 방식 변경, 문제 발생, 기존 암호화로 설정

 

master : my.cnf

[mysqld]
# default_authentication_plugin = caching_sha2_password
default-authentication-plugin = mysql_native_password

log_bin                     = mysql-bin
binlog_format               = ROW
gtid_mode                   = ON
enforce-gtid-consistency    = true
server-id                   = 100
log_slave_updates
datadir                     = /var/lib/mysql
socket                      = /var/lib/mysql/mysql.sock

# Disabling symbolic-links is recommended to prevent assorted security risks
symbolic-links              = 0

log-error                   = /var/log/mysql/mysqld.log
pid-file                    = /var/run/mysqld/mysqld.pid

report_host                 = db001

[mysqld_safe]
pid-file                    = /var/run/mysqld/mysqld.pid
socket                      = /var/lib/mysql/mysql.sock
nice                        = 0

slave : my.cnf

* 차이점은 read_only 파라메터가 추가됨

[mysqld]
log_bin                     = mysql-bin
binlog_format               = ROW
gtid_mode                   = ON
enforce-gtid-consistency    = true
server-id                   = 200
log_slave_updates
datadir                     = /var/lib/mysql
socket                      = /var/lib/mysql/mysql.sock
read_only

# Disabling symbolic-links is recommended to prevent assorted security risks
symbolic-links              = 0

log-error                   = /var/log/mysql/mysqld.log
pid-file                    = /var/run/mysqld/mysqld.pid

report_host                 = db002

[mysqld_safe]
pid-file                    = /var/run/mysqld/mysqld.pid
socket                      = /var/lib/mysql/mysql.sock
nice                        = 0

  1) docker 실행 명령어 

    * 각각의 컨테이들은 외부와 연결되는 포트번호가 달라야 하기 때문에 3306, 3307, 3308을 각각 할당해 준다.

sudo docker run -it --name db001 -p 3306:3306 -v /db/db001/data:/var/lib/mysql -v ~/project/docker_mysql/db/db001/log:/var/log/mysql -v ~/project/docker_mysql/db/db001/conf:/etc/percona-server.conf.d -e MYSQL_ROOT_PASSWORD="root" -d percona:5.7.30

sudo docker run -it --name db002 -p 3307:3306 -v /db/db002/data:/var/lib/mysql -v ~/project/docker_mysql/db/db002/log:/var/log/mysql -v ~/project/docker_mysql/db/db002/conf:/etc/percona-server.conf.d -e MYSQL_ROOT_PASSWORD="root" -d percona:5.7.30

sudo docker run -it --name db003 -p 3308:3306 -v /db/db003/data:/var/lib/mysql -v ~/project/docker_mysql/db/db003/log:/var/log/mysql -v ~/project/docker_mysql/db/db003/conf:/etc/percona-server.conf.d -e MYSQL_ROOT_PASSWORD="root" -d percona:5.7.30

 

  2) container 생성 확인 - "--format 옵션을 사용하여 원하는 행만 선택해서 출력"

sudo docker ps --format "table {{.ID}}\t{{.Names}}\t{{.Status}}"

 

  3) Replication 설정

    - db001에서 명령어

sudo docker exec -it -uroot db001 /bin/bash
mysql -uroot -p
mysql> CREATE USER 'repl'@'%' IDENTIFIED BY 'repl';
mysql> GRANT REPLICATION SLAVE ON *.* TO 'repl'@'%';

    - ip 확인

ifconfig

 

    - db002, db003에서 명령어

sudo docker exec -it -uroot db002 /bin/bash
mysql -uroot -p
mysql> reset master;
mysql> CHANGE MASTER TO MASTER_HOST='<db001 ip>', MASTER_USER='repl', MASTER_PASSWORD='repl', MASTER_AUTO_POSITION=1;
mysql> START SLAVE;
mysql> show slave status\G

* 만약 ip를 잘못 입력하거나 오류가 있는 경우, STOP SLAVE; 명령 후 설정을 다시 진행하면 된다

 

 

2. Master-Slave Replication 구성 방법 ( IP 기반 )

  - 문제 정의 : Container는 재 시작될 때마다 IP를 새로 할당받기 때문에 IP 기반으로 Replication을 구성하면 연결에

                   문제가 발생할 수 있다.

  - 시나리오 : Bridge Network를 구성하고 각각의 Container에 net alias를 할당하여 재시작시 IP가 변경 되더라도

                  문제가 발생하지 않도록 한다.

  * 상위 테스트 후, 각 폴더에 데이터가 남아 있기 때문에 mysql 명령어로 인한 사용자 생성, 시스템 설정 등이 유지되고 있다. 모든 폴더의 내용을 삭제하고 새로이 진행해야 한다.

 

  1. mybridge 이름의 bridge 네트워크를 생성한다.

sudo docker network create --driver bridge mybridge

sudo docker network ls

mybridge 생성 확인

    * 만약 잘못 입력한 경우 네트워크 삭제를 실행한다.

sudo docker network rm <네트워크 명>

 

  2. bridge network를 이용하여 container를 생성한다.

    - db001 container 생성

sudo docker run -it --name db001 -h db001 -p 3306:3306 --net mybridge --net-alias=db001 -v /db/db001/data:/var/lib/mysql -v /db/db001/log:/var/log/mysql -v /db/db001/conf:/etc/percona-server.conf.d -e MYSQL_ROOT_PASSWORD="root" -d percona:5.7.30

 

    - db002, db003 container 생성

sudo docker run -it --name db002 -h db002 -p 3307:3306 --net mybridge --net-alias=db002 -v /db/db002/data:/var/lib/mysql -v /db/db002/log:/var/log/mysql -v /db/db002/conf:/etc/percona-server.conf.d -e MYSQL_ROOT_PASSWORD="root" -d percona:5.7.30

sudo docker run -it --name db003 -h db003 -p 3308:3306 --net mybridge --net-alias=db003 -v /db/db003/data:/var/lib/mysql -v /db/db003/log:/var/log/mysql -v /db/db003/conf:/etc/percona-server.conf.d -e MYSQL_ROOT_PASSWORD="root" -d percona:5.7.30

 

  3. Replication 설정을 해준다

    - db001 설정 방법

sudo docker exec -it -uroot db001 /bin/bash
mysql -uroot -p
mysql> CREATE USER 'repl'@'%' IDENTIFIED BY 'repl';
mysql> GRANT REPLICATION SLAVE ON *.* TO 'repl'@'%';

    - ping으로 Alias명으로 각 Container에 접근이 되는지 확인한다 (각 컨테이너에서 확인)

ping db001
ping db002
ping db003

    - db002, db003 설정 방법

sudo docker exec -it -uroot db002 /bin/bash
mysql -uroot -p
mysql> reset master;
mysql> CHANGE MASTER TO MASTER_HOST='<컨테이너 명 ex : db001>', MASTER_USER='repl', MASTER_PASSWORD='repl', MASTER_AUTO_POSITION=1;
mysql> START SLAVE;
mysql> show slave status\G

댓글