Replication
Replication은 복제라는 뜻으로 하나의 메인 DB 서버의 데이터를 그대로 복제한 하나 이상의 DB서버를 구성하는 것을 의미한다.
MySQL의 Replication은 master와 slave를 구성하여 master의 데이터를 slave가 복제하는 방식으로 이루어진다.
하나의 master와 하나 이상의 slave를 두어 단방향 Replication을 구성할 수도 있고 각각의 DB 서버가 master의 역할과 slave 역할을 동시에 하는 양방향 Replication을 구성할 수도 있다.
이러한 Replication 구성은 통해서 Read/Write와 ReadOnly로 분리할 수 있어 고가용성 측면과 부하 분산 및 백업을 수행할 수 있다.
Replication의 장/단점
장점
- Read/Write는 원본 서버에서만 이루어져야 하고 복제본은 읽기만 가능한데 이러한 특성을 살려서 여러 복제본 간에 로드를 분산함으로 읽기 속도를 높일 수 있다.
- 복제본을 통해서 백업 서비스를 실행하여 데이터에 대한 보안을 강화할 수 있다.
- 복제본을 통해서 원본에 영향을 주지 않고 데이터 분석을 할 수 있다.
단점
단방향 Replication(Active - Standby)
해당 그림과 같이 master는 원본 DB 서버로 유지하고 해당 데이터를 Slave에서 복제하는 방식이다. MySQL을 사용하여 구성하는 방식은 아래와 같이 여러 과정을 거쳐야 된다.
먼저 master, slave를 구성하기 전에 mysql 서버를 다운로드하고, 초기 설정을 해준다.
master 설정하기
초기 설정이 완료되면 먼저 master로 설정할 mysql 서버의 설정 파일을 변경해준다.
mysql-server.cnf 파일을 열어서 서버 아이디와 master의 로그를 저장할 파일을 지정해 준다.
master 설정이 완료한 후 mysql을 root로 접속하고 master의 상태를 확인한다.
master의 상태에서 나중에 slave에 적용시켜야 되기 때문에 mysql-bin 파일과 Position 번호를 확인한다.
GRANT REPLICATION SLAVE ON [DB_테이블] TO '사용할_계정'@'slave로_사용할_DB서버_주소';
REPLICATION을 사용할 slave 계정을 생성하고 해당 권한을 부여한다.
권한을 부여한 후에는 해당 계정의 정보를 확인하여 Repl_slave_priv가 Y로 되어 있는지 확인한다.
위의 사진을 살펴보면 MySQL에서 제공하는 여러 가지 권한 정보가 뜨는데 그중에서 Repl_slave_priv는 slave 서버 관리 권한을 의미하므로 Y로 설정이 되어있는지 확인해야 한다.
slave 설정하기
slave도 master와 마찬가지로 mysql 설정파일을 열어서 mysql-bin을 따로 설정하지 않고 server 아이디만 추가해 준다.
slave는 ReadOnly이기 때문에 읽기만 가능하다. 따라서 따로 log를 저장할 디렉터리가 필요하지 않다.
slave로 쓸 DB서버에 접속한 후 master DB 서버에서 master 상태를 확인하고 파일과 포지션을 확인한다. (혹시나 바뀌는지 확인)
change master to
master_host='master 서버의 IP 주소',
master_user='master에서 만든 slave용 계정 이름',
master_password='master에서 만든 slave용 계정의 PW',
master_log_file='master의 로그 파일 이름',
master_log_pos=[master의 포지션 번호]
앞서 확인한 master의 bin 파일과 포지션 번호 그리고 master에서 지정한 slave 정보를 입력하여 master와 연결한다.
master와 연결을 완료한 후 slave를 시작하고 상태를 확인하여 Slave_IO_Running, Slave_SQL_Running이 Yes로 되어 있는지 확인한다.
Slave_IO_State: 슬레이브의 현재 상태
Slave_IO_Running: master 바이너리 로그를 읽기위한 I/O 스레드가 실행 중인지 여부
Slave_SQL_Running: SQL 스레드가 실행 중인지 여부
Last_IO_Error, Last_SQL_Error: I/O 및 SQL 스레드에 의해 등록된 마지막 오류를 표시
주요 slave 상태 필드를 확인하면서 해당 설정이 No로 되어 있다면 slave를 멈추고 다시 마스터와 연결해줘야 한다. 이때 master에서 설정한 slave의 정보가 맞는지 꼭 확인하고 다시 연결해야 된다.
master와 연결이 완료되면 다시 master DB로 가서 새로운 DB를 생성해 준다.
DB를 생성하고 난 후 slave DB로 넘어가서 DB를 확인하면 앞서 생성한 DB가 똑같이 들어있는 것을 확인할 수 있다.
이것으로 단방향 Replication을 구성해 보았다.
양방향 Replication
마스터와 슬레이브에서 슬레이브를 마스터로 마스터를 슬레이브로 설정하면 양방향이 된다.
먼저 slave 서버에서 mysql-server.cnf 파일에 mysql 로그를 저장할 파일을 설정해 준다.
master 상태를 확인하고 slave 계정과 REPLICATION SLAVE 권한을 부여해 준다.
master 서버에서는 change master를 통해서 새로 설정한 master 서버와 연결을 해준다.
slave를 시작하고 상태를 확인해 보면 정상적으로 연결이 완료된 것을 알 수 있다.
마지막 테스트로 마스터로 설정된 DB 서버에 새로운 testDB를 생성하고 슬레이브에서 확인해보면 해당 DB가 똑같이 생성된 것을 확인할 수 있다.
haproxy
haproxy는 하드웨어 기반의 L4/L7 스위치를 대체하기 위한 오픈소스 소프트웨어 솔루션으로 TCP 및 HTTP 기반의 애플리케이션을 위한 고가용성, 로드 밸런싱 및 프록시 기능을 제공한다.
haproxy를 통해 서버 이중화 확인하기
먼저 가상 머신을 하나 더 준비해 주고 haproxy를 설치해 준다.
설치가 완료되면 haproxy 설정파일로 들어가서 내용을 추가해줘야 한다.
haproxy.cfg는 크게 5가지로 영역이 나뉜다.
- global: 전체 영역에 걸쳐서 적용되는 설정
- defaults: global 다음에 오는 section에 적용되는 공통 설정 내역
- frontend: 클라이언트 연결에 관한 설정
- backend: frontend와 접속된 트래픽을 전달할 프록시 서버에 대한 설정과 헬스체크 등의 설정
- listen: 프론트엔드와 백엔드의 기능이 결합된 완전한 프록시를 정의
일단은 MySQL DB 서버만 사용할 것이기 때문에 frontend와 backend 설정은 지워주고 default 밑에 haproxy 설정을 추가해 준다.
listen stats # haproxy 모니터링 페이지 설정
bind :9000 # 모니터링 페이지에 접속할 포트 번호 설정
stats enable # 모니터링 페이지 기능을 활성화
stats realm Haproxy\ Statistic # 모니터링 페이지 타이틀
stats uri /haproxy_stats # 모니터링 페이지로 접속할 uri
설정한 것을 살펴보면 haproxy 모니터링 페이지에 관한 설정인 것을 알 수 있다.
설정이 완료되면 haproxy를 실행시켜 준다. 이때 항상 조심해야 할 것은 방화벽이 켜져 있는지 확인해야 한다.
실행한 후 haproxy 설정을 통해서 웹 브라우저로 접속하면 이러한 모니터링 페이지를 확인할 수 있다.
설정이 완료되면 master 서버로 돌아가서 haproxy라는 새로운 계정을 생성해 준다. 이때 계정의 주소로는 haproxy가 설치된 주소로 설정해야 한다.
다시 haproxy 서버로 넘어와서 haproxy.cfg 파일을 다시 수정해 준다.
listen mysqld-ha # 설정할 mysql 서버 이름
bind :3306 # mysql 서버의 포트 번호
mode tcp
balance roundrobin # 로드 밸런싱을 할 알고리즘 설정
option mysql-check user haproxy # 방금 생성한 haproxy라는 계정으로 mysql 서버를 체크하겠다.
server mysqld1 [DB 서버의 주소]:[포트번호] check
server mysqld2 [DB 서버의 주소]:[포트번호] check # 어떤 mysql 서버를 체크할 것인지
앞서 모니터링 페이지를 설정한 곳 밑에서 mysql-ha 설정을 해준다.
설정을 완료한 후에 haproxy를 다시 실행하여 mysql 서버가 정상적으로 모니터링 페이지에 뜨는지 확인한다.
모니터링 페이지 확인까지 마쳤으면 다시 master 서버로 넘어와 DB 서버의 부하 분산을 확인할 테스트용 계정을 생성해 준다.
생성한 테스트 계정으로 워크벤치에 접속하여 서버 아이디를 확인해 본다.
keepalived(Active - Standby)
keepalived 구성을 위해서 앞서 생성한 master서버와 slave 서버를 Active - Standby로 구성하고 진행한다.
Master(Active) 설정
먼저 keepalived를 설치해 준다.
설치가 완료된 후 global_defs 설정에서 vrrp_strict를 주석처리 해준다.
그 후 mysql를 주기적으로 체크하는 설정과 가상 IP 주소 설정을 추가해 준다.
설정을 완료한 후 다시 keepalived를 실행시켜 준다.
실행되고 난 후에 ip addr을 실행하여 가상 IP 주소가 제대로 설정되었는지 확인한다.
마지막으로 워크벤치로 접속하여 서버 아이디를 확인해 본다.
Slave(stanby) 설정
master와 마찬가지로 keepalived를 설치해 준다.
설치가 완료되면 keepalived 설정파일로 들어가 mysql 체크 설정과 가상 IP 주소 설정을 추가해 준다.
설정이 완료된 후 다시 keepalived를 실행시켜 준다.
master 서버로 접속하여 실행 중인 mysql 서버를 중단해 본다.
중단하고 난 후 slave 서버의 IP 주소를 확인해 보면 master 서버에서 설정한 가상의 IP 주소가 slave에 적용된 것을 확인할 수 있다.
마찬가지로 워크벤치에 접속하여 서버 아이디를 확인해보면 slave의 서버 아이디가 출력되는 것을 확인할 수 있다.
'DB' 카테고리의 다른 글
MySQL - 클러스터 (1) | 2023.11.26 |
---|---|
Redis - Redis 기초 (0) | 2023.11.18 |
데이터베이스 - DB 이중화 (0) | 2023.11.12 |
MySQL - View & Index (0) | 2023.11.11 |
데이터베이스 - 인덱스 (0) | 2023.11.10 |