MySQL 복제 기본

MySQLBeginner
지금 연습하기

소개

이 실습에서는 MySQL 복제 (replication) 의 기본 사항을 배우게 됩니다. 복제는 여러 서버에 MySQL 데이터베이스의 복사본을 유지하는 프로세스입니다. 이는 일반적으로 로드 밸런싱, 데이터 백업 및 고가용성 (high availability) 에 사용됩니다.

Docker 를 사용하여 두 개의 별도 MySQL 컨테이너로 현실적인 마스터 - 슬레이브 복제 설정을 생성합니다. 먼저, 바이너리 로깅 (binary logging) 이 활성화되도록 사전 구성된 마스터 컨테이너를 시작하고 확인합니다. 마스터에 특별한 복제 사용자 (replication user) 를 생성합니다. 그런 다음, 두 번째 컨테이너를 슬레이브로 구성하고 마스터에 연결한 후 데이터가 올바르게 동기화되는지 확인합니다. 이러한 실습 접근 방식은 실제 MySQL 복제 환경을 관리하는 데 관련된 주요 단계를 이해하는 데 도움이 될 것입니다.

이것은 가이드 실험입니다. 학습과 실습을 돕기 위한 단계별 지침을 제공합니다.각 단계를 완료하고 실무 경험을 쌓기 위해 지침을 주의 깊게 따르세요. 과거 데이터에 따르면, 이것은 초급 레벨의 실험이며 완료율은 86%입니다.학습자들로부터 75%의 긍정적인 리뷰율을 받았습니다.

Docker 환경 설정

첫 번째 단계에서는 마스터 - 슬레이브 복제 환경에 필요한 Docker 컨테이너를 설정합니다. 전용 네트워크를 생성하고 두 개의 MySQL 컨테이너를 실행합니다.

  1. Docker 네트워크 생성:

    전용 네트워크를 사용하면 컨테이너 간에 이름으로 통신할 수 있습니다. mysql-net이라는 네트워크를 생성합니다.

    docker network create mysql-net
  2. 마스터 MySQL 컨테이너 시작:

    다음으로 마스터 컨테이너를 시작합니다. 이 명령은 mysql:5.7을 사용하고 서버 ID 를 1 로 구성하며 replication_db 데이터베이스에 대한 바이너리 로깅을 활성화합니다.

    docker run -d \
      --name mysql-master \
      --network mysql-net \
      -e MYSQL_ROOT_PASSWORD=lab_password \
      -e MYSQL_DATABASE=replication_db \
      mysql:5.7 \
      mysqld --server-id=1 --log-bin=mysql-bin --binlog-do-db=replication_db
  3. 슬레이브 MySQL 컨테이너 시작:

    이제 슬레이브 컨테이너를 시작합니다. 이 컨테이너도 동일한 네트워크에 있으며 서버 ID 2 로 구성됩니다. 슬레이브가 마스터의 변경 사항을 올바르게 적용할 수 있도록 replication_db 데이터베이스를 미리 생성합니다.

    docker run -d \
      --name mysql-slave \
      --network mysql-net \
      -e MYSQL_ROOT_PASSWORD=lab_password \
      -e MYSQL_DATABASE=replication_db \
      mysql:5.7 \
      mysqld --server-id=2 --relay-log=mysql-relay-bin --log-slave-updates=1
  4. 컨테이너 초기화 대기:

    MySQL 컨테이너가 초기화되는 데 시간이 필요합니다. 컨테이너가 실행 중인지 확인하기 위해 약 15 초 동안 기다립니다.

    docker ps
    CONTAINER ID   IMAGE       COMMAND                  CREATED         STATUS         PORTS                 NAMES
    
    cfe8c98d2ad0 mysql:5.7 "docker-entrypoint.s…" 2 minutes ago Up 2 minutes 3306/tcp, 33060/tcp mysql-slave
    fc125bf293ea mysql:5.7 "docker-entrypoint.s…" 2 minutes ago Up 2 minutes 3306/tcp, 33060/tcp mysql-master

이제 환경 설정이 완료되었으므로 마스터 서버 구성을 진행할 수 있습니다.

마스터 서버 설정 확인

컨테이너가 실행되었으므로 다음 단계는 마스터 서버가 복제를 위해 올바르게 구성되었는지 확인하는 것입니다. 마스터의 주요 책임은 모든 데이터베이스 변경 사항을 바이너리 로그 (binary log) 에 기록하는 것이며, 슬레이브는 나중에 이를 읽게 됩니다.

먼저 데스크톱에서 터미널을 엽니다.

이제 마스터 컨테이너에 연결하여 구성을 확인합니다.

  1. 마스터 컨테이너에 연결:

    docker exec를 사용하여 mysql-master 컨테이너 내에서 MySQL 셸을 엽니다. 암호를 입력하라는 메시지가 표시되며, 암호는 lab_password입니다.

    docker exec -it mysql-master mysql -uroot -plab_password
  2. 바이너리 로깅 및 서버 ID 확인:

    mysql> 프롬프트가 표시되면 다음 명령을 실행하여 바이너리 로깅이 활성화되었고 서버 ID 가 올바르게 설정되었는지 확인합니다.

    SHOW VARIABLES LIKE 'log_bin';

    출력에서 log_binON으로 표시되어야 합니다.

    +---------------+----+
    | Variable_name | Value |
    +---------------+----+
    | log_bin       | ON |
    +---------------+----+
    1 row in set (0.01 sec)

    다음으로 서버 ID 를 확인합니다.

    SHOW VARIABLES LIKE 'server_id';

    출력에서 server_id1로 표시되어야 합니다.

    +---------------+-------+
    | Variable_name | Value |
    +---------------+-------+
    | server_id     | 1     |
    +---------------+-------+
    1 row in set (0.00 sec)

    구성을 확인했으므로 MySQL 셸을 종료할 수 있습니다.

    exit;

마스터 서버가 복제를 위해 준비되었음을 성공적으로 확인했습니다.

복제 사용자 및 테스트 데이터베이스 생성

슬레이브 서버는 바이너리 로그를 읽기 위해 마스터에 연결해야 합니다. 보안을 위해 이 목적을 위한 전용 사용자 계정을 생성하고 제한된 권한을 부여하는 것이 가장 좋습니다. 이 단계에서는 복제 사용자를 생성하고 테스트 데이터베이스를 채워 복제를 작동하는 것을 관찰합니다.

  1. 마스터 서버에 연결:

    mysql-master 컨테이너 내에서 MySQL 셸을 엽니다.

    docker exec -it mysql-master mysql -uroot -plab_password
  2. 복제 사용자 생성:

    mysql> 프롬프트에서 다음 명령을 실행하여 repl_password라는 암호를 가진 repl_user라는 사용자를 생성합니다. 이 사용자는 슬레이브가 연결하는 데 사용됩니다. '@'%'를 사용하여 사용자가 모든 호스트에서 연결할 수 있도록 허용하며, 여기에는 Docker 네트워크의 슬레이브 컨테이너가 포함됩니다.

    CREATE USER 'repl_user'@'%' IDENTIFIED BY 'repl_password';
  3. 복제 권한 부여:

    새 사용자에게는 마스터의 바이너리 로그를 읽을 수 있는 REPLICATION SLAVE 권한이 필요합니다.

    GRANT REPLICATION SLAVE ON *.* TO 'repl_user'@'%';

    권한을 부여한 후 권한 테이블을 다시 로드하여 변경 사항을 즉시 적용합니다.

    FLUSH PRIVILEGES;
  4. 마스터의 바이너리 로그 상태 확인:

    슬레이브를 구성하기 전에 슬레이브가 복제를 시작해야 하는 마스터의 바이너리 로그 내 정확한 좌표를 알아야 합니다. SHOW MASTER STATUS 명령은 이 정보를 제공합니다.

    SHOW MASTER STATUS;

    출력은 다음과 유사합니다. FilePosition 값을 기록해 두십시오. 다음 단계에서 필요합니다.

    +------------------+----------+------------------+--------------------+-------------------+
    | File             | Position | Binlog_Do_DB     | Binlog_Ignore_DB   | Executed_Gtid_Set |
    +------------------+----------+------------------+--------------------+-------------------+
    | mysql-bin.000001 |      337 | replication_db   |                    |                   |
    +------------------+----------+------------------+--------------------+-------------------+
    1 row in set (0.00 sec)
  5. 테스트 테이블 및 데이터 생성:

    replication_db 데이터베이스는 컨테이너 시작 시 생성되었습니다. 복제를 테스트하기 위해 테이블을 생성하고 일부 데이터를 삽입해 보겠습니다.

    USE replication_db;
    CREATE TABLE messages (
        id INT PRIMARY KEY AUTO_INCREMENT,
        content VARCHAR(255)
    );
    INSERT INTO messages (content) VALUES ('Hello from the master!');

    데이터가 올바르게 삽입되었는지 확인할 수 있습니다.

    SELECT * FROM messages;

    방금 삽입한 행이 표시되어야 합니다.

    +----+------------------------+
    | id | content                |
    +----+------------------------+
    |  1 | Hello from the master! |
    +----+------------------------+
    1 row in set (0.00 sec)

    이제 MySQL 셸을 종료합니다.

    exit;

복제 사용자 및 일부 테스트 데이터를 생성하여 마스터 서버를 준비했습니다.

슬레이브 서버 구성 및 시작

이제 마스터가 준비되었으므로 슬레이브 컨테이너를 구성합니다. 이 단계에서는 3 단계에서 마스터로부터 기록한 바이너리 로그 좌표를 사용하여 슬레이브가 복제를 시작할 위치를 알려줍니다.

  1. 슬레이브 컨테이너에 연결:

    먼저 mysql-slave 컨테이너 내에서 MySQL 셸을 엽니다.

    docker exec -it mysql-slave mysql -uroot -plab_password
  2. 슬레이브를 마스터에 연결하도록 구성:

    이제 CHANGE MASTER TO 명령을 사용하여 복제 설정을 구성합니다. 3 단계에서 SHOW MASTER STATUS에서 기록한 FilePosition 값을 사용합니다. MASTER_HOST'mysql-master'이며, 이는 두 컨테이너가 동일한 Docker 네트워크에 있기 때문에 작동합니다.

    참고: mysql-bin.000001 및 위치 번호를 3 단계에서 기록한 실제 값으로 바꾸십시오. 값이 없는 경우 새 터미널에서 docker exec mysql-master mysql -uroot -plab_password -e "SHOW MASTER STATUS;"를 실행하여 가져올 수 있습니다.

    CHANGE MASTER TO
        MASTER_HOST='mysql-master',
        MASTER_USER='repl_user',
        MASTER_PASSWORD='repl_password',
        MASTER_LOG_FILE='mysql-bin.000001',
        MASTER_LOG_POS=337;

    이 명령은 슬레이브에 마스터에 연결하는 데 필요한 모든 정보를 구성합니다.

  3. 슬레이브 스레드 시작:

    마지막으로 START SLAVE 명령을 실행하여 복제 프로세스를 시작합니다. 이렇게 하면 두 개의 스레드가 시작됩니다. 하나는 마스터에서 바이너리 로그를 가져오는 I/O 스레드이고, 다른 하나는 로그의 이벤트를 실행하는 SQL 스레드입니다.

    START SLAVE;

    이제 MySQL 셸을 종료할 수 있습니다.

    exit;

슬레이브가 이제 구성되었으며 마스터에 연결하고 데이터를 복제하려고 시도해야 합니다.

복제 확인

슬레이브를 시작한 후 마지막 단계는 복제가 올바르게 작동하는지 확인하는 것입니다. 슬레이브의 상태를 확인하고 마스터의 데이터가 복사되었는지 확인할 것입니다.

  1. 슬레이브 서버에 연결:

    mysql-slave 컨테이너에서 MySQL 셸을 엽니다.

    docker exec -it mysql-slave mysql -uroot -plab_password
  2. 슬레이브 상태 확인:

    복제를 모니터링하는 가장 중요한 명령은 SHOW SLAVE STATUS입니다. \G 수정자는 출력을 세로로 형식화하여 훨씬 읽기 쉽게 만듭니다.

    SHOW SLAVE STATUS\G

    출력에서 다음 두 줄을 찾으십시오. 둘 다 Yes 값을 가져야 합니다.

    • Slave_IO_Running: Yes: 슬레이브가 마스터에 성공적으로 연결되어 바이너리 로그 데이터를 수신하고 있음을 확인합니다.
    • Slave_SQL_Running: Yes: 슬레이브가 바이너리 로그의 이벤트를 성공적으로 실행하고 있음을 확인합니다.

    또 다른 중요한 필드는 Seconds_Behind_Master입니다. 0의 값은 슬레이브가 마스터와 완전히 동기화되었음을 나타냅니다.

    정상적인 상태는 다음과 유사합니다 (일부 값은 다를 수 있습니다).

    *************************** 1. row ***************************
                   Slave_IO_State: Waiting for master to send event
                      Master_Host: mysql-master
                      Master_User: repl_user
                      Master_Port: 3306
                    Connect_Retry: 60
                  Master_Log_File: mysql-bin.000001
              Read_Master_Log_Pos: 529
                   Relay_Log_File: mysql-relay-bin.000002
                    Relay_Log_Pos: 699
            Relay_Master_Log_File: mysql-bin.000001
                 Slave_IO_Running: Yes
                Slave_SQL_Running: Yes
    ...
             Seconds_Behind_Master: 0
    ...
  3. 복제된 데이터 확인:

    이제 replication_db 데이터베이스와 해당 데이터가 마스터에서 복사되었는지 확인합니다.

    SHOW DATABASES;

    목록에서 replication_db를 볼 수 있어야 합니다.

    +--------------------+
    | Database           |
    +--------------------+
    | information_schema |
    | mysql              |
    | performance_schema |
    | replication_db     |
    | sys                |
    +--------------------+

    데이터베이스로 전환하고 messages 테이블을 쿼리합니다.

    USE replication_db;
    SELECT * FROM messages;

    마스터에 삽입한 데이터가 이제 슬레이브에 있어야 합니다.

    +----+------------------------+
    | id | content                |
    +----+------------------------+
    |  1 | Hello from the master! |
    +----+------------------------+
    1 row in set (0.00 sec)

    이는 복제가 올바르게 작동하고 있음을 확인합니다. 이제 MySQL 셸을 종료할 수 있습니다.

    exit;

Docker 를 사용하여 기본 MySQL 마스터 - 슬레이브 복제 환경을 성공적으로 설정하고 확인했습니다.

요약

이 실습에서는 Docker 를 사용하여 MySQL 마스터 - 슬레이브 복제를 설정하는 기본 단계를 배웠습니다. Docker 네트워크를 통해 연결된 마스터용 컨테이너와 슬레이브용 컨테이너 두 개를 만들어 시작했습니다. 바이너리 로그 활성화 및 고유한 서버 ID 를 포함한 마스터 구성을 확인했습니다. 그런 다음 보안 연결을 위해 마스터에 전용 복제 사용자를 생성했습니다. 마스터 준비 후 CHANGE MASTER TO 명령을 사용하여 슬레이브 컨테이너를 구성하여 마스터의 바이너리 로그 좌표와 연결을 설정했습니다. 마지막으로 SHOW SLAVE STATUS로 슬레이브 상태를 확인하고 테스트 데이터가 올바르게 동기화되었는지 확인하여 복제 성공을 검증했습니다. 이 실습을 통해 실제 MySQL 복제 설정을 구성, 관리 및 검증하는 데 필요한 기술을 습득했습니다.