# MySQL(MariaDB) Replication
- DB 복제를 의미
- 2대 이상의 DBMS 를 나눠서 데이터를 저장하는 방식
(master-slave, master-master, 다중 slave 방식 등)
- 비동기 복제 방식
# Replication(복제)을 하는 이유
- 실시간 데이터 백업이 가능
- DB서버 부하 분산이 가능
(master에서는 주로 삽입, 삭제, 수정 / slave 에서는 주로 조회)
# Master 와 Slave DB
- Master : 데이터에 대한 변경(등록, 수정, 삭제) event 발생시 binary logs 에 기록하고, slave 서버에 전달
(master 는 slave 에 대한 정보를 전혀 모름. - 몇 개의 slave가 있는지 등)
- Slave : master에서 전달받은 binarylog를 읽어 DB에 반영
# Binarylog 란?
- binarylog = binlog
- mysql(maria DB)에서 발생하는 모든 내역들이 기록되는 파일
- binary log 는 default 는 비활성되어 있는데, 이를 활성화 시켜야 함
# 복제 방식
- STATEMENT : SQL문을 복사
- ROW : 변경된 row만 복사
- MIXED : 두가지 방식을 섞어서 복사
# 주의 사항
- master와 slave의 구성환경을 동일해야 함.(ex. mysql 버전!)
- master → slave 순으로 작동시켜야 함
- replication 을 하다보면 binary log가 계속 쌓임. 이를 cron을 이용하여 처리하거나
my.cnf 에 expire_logs_days 에 유효기간을 지정
- Replication 과정에서 에러가 발생하는 경우, slave는 에러 로그를 작성한다.
후에 에러를 추적하여 바이너리 로그를 분석하여 유실된 자료에 대해 자동 업데이트가 가능
# Replication 동작과정
#실습
# MasterDB (centos8)
# 방화벽 먼저 꺼주기
systemctl stop firewalld
# Master DB 설정
yum -y install mariadb-server
vi /etc/my.cnf.d/mariadb-server.cnf
######################################
# 맨 마지막 줄에 붙여넣기
log-bin = mysql-bin
server-id = 1
binlog_format = row
expire_logs_days = 2
######################################저장
systemctl restart mariadb # systemctl enable --now mariadb
mysql
> grant replication slave on *.* to 'slave_db'@'%' identified by '1234'; # slaveDB 복제
> show master status; # 번호 복사
# File명과 Position 잘 기록하기
*** DB 재시작시 file명과 position 번호가 변경될 수 있음
# SlaveDB (centos8-2)
# 방화벽 먼저 꺼주기
systemctl stop firewalld
# Master DB 설정
yum -y install mariadb-server
vi /etc/my.cnf.d/mariadb-server.cnf
######################################
# 맨 마지막 줄에 붙여넣기
log-bin = mysql-bin
server-id = 2
binlog_format = row
expire_logs_days = 2
######################################저장
systemctl restart mariadb
=> mysql -u root -p => mysql 접속
# master 연동 설정
CHANGE MASTER TO
MASTER_HOST="10.10.10.10",
MASTER_USER="slave_db",
MASTER_PASSWORD="12345678",
MASTER_PORT=3306,
MASTER_LOG_FILE="mysql-bin.000001", # 수정
MASTER_LOG_POS= 328; # 수정
start slave; #slave 실행
show slave status; # slave 상태 확인
# Master(MariaDB) Replication 확인(연동 확인)
## 1. DB 확인
# Master
>create database TEST_DB;
# Slave
show databases; # 생성된 DB 확인
## 2. Table 확인
# Master
mysql> use TEST_DB;
mysql> CREATE TABLE USER_TB(
user_idx INT PRIMARY KEY AUTO_INCREMENT,
user_name VARCHAR(10) NOT NULL
);
# Slave
mysql> use TEST_DB;
mysql> show tables; # 생성된 테이블 확인
## 3. DATA 확인
# Master
mysql> INSERT USER_TB(user_name) values('daeun');
# Slave
mysql> SELECT * FROM USER_TB; # 생성된 데이터 확인
# HAProxy : Master DB 와 Slave DB 로드밸런싱(centos7 - DB없는서버)
yum -y install mariadb # mariadb 클라이언트 다운로드
vi /etc/haproxy/haproxy.cfg
##################################################
# 마지막 줄 추가하기
frontend mysql-in
bind *:3306
default_backend db_servers
backend db_servers
balance roundrobin
server db01 10.10.10.10:3306 check
server db02 10.10.10.20:3306 check
##################################################저장
systemctl restart haproxy
#NGW => Mariadb 서버 TCP 3306 포트 허용
firewall-cmd --permanent --add-service=mysql --zone=external
firewall-cmd --reload
firewall-cmd --zone=external --list-all
# 로드밸런싱 확인을 위한 원격 접속
mysql -h 192.168.1.111 -u root -p
#HAProxy활용하여 로드밸런싱으로 DB 원격 로그인 설정
- DB없는 서버(centos7)에서 Master/Slave DB(centos8/8-2)로 원격 접속
# 원격 접속 설정
##centos7(DB 없는 원격접속 서버)
yum -y install mariadb # mariadb 클라이언트 다운로드
##centos8/8-2(master/slave)
mysqladmin -u root password '1234' #비번 설정
mysql -u root -p '1234' # 로그인
mysql > show database;
mysql > use mysql
mysql > select user, host from user where user not like ' '; # 원격접근권한 여부 확인(% 확인)
mysql > grant all privileges on *.* to root@'192.168.1.%' identified by '4321'; # 원격접근권한 부여
#show tables;
#desc user;
# 로드벨런싱(haproxy) 설정
##centos7(DB 없는 원격접속 서버)
vi /etc/haproxy/haproxy.cfg
##################################################
# 마지막 줄 추가하기
frontend mysql-in
bind *:3306
default_backend db_servers
backend db_servers
balance roundrobin
server db01 10.10.10.10:3306 check
server db02 10.10.10.20:3306 check
##################################################저장
systemctl restart haproxy
# DB 포트 허용
##centos7(centos8, 8-2에도 방화벽이 있다면 해줘야함)
#NGW => Mariadb 서버 TCP 3306 포트 허용
firewall-cmd --permanent --add-service=mysql --zone=external
firewall-cmd --reload
firewall-cmd --zone=external --list-all
# 로드밸런싱 확인을 위한 원격 접속
##centos7(DB 없는 원격접속 서버)
mysql -h 192.168.1.111 -u root -p # root 로 계정 원격 접속
>4321
#mysql -h 192.168.1.111 -u slave_db -p # slave_db 용 계정 접속 #db가 1개만 뜬다
#>'1234'
# root가 아닌 slave_db 용 계정 접속
#mysql -h 192.168.1.111 -u slave_db -p
오늘은 MariaDB 복제를 통해 Master와 Slave DB를 구성하고, DB를 실시간으로 이중화하는 방법을 배워보았습니다. 또한 DB 원격접속으로 로드벨런싱(HAProxy)하는 방법에 대해서도 알아보았습니다. Master/Slave 형식의 DB 이중화는 많이 쓰이는 방식이니 잘 알아두시면 좋을 것 같습니다. 그럼 다음에 뵙겠습니다.
'리눅스(Linux) > DB' 카테고리의 다른 글
[리눅스] MariaDB 기본 명령어 - insert, select, update, delete / create, drop (한글깨짐 방지 설정) (0) | 2024.03.15 |
---|---|
[리눅스] MariaDB - 설치, 한글설정 변경, 로그인 비번 설정, 원격접속 설정, 로드밸런스 적용 (0) | 2024.03.13 |