일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | |||
5 | 6 | 7 | 8 | 9 | 10 | 11 |
12 | 13 | 14 | 15 | 16 | 17 | 18 |
19 | 20 | 21 | 22 | 23 | 24 | 25 |
26 | 27 | 28 | 29 | 30 | 31 |
- psutil
- 자식프로세스
- repo
- Windows
- asyncio
- Finance
- apt-get
- 파이썬
- QT_QPA_PLATFORM_PLUGIN_PATH
- go.mod
- go
- 영상스트리밍
- Hyper-V
- 주식
- golang
- FastAPI
- 스트리밍
- dockercontainer
- pip
- Python
- APT
- Replication
- python3.9
- mariadb
- docker
- 자원측정
- Thread
- BATCH
- 레파지토리
- 가상화 중첩화
- Today
- Total
검색하기귀찮아서만든블로그
[mariadb] replication 본문
지난 포스팅에서 docker를 사용하여 mariadb container 두 개를 구성해 보았다. 양방향으로 접속이 되는 것을 확인했기 때문에 오늘은 예정대로 리플리케이션에 대해서 구성해 볼 생각이다.
우선 리플리케이션은 두 디비를 동기화하기 위한 목적으로 제공되는 기능이고 보통 master/slave 구성의 환경에서 active 된 서버의 db를 slave 측으로 동기화하기 위해 사용한다. 이 경우 단방향 replication 을 사용하여 구성하면 되는데 시스템 장애로 인하여 failover 가 발생하면 master/slave가 스왑 되는데 이때 active 되는 db에 기존 데이터를 동기화하여 서비스 연속성을 보장하는데 그 목적이 있다.
replication 구성 전에 docker를 사용하여 mariadb 두 개를 구성하였다는 전제하에 작성할 예정이니 아래 포스팅을 먼저 수행하면 된다.
[Docker] mariadb 컨테이너 구축 (tistory.com)
[Docker] mariadb 컨테이너 구축
이번 포스트에서는 docker desk top 이 설치된 환경에 linux 용 mariadb 서버를 구성하는 방법에 대해서 공유하고자 한다. 먼저 도커 데스크 톱 사용 방법은 지난 포스팅에서 작성한 도커 사용기를 참조
access-violation.tistory.com
그럼 본격적으로 replication 구성을 해보도록 하겠다.
먼저 테스트를 위해 두 DB에 동일한 테이블을 생성한다. (replication을 먼저 구성하고 만들었어도 될 듯?)
테이블의 primary key 는 자동으로 생성되도록 auto_increament로 구성하였다.
CREATE TABLE `test_table` (
`table_idx` INT(10) UNSIGNED NOT NULL AUTO_INCREMENT,
`value` VARCHAR(50) NULL DEFAULT NULL COLLATE 'utf8mb4_general_ci',
`update_date` TIMESTAMP NULL DEFAULT current_timestamp() ON UPDATE current_timestamp(),
PRIMARY KEY (`table_idx`) USING BTREE,
INDEX `update_date` (`update_date`) USING BTREE
)
COLLATE='utf8mb4_general_ci'
ENGINE=InnoDB;

테이블 생성을 마쳤으면 우선 master container에 bash 접속해서 mariadb 설정을 편집기로 오픈한다.
PS> docker exec -it mariadb_c0 bash
# cat /etc/mysql/my.cnf
보통 mariadb 설정 파일은 /etc/my.cnf 에 위치하고 있는데 컨테이너 내부에 있는 my.cnf 심볼릭링크 파일을 열어 보면 위에서 오픈한 설정들이 import 된 것을 볼 수 있다. 그래서 해당 경로를 확인해 보니 50-server.cnf 파일이 있었고 거기에 이미 replication 에 대한 샘플 내용이 있어서 해당 파일에서 설정을 추가해보았다.

편집을 위해 vim 을 설치하고 설정 파일을 오픈한다.
# apt-get update
# apt-get install vim
# vim /etc/mysql/mariadb.conf.d/50-server.cnf

# master db 의 50-server.cnf 설정 파일 편집
[mariadb]
server-id=1
log_bin=/var/log/mysql/mysql-bin.log
expire_logs_days=5
max_binlog_size=10M
server-id 는 리플리케이션 대상을 지정할 때 사용하는 식별자로 사용되고 log_bin은 master db 에서 수행되는 쿼리 로그를 기록할 파일, expire_logs_days 와 max_binlog_size 설정은 쿼리 로그를 유지할 최대 기간과 사이즈이다. 두 서버에 장애 발생으로 인하여 리플리케이션이 동작하지 못할 경우 최대로 동기화를 유지할 수 있는 범위를 지정하는 옵션이기 때문에 적절하게 설정하여 사용하면 될 것 같다. (db 데이터 수집 양에 따라 알맞게 설정)
설정을 마쳤으면 파일을 저장하고 master container 를 재구동한다. (systemctl restart mariadb) 재구동 후에 쿼리를 사용하여 반영 상태를 확인한다.
반영 상태는 master mariadb_c0에 접속하여 설정한 replication 쿼리 로깅 설정 상태를 조회한다.

설정이 정상적으로 반영되면 master mariadb 에서 수행되는 쿼리가 로그로 기록되고 있다고 보면 된다.
이제 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';
이제 거의 다 됐다. 마스터 설정이 다 되었으니 slave 서버에 replication 설정만 하면 된다.
slave mariadb_c1에 접속해서 아래 쿼리를 실행하여 replication 설정을 마무리한다.
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=5188;
START SLAVE;
SHOW SLAVE STATUS;
MASTER_LOG_FILE 설정과 MASTER_LOG_POS 값은 master mariadb_c0 db에 접속하서 조회한 값을 참조하여 입력한다. 설정 값에 따라서 해당 포지션 부터 동기화 동작을 수행하기 때문에 필요에 따라서 쿼리 로그파일을 열어 특정 포지션을 확인하면 해당 위치부터 복구를 수행할 수도 있다. (장애 발생 시)

slave 상태에 "Wating for master to send event"라고 표기되면 master/slave db가 서로 연결되어 master >> slave로 동기화하고 있다고 보면된다.
아래는 master mariadb_c0에 데이터를 입력하면 slave mariadb_c1에 기록되는 테스트 화면이다

이상 mariadb replication을 구성하여 테스트까지 수행해 보았다. 다음 포스팅에서는 양방향 replication에 대해서 작성해볼 예정이다.
'개발' 카테고리의 다른 글
[GO] IDE 구성하기 (0) | 2023.09.28 |
---|---|
[mariadb] 양방향 replication (0) | 2023.06.17 |
[Docker] mariadb 컨테이너 구축 (0) | 2023.06.17 |
[ML] CNN 알고리즘에 대한 이해와 고찰 (0) | 2022.11.29 |
[ML] MNIST 모델 학습 (0) | 2022.11.28 |