ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [MySQL] Master Slave 구성해보기 ( Replication , Replica )
    Database 2024. 2. 16. 22:56
    728x90
    반응형

     

    - 목차

     

    들어가며.

    이번 글에서는 두개의 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
Designed by Tistory.