오늘의하루

[Docker - MySQL] Master-Slave 동기화 본문

Data Base/Master-Slave

[Docker - MySQL] Master-Slave 동기화

오늘의하루_master 2024. 4. 21. 22:10

DB(데이터베이스)를 Master와 Slave로 나누는 것은 주로 데이터베이스의 성능, 확장성, 가용성, 및 안정성을 향상시키기 위해 사용되는 아키텍처 설계 패턴입니다. Master는 데이터에 대한 쓰기 작업을 담당하고, Slave는 주로 읽기 작업을 처리합니다. 이렇게 부하를 분리함으로써 읽기 요청이 많은 환경에서 성능을 향상시킬 수 있습니다.


NETWORK

docker network master-slave

docker network connect master-slave [master container_name_or_id]
docker network connect master-slave [slave container_name_or_id]

docker network inspect master-slave

Master

CREATE DATABASE MASTER_DB; -- MASTER용 DB를 생성한다.

CREATE USER 'MASTER_ID'@'%' IDENTIFIED WITH mysql_native_password BY 'MASTER_PWD'; -- MASTER용 계정 생성

-- 권한을 설정한다.
GRANT REPLICATION SLAVE ON *.* TO 'MASTER_ID'@'%';
GRANT ALL PRIVILEGES ON MASTER_DB.* TO 'MASTER_ID'@'%';

SET GLOBAL server_id=1; -- MASTER-SLAVE 전략시 server_id가 달라야 하기 때문에 설정해준다.
-- 또는 my.cnf에서 server_id=1 이렇게 설정할 수 있다.
-- my.cnf로 설정시 다시 시작 해도 설정되지만 SET GLOBAL은 재시작시 사라진다.

FLUSH PRIVILEGES;

SHOW MASTER STATUS;

+---------------+----------+--------------+------------------+-------------------+
| File          | Position | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set |
+---------------+----------+--------------+------------------+-------------------+
| binlog.000002 |     2554 |              |                  |                   |
+---------------+----------+--------------+------------------+-------------------+

Slave

CREATE USER 'SLAVE_ID'@'%' IDENTIFIED BY 'SLAVE_PWD'; -- SLAVE용 계정 생성

GRANT REPLICATION SLAVE, REPLICATION CLIENT ON *.* TO 'SLAVE_ID'@'%'; -- 권한을 설정한다.

SET GLOBAL server_id=2; -- MASTER-SLAVE 전략시 server_id가 달라야 하기 때문에 설정해준다.

FLUSH PRIVILEGES;

CHANGE MASTER TO
    MASTER_HOST = 'MASTER IP',
    MASTER_PORT = 'MASTER PORT',
    MASTER_USER = 'MASTER ID',
    MASTER_PASSWORD = 'MASTER_PASSWORD',
    MASTER_LOG_FILE = 'SHOW MASTER STATUS > FILE'
    
START SLAVE;

SHOW SLAVE STATUS\G;

SLAVE STATUS

  • Slave_IO_Running과 Slave_SQL_Running : 모두 Yes
  • Exec_Master_Log_Pos : 마스터의 바이너리 로그를 어디까지 실행했는지 나타내는 위치 포인터
Comments