-
[MySQL] Master Slave 구성해보기 ( Replication , Replica )Database 2024. 2. 16. 22:56728x90반응형
- 목차
들어가며.
이번 글에서는 두개의 MySQL 을 통해서 Master - Slave 구성을 해보려고 합니다.
Docker 를 기반으로 2개의 MySQL Container 를 생성하고, 하나의 Master 그리고 다른 하나를 Slave 로써 동작하게 설정합니다.
MySQL 구성하기.
먼저 Master 와 Slave 의 my.cnf 를 설정합니다.
log-bin 설정은 binlog 파일의 prefix 에 해당하는 문자열을 설정하는 옵션이구요.
binlog, relay-log 에 대한 설정을 추가합니다.
그리고 Replication 을 위한 USER 와 GRANT 정보를 생성하는 init.sql 또한 생성하였습니다.
cat <<EOF> /tmp/master-init.sql create database test; use test; create table test_table (id int, name varchar(32)); CREATE USER 'replica'@'%' IDENTIFIED BY 'slave'; GRANT REPLICATION SLAVE ON *.* TO 'replica'@'%'; FLUSH PRIVILEGES; EOF cat <<EOF> /tmp/replica-init.sql CHANGE MASTER TO MASTER_HOST='mysql-master', MASTER_USER='replica', MASTER_PASSWORD='slave', MASTER_LOG_FILE='mysql-bin.000001', MASTER_LOG_POS=0; START SLAVE; EOF cat <<EOF> /tmp/master.cnf [mysqld] default_authentication_plugin=mysql_native_password server-id=1 log-bin=mysql-bin binlog-do-db=test binlog-ignore-db=mysql binlog-format=row bind-address = 0.0.0.0 EOF cat <<EOF> /tmp/replica.cnf [mysqld] default_authentication_plugin=mysql_native_password server-id=2 log-bin=mysql-bin relay-log=mysql-relay-bin relay-log-index=mysql-relay-bin.index replicate-do-db=test replicate-ignore-db=mysql bind-address=0.0.0.0 max_allowed_packet = 1073741824 EOF
< Master MySQL 생성하기 >
docker run -d --name mysql-master \ --platform linux/amd64 \ --mount type=bind,source=/tmp/master.cnf,target=/etc/mysql/conf.d/master.cnf \ --mount type=bind,source=/tmp/master-init.sql,target=/docker-entrypoint-initdb.d/init.sql \ -e MYSQL_ROOT_PASSWORD=1234 -p 3306:3306 mysql:8.0.23
< Replica MySQL 생성하기 >
docker run -d --name mysql-replica \ --platform linux/amd64 \ --link mysql-master \ --mount type=bind,source=/tmp/replica.cnf,target=/etc/mysql/conf.d/replica.cnf \ --mount type=bind,source=/tmp/replica-init.sql,target=/docker-entrypoint-initdb.d/init.sql \ -e MYSQL_ROOT_PASSWORD=1234 -p 3307:3306 mysql:8.0.23
processlist 확인해보기.
mysql-master 컨테이너가 실행되면 processlist 를 확인함으로써 Replication 이 동작 중인지 확인할 수 있습니다.
아래와 같이 show processlist 를 통해서 현재 실행 중인 쓰레드들을 확인할 수 있는데요.
replica User 가 Binlog Dump 동작을 수행하고 있음을 알 수 있습니다.
show processlist; +----+-----------------+------------------+------+-------------+------+---------------------------------------------------------------+------------------+ | Id | User | Host | db | Command | Time | State | Info | +----+-----------------+------------------+------+-------------+------+---------------------------------------------------------------+------------------+ | 5 | event_scheduler | localhost | NULL | Daemon | 1178 | Waiting on empty queue | NULL | | 9 | replica | 172.17.0.3:49842 | NULL | Binlog Dump | 1150 | Master has sent all binlog to slave; waiting for more updates | NULL | | 10 | root | localhost | NULL | Query | 0 | init | show processlist | +----+-----------------+------------------+------+-------------+------+---------------------------------------------------------------+------------------+ 3 rows in set (0.00 sec)
Replication 확인해보기.
위 과정을 마치게 되면 mysql-master 와 mysql-replica 두개의 Container 가 실행됩니다.
위 과정에서 생성한 master-init.sql 문은 test 데이터베이스를 생성하고, test_table 테이블을 생성합니다.
이 master-init.sql 은 mysql-master 컨테이너가 실행될때, entrypoint 로서 초기에 실행되는 sql 문인데요.
이 내용이 mysql-replica 에도 반영이 됩니다.
아래 두개의 결과가 Database & Table DDL 이 반영된 결과입니다.
show databases; +--------------------+ | Database | +--------------------+ | information_schema | | mysql | | performance_schema | | sys | | test | +--------------------+ 5 rows in set (0.02 sec)
show tables; +----------------+ | Tables_in_test | +----------------+ | test_table | +----------------+ 1 row in set (0.02 sec)
그리고 Insert, Update, Delete 에 해당하는 DML 의 실행과 Replication 을 확인해보겠습니다.
< mysql-master 에서 Insert Query 실행 >
insert into test.test_table (id, name) values (1, 'Andy'), (2, 'Bob'), (3, 'Chris'), (4, 'Daniel');
Query OK, 4 rows affected (0.06 sec) Records: 4 Duplicates: 0 Warnings: 0
< mysql-replica 에서 Select Query 실행 >
select * from test.test_table;
+------+--------+ | id | name | +------+--------+ | 1 | Andy | | 2 | Bob | | 3 | Chris | | 4 | Daniel | +------+--------+ 4 rows in set (0.00 sec)
Delete & Replication.
이번에 Delete DML 쿼리에 대한 Replication 을 확인해보겠습니다.
먼저 mysql-master 에서 아래의 쿼리를 실행하여 3번 Row 를 삭제하도록 하겠습니다.
< mysql-master Delete Query >
delete from test.test_table where id = 3;
< mysql-replica Select Query >
아래의 결과처럼 master 의 Delete DML 의 결과가 replica 에서도 반영됨을 확인할 수 있습니다.
select * from test.test_table; +------+--------+ | id | name | +------+--------+ | 1 | Andy | | 2 | Bob | | 4 | Daniel | +------+--------+ 3 rows in set (0.00 sec)
반응형'Database' 카테고리의 다른 글
[MySQL] binlog 는 언제 생성될까 ( binary log ) (0) 2024.02.18 MySQL User, Grant 생성하기. (0) 2023.12.15 Database Driver 알아보기 (0) 2023.11.04 MySQL Index 알아보기 (0) 2023.10.30 MySQL Page 알아보기 (0) 2023.10.30