개발

[mariadb] 양방향 replication

hellworld 2023. 6. 17. 12:36

이번 포스팅에서는 mariadb 양방향 replication에 대해 내용을 정리하고 테스트까지 수행해 보고자 한다. 우선 지난 포스팅([mariadb] replication)에서 단방향 replication을 구성해 보았는데, 통상 서비스를 운용하다 보면 failover 가 연속적으로 발생하는 경우가 많고 그로 인해서 로그가 유실되는 경우들이 발생할 수 있다. 이런 케이스에서 db 동기화가 단방향으로만 구성되어 있을 경우 일회성 failover는 동기화가 유지되겠지만 연속적으로 발생했을 때는 문제가 발생한다.

 

양방향 replication은 db가 상호 동기화 처리가 되기 때문에 연속적 failover에 비교적 안정성이 높다고 볼 수 있다. 다만 slave 서버가 오랫동안 down 된 상태에서 master에 쿼리 로그가 많이 누적될 경우 slave 가 살아나서 동기화가 완료되기 전에 failover 가 발생하면 미처 동기화하지 못한 데이터가 신규 데이터와 섞이는 문제가 발생할 수는 있다.

 

이제 양방향 replication 을 구성해 보도록 하겠다.

지난 포스팅에서 mariadb_c0에 replication master 설정을 모두 하였고 mariadb_1에 replication slave 설정을 완료하였기 때문에 mariadb_c0의 데이터가 maridb_c1으로 동기화되고 있는 상태라고 가정하겠다.

 

이번에는 mariadb_c1에 replication master 설정이 되고 mariadb_c0에 slave 설정이 추가된다고 보면 되겠다.

PS> docker exec -it mariadb_c1 bash
# apt-get update
# apt-get install vim
# vim /etc/mysql/mariadb.conf.d/50-server.cnf

# master db 의 50-server.cnf 설정 파일 편집
[mariadb]
server-id=2
log_bin=/var/log/mysql/mysql-bin.log
expire_logs_days=5
max_binlog_size=10M

# 파일 저장 후 mariadb_c1 container 재구동

mariadb_c1에 replication master 설정 적용
mariadb_c1 에 replication server_id 설정 확인
mariadb_c1 에 replication log_bin 설정 확인

# mariadb_c1 에 접속하여 replication 전용 계정 추가
CREATE USER 'r_user'@'172.18.0.1' IDENTIFIED BY 'r_user';
GRANT REPLICATION SLAVE ON *.* TO 'r_user'@'172.18.0.1';
SET PASSWORD FOR 'r_user'@'172.18.0.1' = PASSWORD('p@ssw0rd');
FLUSH PRIVILEGES;
SHOW GRANTS FOR 'r_user'@'172.18.0.1';
SELECT u.Host, u.User, u.Repl_slave_priv  FROM user AS u WHERE u.user='r_user';

mariadb_c1에 replication master 설정이 완료되었으므로 이제 mariadb_c0에 salve 설정을 적용한다.

# mariadb_c0에 접속하여 replication slave 설정을 반영한다.
STOP SLAVE;
CHANGE MASTER TO 
MASTER_HOST='172.24.80.1', 
MASTER_PORT=13306,
MASTER_USER='r_user',
MASTER_PASSWORD='p@ssw0rd', 
MASTER_LOG_FILE='mysql-bin.000001',
MASTER_LOG_POS=8267;
START SLAVE;
SHOW SLAVE STATUS;

mariadb_c0 replication slave 설정 및 결과

이제 양방향으로 master/slave 설정이 모두 되었으므로 테스트를 해보겠다.

이상 양방향 replication을 구성하고 테스트까지 해보았다. 본 환경은 docker mariadb container를 사용하였기 때문에 일반적인 mariadb 패키지와는 설정파일 및 내용이 상이할 수 있습니다.

 

다음 스터디에서는 mariadb gelera cluster에 대해서 스터디할 계획이다.