SaevOps
[MariaDB] 마스터 슬레이브 구조 본문
이중화
Master-Slave 구조를 먼저 알아보겠습니다.
1. Master-Slave ( backup )
우선 그저 데이터를 백업용으로 사용하기 위한 구조입니다.
자주 비효율적이라서 사용하지는 않는 구조이지만 알아두면 좋을 것 같습니다.
2. Master-Slave ( ReadOnly )
우리가 대체적으로 사용하는 Master_Slave 구조입니다.
부하를 분산하기 위해 READ는 Slave에서 나머지는 Master에서 수행하는 구조입니다.
다음은 마스터 슬레이브 구조를 만들기 위한 명령어들입니다.
Master DB
우선 마스터 DB에 테스트하기 전에 데이터를 집어넣도록 하겠습니다.
mysql -uroot -p
create database test;
use test;
create table Users (id int(5) , name varchar(20), email varchar(20), country varchar(10), password varchar(15));
INSERT INTO Users (id, name, email, country, password) VALUES (1, 'person1', 'person1@apple.com', 'India', 'pankaj123');
INSERT INTO Users (id, name, email, country, password) VALUES (2, 'person2', 'person2@gmail.com', 'USA', 'david123');
INSERT INTO Users (id, name, email, country, password) VALUES (3, 'person3', 'person3@google.com', 'UK', 'raman123');
INSERT INTO Users (id, name, email, country, password) VALUES (4, 'person4', 'KSH@naver.com', 'KR', 'hihi123');
다음과 같은 명령어들로 데이터가 들어갔는지 확인이 가능합니다.
select count(*) from Users;
select sum(id) from Users;
select max(id) from Users;
이후 마리아DB의 기본 포트인 3306 포트를 열어주도록 합니다.
만약 포트번호를 바꾸고싶다면 /etc/my.cnf.d/server.cnf안에 클라이언트와 서버 port번호를 바꾸면 됩니다.
본 예제에서는 3306포트를 사용하고 수행하도록 하겠습니다.
firewall-cmd --permanent --zone=public --add-port=3306/tcp
firewall-cmd --reload
iptables -L -n
이후 마스터DB의 cnf파일을 수정합니다. ( 단, 마리아 디비의 5.5 이전 버전에서는 server.cnf파일이 아닐 수 있습니다.)
vi /etc/my.cnf.d/server.cnf
[내용추가]
[mysqld]
log-bin=mysql-bin
server-id=1
# binlog-do-db=동기화할DB
#expire_logs_days=10
#max_binlog_size=100MB
서비스가 구동중이거나 학습을 할 때에 마스터DB에 락 기능을 설정하고 수행하는 것이 좋습니다. WAS로 접근하여 DB에 영향을 주는 것도 있지만, 데이터베이스로 바로 들어와서 영향을 끼칠 수 있는 세션이 존재할 수 있습니다. 이를 확인하는 방법은 다음과 같습니다. 또한 락은 테이블단위로 가능하며, 명령어는 다음과 같습니다.
# 모든 프로세스 조회, 세션 조회
show full processlist;
# 마스터슬레이브 락 설정/해제 ( 전체DB단위 )
flush tables with read lock;
# 마스터슬레이브 락 설정/해제( 테이블단위 )
LOCK TABLES 테이블명 READ;
LOCK TABLES 테이블명 WRITE;
UNLOCK TABLES;
# 예시
LOCK TABLES TEST READ;
LOCK TABLES TEST WRITE;
이후 데이터베이스를 복제하고 슬레이브 서버로 전송해줍니다. 다음 예제에서는 scp를 이용하여 ( ssh통신 open ) 수행하였습니다. 파일질라와 같은 프로그램을 사용하여도 무방합니다.
# 데이터 개수 확인 (복제전에 확인)
# select count(*) from Users;
# 데이터 백업 및 슬레이브에게 전송
cd /home
################################################################
# DB 전체 백업 명령어
mysqldump -u root -p --all-databases > dump.sql
# 테이블 단위 백업 명령어
mysqldump -u root -p test idol > idol_dump.sql
# DB 단위 백업 명령어
mysqldump -u root -p --databases test > test_dump.sql
# -v 옵션 주면 진행사항도 같이 보기 가능
################################################################
# 백업 완료 확인 메시지 보기
Dump completed on 2022-03-29 14:22:13
mysqldump -u root -p -all-databases > dump.sql
# scp 통신으로전송 ( 파일질라와 같은 것으로 dump파일을 옮겨도 무방 )
scp dump.sql root@192.168.56.?:/home/
# Slave전용 아이디 생성, 마스터 상태, 포지션 확인
mysql -uroot -p
# 슬레이브 권한을 가진 ksh라는 사용자 생성
grant replication slave on *.* to 'repli_user'@'%' idenfitied by '1234';
# 새로고침
flush privileges;
# 마스터의 상태보기
show master status \G;
이후 Position 번호와 바이너리 파일이름을 기억하며 Slave DB로 이동합니다.
이 예제에서는 245와 mysql-bin.000004입니다.
Slave DB
vi /etc/my.cnf.d/server.cnf
< 내용추가 >
[mysqld]
log-bin=mysql-bin
server-id=2
# relay_log 설정
relay_log=mysql-relay-bin
# Slave에도 로그 저장
log_slave_updates=1
# 읽기전용
read_only =1
# 데이터 백업파일로 동기화
mysql -u root -p <dump.sql
# Slave전용 아이디 생성, 마스터 상태 확인
mysql -uroot -p
change master to
master_host = (마스터IP),
master_user='repli_user',
master_log_file='(바이너리파일이름)',
master_password='1234',
master_log_pos=(포지션번호),
Master_connect_retry=10;
# 슬레이브 서버 번호 확인
show variables like 'server_id';
start slave;
show slave status \G;
슬레이브 설정이 성공적으로 수행이 되었다면, 이제 마스터의 락을 풀고 데이터를 집어넣어 테스트를 진행해보면 됩니다.
# 마스터DB 락해제
UNLOCK TABLES;
이후 마스터의 데이터베이스에 데이터를 넣으면 슬레이브에도 데이터가 저장되는 모습을 확인할 수 있습니다.
실행화면
마스터-마스터 구조의 경우 이 마스터 슬레이브 구조에서 ReadOnly를 제거하고 바꿔서 한 번 더 진행하면 됩니다. 마스터 마스터의 경우 양쪽에 큰 데이터가 동시에 들어왔을 때 인덱스와 같은 곳에서 문제가 생길 수 있기 때문에 권장하지 않습니다.
'데이터베이스 > MariaDB' 카테고리의 다른 글
[MariaDB] MariaDB 버전 업그레이드 (10.3 -> 10.5) (1) | 2023.11.22 |
---|---|
[MariaDB] 이중화 고장/ 운영 에러 발생시 처리 (0) | 2022.04.15 |
[MariaDB] User 생성 삭제 권한 (0) | 2022.03.26 |