-
서버 이중화(3) - 핫 사이트란? / master<->slave 데이터 동기화환경 구축 2024. 5. 14. 02:27
지난번 포스팅 서버 이중화(1)에서는 웹서버 이중화(미러사이트 방식), 서버 이중화(2) 데이터 베이스 이중화(master-slave) 실습을 해보았다.
정리를 하자면 서버 이중화(1)에서 실습한 미러사이트 방식은 서버 분산을 위한 방식이다. 하나의 서버에 너무 많은 요청이 가지 않도록 부담을 덜어주기 위한 것이다.
서버 이중화(2)에서 다룬 Master-Slave 방식은 DB 서버를 여러 대 구성해 데이터를 동기화 시키는 과정이였다. 다시 말해 백업용 서버를 구성한 것이다.
이전 포스팅에서 실습한 Master - Slave 방식 경우에 Master 서버에 문제가 생기면 Slave 서버를 이용해 DB를 복구할 수는 있다.
하지만 개발자가 수동으로 DB를 복구해야 하고 DB 복구하는 과정 중에는 클라이언트에게 DB를 제공할 수 없다.

원본 DB서버에 문제가 생겼을 때 이런 문제점을 보완하기 위해 핫사이트라는 방식을 사용할 수 있다. master 서버를 active 서버로, slave 서버를 standby 서버로 설정해두고, master 서버에 문제가 생기면 복구 과정을 따로 거치지 않고 standby 서버로 넘기면 클라이언트에서 끊김 없이 DB를 제공할 수 있다.
Active - Standby (핫 사이트 시스템)
"active-standby" 는 말 그대로 하나의 서버가 대기(standby) 상태에 있음을 뜻한다. 아키텍쳐 상 로드밸런서와 2개의 서버로 구성되는 것은 "active-active"와 동일하지만, 하나의 서버는 서비스 되지 않고 대기하며 하나의 서버로만 트래픽을 처리하다가 active 서버에 문제가 생기면 standby 서버로 넘겨 트래픽을 처리한다.
미러사이트와 핫사이트의 차이점은 무엇일까?
우선 미러사이트는 서버의 부담을 줄이는 것이 목표이다. 하지만 핫사이트는 하나의 서버에 문제가 생겼을 때 클라이언트가 db 요청을 하는 데 문제가 생기지 않게 대기 서버를 만드는 것이 목표이다.

핫사이트 구성 후 하지만 여기서 생각해볼 문제가 있다.
회원가입을 예시로 들어보자. 어떤 유저가 회원가입을 하면 해당 정보는 DB에 저장된다.
현재 연결된 DB 서버가 Master 서버일 때 회원가입을 하면 해당 데이터는 Slave에 동기화 된다.
하지만 Master 서버에 잠시 문제가 생겨 Slave 서버가 Active 상태로 넘어갔다고 해보자. 이때 회원가입을 하게되면 해당 정보가 Slave 서버에 저장까지는 되는데 이 정보가 Master에는 동기화가 될까?
그렇지 않다. 현재 구조는 Master-Slave 구조가 단방향 구조이기 때문에 Slave 서버의 DB에 변동이 생기면 그걸 Master 서버는 알아차리지 못한다.

그래서 먼저 Slave의 데이터를 Master에 동기화되도록 하는 과정이 필요하다.
slave 서버에 master 역할을, master 서버에 slave 역할을 추가로 부여해서 서로가 서로의 마스터이면서 슬레이브가 되도록 해야한다.

Master-Slave 양방향 구조 실습 - Master - Slave 양방향으로 구성하기
해당 실습은 Master 에 했던 설정을 Slave에, Slave에 했던 설정을 Master에 그대로 해주면 된다.
1. slave에 master 권한 부여하기
1) slave cnf파일 수정
원래 써놨던 server_id=2 내용쪽에 해당 내용을 추가한다.
vi /etc/my.cnf.d/mariadb-server.cnf # [mariadb] # server_id -> 기존에 추가했던 내용 log-bin log-basename=master1 binlog-format=mixed2) 데이터 베이스 백업하기
mysqldump -u root [DB 이름] > backup.sql #db의 내용을 web.sql에 복사 scp backup.sql [Master 서버의 IP]:/root/backup.sql #web.sql 내용을 master 서버의 web.sql에 복사2. master에 slave 권한 추가하기
1) DB 복구
master 설정에서 복사해둔 파일을 db에 넣는 과정
mysql -u root [DB 이름] < backup.sql2) master 지정
-- mysql CHANGE MASTER TO MASTER_HOST='[Master 서버 IP]', MASTER_USER='[DB user 이름]', MASTER_PASSWORD='[user password]', MASTER_PORT=3306, MASTER_LOG_FILE='[마스터에서 show master status 했을 때 File 이름]', MASTER_LOG_POS=[마스터에서 show master status 했을 때 position 번호], MASTER_CONNECT_RETRY=10; START SLAVE;4) slave 연결 확인
SHOW SLAVE STATUS\G; -- Slave_IO_Running: Yes -- Slave_SQL_Running: Yes연결을 확인하면 오류가 생길 수도 있다.
log가 문제일 경우 RESET SLAVE 를 해주면 해결할 수 있다

이 이미지는 로그 파일의 관계를 나타낸 것이다.
Relay Log : 슬레이브 서버가 마스터 서버에서 받은 바이너리 로그 이벤트를 저장하는 로그 파일.
Binary Log : 마스터 서버가 자신에서 발생한 데이터 변경 이벤트를 기록하는 로그 파일.
START SLAVE 를 하면 Master의 binlog를 읽어 Slave의 relaylog에 기록을 한다.
이전 포스팅에서 이미 START SLAVE를 했기때문에 이미 slave의 relaylog파일에 기록이 남았을 것이다.
그 상태에서 이후에 추가로 Master-Slave 양방향 설정을 추가 하고 START SLAVE를 할 경우 각 서버의 바이너리 로그와 릴레이 로그 정보가 일관되지 않을 수 있습니다.
그래서 RESET SLAVE 명령을 통해 기존 log 파일 내용을 초기화 한 후 다시 START SLAVE를 하면 문제를 해결할 수 있다.
'환경 구축' 카테고리의 다른 글
서버 이중화(6) - Clustering 클러스터링 / Galera (1) 2024.05.29 서버 이중화(5) - DB 서버에 HAproxy 연결하기 (2) 2024.05.28 서버 이중화(4) - DB서버로 핫사이트 실습해보기 / Keepalived / Virtual IP (3) 2024.05.16 서버 이중화 (2) - 데이터 베이스 이중화 / Master-Slave (0) 2024.05.14 서버 이중화 (1) - 재난 복구 / 웹서버 이중화로 미러사이트 실습하기 (2) 2024.05.11