-
서버 이중화 (2) - 데이터 베이스 이중화 / Master-Slave환경 구축 2024. 5. 14. 01:53

위의 구조와 같이 DB 서버가 하나 있을 때, DB 서버에 문제가 생기면 어떤 일이 일어날까?
실제 서비스라고 생각하면 회원 정보가 날라간다거나 결제가 잘못되는 등 엄청나게 큰 문제가 될 것이다.
그래서 보통 DB 서버는 3개 이상으로 구성한다고 한다.
💡 왜 2개가 아니라 3개 이상일까?
랙과 관련이 있다. db 서버에만 문제가 생기는 것이 아니라 랙 자체에도 문제가 생길 수 있다. 랙에 문제가 생기면 그 랙 안의 db는 다 망가지는 것이다. 그래서 보통 하나의 랙에 2개의 db(하나의 랙에 있어야 데이터 교환이 더 빠르다), 다른 랙에 1개의 db를 구축한다고 한다. 그러면 랙 자체가 나가도 다른 랙에 있는 db로 대처할 수 있다.💡Replication
데이터베이스 리플리케이션(Replication)은 실시간 복제본 데이터베이스 서버를 운용하는 것을 의미한다. 기준이 되는 서버를 마스터 서버라 하고, 마스터 서버와 동일한 내용을 갖는 또 다른 서버를 ‘리플리카(Replica)’라 한다.DB를 여러개 구성한다고 할 때, 각 DB들은 백업의 역할을 수행하야 하기 때문에 모두 같은 DB와 내용을 가지고 있어야 한다.
그렇다면 여러대의 DB서버가 있을 때 데이터를 어떻게 동기화 시켜야 할까?
대표적으로 Master-Slave 방식이 있다.
Master는 원본 데이터를 저장하는 서버이고, Slave는 백업용 서버이다. Slave 서버가 Master 서버를 쳐다보고 있다가 Master 서버의 데이터에 변경이 있으면 Slave가 해당 변경 내용을 그대로 복사해온다.

Mater-Slave 구조 실습 - DB 서버 두 대를 이용해 Master - Slave 구축하기
1. DB 서버 두 대에 mariadb 설치, db 생성, user 생성
1) 두 대의 서버에 mariadb 설치
2) database 와 user 생성
생성할 db와 user은 두 대 모두 같게 해야한다. 원본과 백업용이기 때문에 연결한 데이터 베이스가 서로 이름이 다르거나 user 의 이름이 다르면 변경된 내용을 복사해갈 수 없다.
-- Master , Slave -- database 생성 -- CREATE DATABASE [생성할 db 이름]; CREATE DATABASE master_slave; -- user 생성 -- CREATE USER '[생성할 user 이름]'@'%' IDENTIFIED BY '[user 비밀번호]'; CREATE USER 'master_slave_user'@'%' IDENTIFIED BY 'qwer1234';2. master 설정
1) 복제 권한 부여
slavr 가 master의 데이터 베이스를 복제해갈 수 있도록 사용자에게 복제 권한을 줘야 한다.
-- Master -- 복제 권한 부여 -- GRANT [권한] ON [데이터 베이스].[테이블] TO '[user]'@'[host ip주소]'; GRANT REPLICATION SLAVE ON *.* TO 'master_slave_user'@'%'; -- REPLICATION SLAVE : 슬레이브 서버가 마스터 서버로부터 데이터를 읽을 수 있는 권한 -- *.* : 모든 데이터베이스에 대한 모든 테이블. slave는 master 의 모든 데이터를 복제해야 하므로 모든 데이터의 모든 테이블에 대해 권한을 줘야 한다. -- @'%' : 사용자가 모든 호스트(%)로부터 접속할 수 있도록 설정. '%'는 와일드카드로, 모든 IP 주소나 호스트 이름을 의미.2) cnf 파일 수정
slave 가 데이터의 변경 사항을 감지할 수 있도록 master에서 바이너리 로그 파일을 활성화 해서 데이터의 변경 사항이 모두 기록되도록 한다.
vi /etc/my.cnf.d/mariadb-server.cnf #[mariadb] <- 이거는 추가하는거 아님. 해당 글씨 밑에 아래 내용을 추가 log-bin server_id=1 # 서버마다 다르게 log-basename=master1 binlog-format=mixed # log-bin : 바이너리 로그를 활성화. 바이너리 로그는 데이터베이스의 모든 변경 사항(insert, update, delete 등)을 기록하여 데이터 복제 및 복구에 사용됨. # server_id : 서버의 고유 식별자 # log-basement : 바이너리 로그 파일의 기본 이름 지정. 바이너리 로그 파일 이름을 master1.000001와 같은 형식으로 만들어 어떤 서버에서 생성된 로그인지 쉽게 식별할 수 있게 함. # binlog-format=mixed : 바이너리 로그의 형식을 설정합니다. mixed는 statement 기반과 row 기반의 혼합된 형식 사용. # mariadb 파일을 수정했기 때문에 mariadb를 재시작 해야 적용이 됨. systemctl restart mariadb3) master 상태 확인
해당 명령어를 입력하면, 바이너리 로그 파일 정보가 나온다.
이 정보를 통해 슬레이브 서버가 어느 위치에서 복제를 시작해야 하는지 알 수 있다.
# mysql SHOW MASTER STATUS;# 예시 결과 +------------------+----------+--------------+------------------+-------------------+ | File | Position | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set | +------------------+----------+--------------+------------------+-------------------+ | master1.000001 | 154 | | | | +------------------+----------+--------------+------------------+-------------------+ 1 row in set (0.00 sec) # File : 바이너리 로그 파일 이름 # Position : 현재 바이너리 로그 파일에서의 위치. 슬레이브 서버는 이 위치부터 로그를 읽기 시작한다3) DB 백업
슬레이브는 마스터의 바이너리 로그 파일의 내용을 읽어 데이터 변경이 감지됐을 때만 데이터를 가져오기 때문에 바이너리 로그 파일이 생성되기 전의 데이터는 가져오지 못한다. 따라서 이미 존재하는 데이터를 수동으로 slave에 백업해줘야 한다.
# db의 내용을 backup.sql에 복사 # mysqldump -u root [DB 이름] > [DB 내용을 저장할 파일 이름].sql mysqldump -u root master_slave > backup.sql # backup.sql 내용을 slave 서버의 root파일에 backup.sql파일을 만들어 해당 내용을 그대로 복사 # scp [DB 내용이 저장된 파일 이름].sql [SLAVE 서버의 IP 주소]:/root/[백업 내용을 복사해 저장할 파일 이름].sql scp backup.sql 123.123.123.10:/root/backup.sql3. slave 설정
1) DB 복구
master의 데이터 베이스 내용이 담긴 sql 파일 내용을 slave의 database에 적용하는 과정
mysql -u root master_slave < backup.sql2) cnf 파일 수정
vi /etc/my.cnf.d/mariadb-server.cnf #[mariadb] <- 해당 섹션 밑에 아래 내용을 추가 server_id=23) master 지정
slave 서버가 바라볼 master 서버에 대한 정보를 설정해줘야 한다. (slave 가 읽을 바이너리 로그 파일 정보)
# mysql # CHANGE MASTER TO # MASTER_HOST='[Master 서버 IP]', # MASTER_USER='[database user]', # MASTER_PASSWORD='[user password]', # MASTER_PORT=3306, # MASTER_LOG_FILE='[바이너리 로그 File 이름]', # MASTER_LOG_POS=[바이너리 로그 파일의 position 번호], # MASTER_CONNECT_RETRY=10; CHANGE MASTER TO MASTER_HOST='123.123.123.20', MASTER_USER='master_slave_user', MASTER_PASSWORD='qwer1234', MASTER_PORT=3306, MASTER_LOG_FILE='master1.000001', MASTER_LOG_POS=154, MASTER_CONNECT_RETRY=10;4) slave 프로세스 시작
START SLAVE; # 복제(slave) 프로세스를 시작. # 슬레이브 서버가 마스터 서버에 연결되고 바이너리 로그를 읽어 데이터베이스 복제를 수행한다.5) slave 상태 확인
SHOW SLAVE STATUS\G # Slave_IO_Running: Yes # Slave_SQL_Running: Yes # 이 두가지 상태가 모두 Yes 라고 되어있어야 정상적으로 연결 된 것이다.4. Master-Slave 테스트 하기
Master와 slave 설정을 마치고 slave 연결 상태가 정상이라면, 이제 slave가 정말로 데이터를 복제해오는지 확인해보자.
Master 서버에서 database에 table을 생성하고 데이터를 넣어본 후 slave 서버에서 데이터 베이스 내용을 확인해보면, slave 데이터베이스에 직접 데이터를 작성한 적이 없어도, master 서버에서 생성한 데이터 내용이 들어있을 것이다.
'환경 구축' 카테고리의 다른 글
서버 이중화(6) - Clustering 클러스터링 / Galera (1) 2024.05.29 서버 이중화(5) - DB 서버에 HAproxy 연결하기 (2) 2024.05.28 서버 이중화(4) - DB서버로 핫사이트 실습해보기 / Keepalived / Virtual IP (3) 2024.05.16 서버 이중화(3) - 핫 사이트란? / master<->slave 데이터 동기화 (0) 2024.05.14 서버 이중화 (1) - 재난 복구 / 웹서버 이중화로 미러사이트 실습하기 (2) 2024.05.11