본문 바로가기
한화시스템 Beyond SW Camp/기반기술

[리눅스] DB 분산 (클러스터 방식)

by taeh00n 2024. 12. 4.

 ※ 이 글에서 다룬 기반기술, 프론트엔드, 백엔드, 데브옵스 등 풀스택 개발 지식은 모두 한화시스템 Beyond SW Camp 12기에서 배운 내용을 복습한 것입니다.

https://taeh00n.tistory.com/entry/Database-DB-%EB%B6%84%EC%82%B0-DRP-HAProxy-mariaDB-Master-Slave-%EB%B0%A9%EC%8B%9D

 

[리눅스] DB 분산 (DRP, HAProxy, mariaDB, Master-Slave(Mirror Site) 방식)

※ 이 글에서 다룬 기반기술, 프론트엔드, 백엔드, 데브옵스 등 풀스택 개발 지식은 모두 한화시스템 Beyond SW Camp 12기에서 배운 내용을 복습한 것입니다. 재난 복구 계획 (DRP : Disaster Recovery Plan)

taeh00n.tistory.com

 

https://taeh00n.tistory.com/entry/Database-DB-%EB%B6%84%EC%82%B0-Master-SlaveHot-Site-%EB%B0%A9%EC%8B%9D

 

[리눅스] DB 분산 (Master-Slave(Hot Site) 방식)

※ 이 글에서 다룬 기반기술, 프론트엔드, 백엔드, 데브옵스 등 풀스택 개발 지식은 모두 한화시스템 Beyond SW Camp 12기에서 배운 내용을 복습한 것입니다. https://taeh00n.tistory.com/entry/Database-DB-%EB%B6

taeh00n.tistory.com

위의 두 가지 방법으로 Active-Active, Active-Standby 상태 DB를 구성할 수 있었다.

지금까지는 두개의 DB 서버로 DB 서버를 구성했는데 DB서버가 3개일때는 어떻게 구성해야할까?

지금까지 배운 방식인 Master-Slave 방식으로 3번째 DB서버까지 추가하면 SPOF(Single Point of Failure)이 발생할 수 도 있다.

SPOF(Single Point of Failure) : 서버 하나가 동작하지 않으면 전체가 마비되는 것

 

이러한 문제를 해결하기 위한 방법은 클러스터링을 사용한 DB 구성이다.

여러 DB서버가 서로 하나처럼 연결돼서 하나의 시스템처럼 동작하는 것이다. 각 서버는 데이터를 동기화하고 하나의 서버가 고장나도 다른 서버가 동작을 하며 부하 분산을 통해 성능도 최적화 할 수 있다.

 


 

3개의 서버 모두 mariaDB가 다운되어있고 바인드 주소 설정, DB 서버 초기화까지 된 상태에서 시작하도록 하겠다.

https://taeh00n.tistory.com/entry/%EB%A6%AC%EB%88%85%EC%8A%A4-mariaDB-DB%EC%8B%A4%EC%8A%B5-Mysql-Workbench%EB%A1%9C-%EC%9B%90%EA%B2%A9-%EC%A0%91%EC%86%8D

 

[리눅스] mariaDB - DB실습 (Mysql Workbench로 원격 접속)

※ 이 글에서 다룬 기반기술, 프론트엔드, 백엔드, 데브옵스 등 풀스택 개발 지식은 모두 한화시스템 Beyond SW Camp 12기에서 배운 내용을 복습한 것입니다. https://taeh00n.tistory.com/entry/%EB%A6%AC%EB%88%85

taeh00n.tistory.com

#DB 설치
apt update
apt install -y mariadb-server

#vi /etc/mysql/mariadb.conf.d/50-server.cnfmariadb 파일에서 바인드 주소 설정
bind-address            = 0.0.0.0

# mariadb 실행
systemctl restart mariadb

# mariadb 실행 확인
systemctl status mariadb
	apt install -y net-tools
	netstat -anlp | grep :3306	
    
#DB 서버 초기화
mysql_secure_installation

3개의 DB서버가 위의 과정이 모두 끝났다는 가정하에 시작한다.

혹시 이미 사용하던 DB 서버를 가져와 Master-Slave 관계에 있는 DB가 있다면 Master-Slave 설정을 끊어주도록 한다.

 

1. 서버 중지

systemctl stop mariadb

우선 3개의 DB 서버 모두 mariaDB를 종료시킨다.

 

2. 설정 (DB 서버 3대 중 1대 먼저 설정 시작)

3개의 DB 서버가 모두 mariaDB가 종료되었다면 그 중 한 대의 서버만 설정을 시작하겠다.

vi /etc/mysql/mariadb.conf.d/50-server.cnf

DB 설정 파일에 들어가 맨 마지막줄에 설정 구문을 추가하겠다.

[galera]
wsrep_on=ON
wsrep_provider=/usr/lib/galera/libgalera_smm.so
wsrep_cluster_address="gcomm://"
binlog_format=row
default_storage_engine=InnoDB
innodb_autoinc_lock_mode=2
bind-address=0.0.0.0
wsrep_cluster_name="MariaDB_Cluster"	# 3대의 컴퓨터를 묶었을 때 내가 지어줄 이름
wsrep_node_address="[현재 서버의 IP주소]"
systemctl restart mariadb

모든 설정을 마친 후 1대의 서버만 먼저 mariaDB를 실행시킨다.

3. 클러스터 초기화  

galera_new_cluster

첫 번째 노드를 초기화하고 클러스터의 시작을 알리는 명령어이다.

 

4. 나머지 서버 설정

위의 서버의 설정이 모두 끝난 후 나머지 2개의 서버의 설정을 진행한다.

vi /etc/mysql/mariadb.conf.d/50-server.cnf

서버의 설정 파일로 들어간다.

[galera]
wsrep_on=ON
wsrep_provider=/usr/lib/galera/libgalera_smm.so
wsrep_cluster_address="gcomm://[첫 번째 서버 IP],[두 번째 서버 IP],[세 번째 서버 IP]"
binlog_format=row
default_storage_engine=InnoDB
innodb_autoinc_lock_mode=2
bind-address=0.0.0.0
wsrep_cluster_name="MariaDB_Cluster"	# 3대의 컴퓨터를 묶었을 때 내가 지어줄 이름
wsrep_node_address="[현재 서버의 IP]"

나머지 두 개 서버의 설정 파일이다. gcom:// 뒤에는 똑같을 것이고 현재 서버의 IP주소는 다르게 적어줘야한다.

5. mariaDB 시작

systemctl restart mariadb

세 개의 서버의 설정이 끝났으면 mariaDB를 실행시켜준다.

 

6. 제일 처음에 설정했던 파일 수정

vi /etc/mysql/mariadb.conf.d/50-server.cnf

제일 처음에 설정했던 DB 서버의 설정 파일로 들어간다.

wsrep_cluster_address="gcomm://[첫 번째 서버 IP],[두 번째 서버 IP],[세 번째 서버 IP]"

비워놨던 부분을 다시 이렇게 설정해준다.

이 부분을 설정안하니 DB가 동기화 되었는지 확인하는 부분에서 첫 번째 DB를 장애를 발생시키고 다시 mariaDB를 시작하려니 오류코드를 포함하고 있다고 나왔었다.

 

mariadb -u root -p
# 전체 클러스터 상태를 확인
show status like 'wsrep_cluster_status';
# Primary가 표시되면 정상
	
    
# 현재 연결된 노드 수를 확인
show status like 'wsrep_cluster_size';

# 각 노드의 상태를 확인
show status like 'wsrep_local_state_comment';
# Synced가 나오면 동기화 완료

이렇게 되면 클러스터링을 이용해 3개의 DB 서버가 구축이 되었고 3개의 서버 모두 동기화가 되었다.

 

동기화가 된 DB 서버는 항상 같은 상태를 유지하며 어느 한 DB 서버가 꺼져있는 상태에서 다른 DB에서 쓰기, 삭제 작업이 되어도 다시 꺼진 DB가 켜졌을 때 다른 DB와 같은 상태를 유지한다..