DB

[DB] MariaDB Master - Master 설정

찹쌀궁뎅이 2025. 4. 4. 07:57
반응형

고객 사 전산팀에서 서버 및 DB 이중화를 요청했다. (몇 년 동안 안 하다가 왜 내가 입사하니까 갑자기..)
서버 이중화는 기존에 L4가 세팅되어 있어서 간단한 Nginx 세팅과 서비스만 올리면 되었고, DB는 따로 세팅해주어야 했다.

1.Master - Slave

처음에는 Master - Slave로 설정하면 될 줄 알고 세팅해봤는데 문제점이 있었다.
Slave 서버는 껐다 켜도 동기화가 되지만 Master 서버를 껐다 키면 동기화가 되지 않았다.
내가 (고객사에서) 바라던 방식은

  1. 어느 DB에 데이터를 넣어도 동기화 되어야 한다.
  2. 한 개의 DB를 껐다 켜도 동기화가 되어야 한다.

라는 조건이었다.

2.Master - Master

그래서 알게된 Master - Master 설정
서로를 서로의 Master이면서 Slave로 설정하는 것이다. 그래서 내가 위에 작성한 내용의 조건을 충족시킬 수 있었다.
설정 방법은 간단하다.

IP가 아래와 같이 설정되어있다고 가정해보자

Server_A (10.10.10.11)
Server_B (10.10.10.12)

3.Server_A 세팅

3-1.my.cnf 세팅

먼저 Server_A 부터 세팅해준다.
MariaDB 설정파일인 /etc/mysql/my.cnf에 아래 내용을 추가해준다.

[mysqld]
log-bin
server_id=1 
replicate-do-db=mobile_app 
bind-address=0.0.0.0 
  • log-bin: 바이너리 로그 활성화 시켜주는 설정이다. 로그를 통해 동기화하기 때문에 활성화 시켜줘야 한다.
  • server_id: 서버 아이디 설정
  • replicate-do-db: 특정 데이터베이스만 동기화되도록 할 수 있는 설정이다. 만약 여러 개 하고 싶다면 아래로 쭉 나열하여 여러 개 작성할 수 있다.
  • bind-address: 특정 IP만 지정 허용할 수 있는 설정이다. 만약 0.0.0.0으로 설정하면 모든 IP를 허용하겠다는 의미이다.

3-2.Mysql 재실행

설정 내용 저장 후 Mysql을 재실행 해준다.

service mysql restart
or
systemctl restart mysql

3-3.계정 생성

동기화할 계정을 생성해준다.

CREATE USER 'repli'@'%' IDENTIFIED BY 'qwer1234!'	=> 계정 생성
GRANT REPLICATION SLAVE ON *.* TO 'repli'@'%';	=> SLAVE 권한 부여
GRANT ALL PRIVILEGES ON mobile_app.* TO 'repli'@'%';	=> mobile_app 데이터베이스 관련한 모든 권한 부여
FLUSH PRIVILEGES;			=> 수정 내용 저장

4.Server_B 세팅

4-1.my.cnf 세팅

같은 방식으로 Server_B 세팅해준다.
/etc/mysql/my.cnf에 아래 내용을 추가해준다.

[mysqld]
log-bin
server_id=2
replicate-do-db=mobile_app 
bind-address=0.0.0.0 

4-2.Mysql 재실행

설정 내용 저장 후 Mysql을 재실행 해준다.

service mysql restart
or
systemctl restart mysql

4-3.계정 생성

동기화할 계정을 생성해준다.

CREATE USER 'repli'@'%' IDENTIFIED BY 'qwer1234!'	=> 계정 생성
GRANT REPLICATION SLAVE ON *.* TO 'repli'@'%';	=> SLAVE 권한 부여
GRANT ALL PRIVILEGES ON mobile_app.* TO 'repli'@'%';	=> mobile_app 데이터베이스 관련한 모든 권한 부여
FLUSH PRIVILEGES;			=> 수정 내용 저장

4-4.Salve 설정

먼저 Server_A에 가서 Master 상태를 확인한다.

SHOW MASTER STATUS;
+------------------+----------+--------------+------------------+
| File | Position | Binlog_Do_DB | Binlog_Ignore_DB|
+------------------+----------+--------------+------------------+
| mariadb-bin.000001 | 626 | | |
+------------------+----------+--------------+------------------+
1 row in set (0.00 sec)

그리고 Server_B에서 Slave 설정을 해준다.

STOP SLAVE;				=> 작동 중일 경우 STOP
CHANGE MASTER TO 
	MASTER_HOST = '10.10.10.11', 	=> MASTER IP
	MASTER_USER = 'repli', 		=> MASTER 유저명
	MASTER_PASSWORD = 'qwer1234!', 	=> MASTER 비밀번호
	MASTER_LOG_FILE = 'mariadb-bin.000001', 	=> MASTER 로그 파일
	MASTER_LOG_POS = 626;		=> MASTER 로그 파일 위치
START SLAVE;			=> SLAVE 실행
SHOW SLAVE STATUS\G;			=> SLAVE 상태 확인

5.Server_A 세팅

5-1.Salve 설정

마지막으로 Server_A에 Slave 설정을 해주면 된다.
Server_B에 가서 Master 상태를 확인한다.

SHOW MASTER STATUS;
+------------------+----------+--------------+------------------+
| File | Position | Binlog_Do_DB | Binlog_Ignore_DB|
+------------------+----------+--------------+------------------+
| mariadb-bin.000002 | 635 | | |
+------------------+----------+--------------+------------------+
1 row in set (0.00 sec)

해당 내용을 참고하여 Slave 설정을 해준다.

STOP SLAVE;			        => 작동 중일 경우 STOP
CHANGE MASTER TO 
	MASTER_HOST = '10.10.10.12', 	=> MASTER IP
	MASTER_USER = 'repli', 	        => MASTER 유저명
	MASTER_PASSWORD = 'qwer1234!', 	=> MASTER 비밀번호
	MASTER_LOG_FILE = 'mariadb-bin.000002', 	=> MASTER 로그 파일
	MASTER_LOG_POS = 635;		=> MASTER 로그 파일 위치
START SLAVE;                        => SLAVE 실행
SHOW SLAVE STATUS\G;			=> SLAVE 상태 확인

6.이중화 테스트

이렇게 하면 Master - Master 설정은 끝이다. 이제 한 번 테스트 해보자.

  • Server_A (테스트하느라 1,2 데이터가 안 맞습미다..) 
  • Server_B 
  • 그리고 Server_A 테이블에 데이터를 입력해준다. 
  • Server_B 테이블에 데이터 들어간 것 확인 
  • 이번엔 Server_B 테이블에 데이터 입력 
  • Server_A 테이블에 데이터 들어간 것 확인 

이중화 작업은 처음해봐서 복잡할까봐 걱정했는데 생각보다 단순하여 다행이었다 다만 서비스 수정하는 과정이 너무 귀찮았다..


 

반응형