-
서버 이중화(6) - Clustering 클러스터링 / Galera환경 구축 2024. 5. 29. 01:03
그동안 서버 이중화 포스팅에서는 DB 서버가 두개였고, Master-Slave 방식으로 데이터를 동기화시켰다.
하지만 DB서버가 세개 이상이라면 Master-Slave 구조를 어떻게 구성해야할까?
DB서버를 한개 더 추가한다면, Slave 설정 후 이전에 했던 방법으로 Master와 양방향 연결시켜주면 된다.
하지만 이런 방법은 비효율적이고 데이터 동기화 속도가 느려질 수 있다.
DB를 동기화시키는 다른 방법으로 Clustering 방식이 있다. 이번 포스팅에서는 갈레라 클러스터를 이용해 클러스터링구성을 해볼 것이다.
Clustering 란?
클러스터링은 여러 데이터베이스 노드를 하나의 그룹(클러스터)으로 묶어 작업을 분산 처리하는 기술이다. 데이터베이스 클러스터링은 주로 데이터베이스의 확장성, 고가용성, 부하 분산 등을 위해 사용된다.
💡노드 Node ? 클러스터를 구성하는 개별 서버.
Galera Cluster 란?
클러스터링을 구성하는 방법은 여러가지인데, 갈레라 클러스터는 클러스터링을 구성하는 하나의 방법이다.
윈도우에서 exe파일이 있을 때 공통 기능을 dll파일에 만들어놓고 가져가 사용한다. 이와 비슷하게 리눅스도 so라는 파일에 공통 기능을 저장해서 사용한다.
갈레라는 so파일을 제공해주는 프로그램이다.
갈레라 클러스터링 구조 갈레라 클러스터를 사용하면 다음과 같은 장점이 있다.
- 동기식 복제(Synchronous Replication):
- 데이터 변경 사항이 있을 경우, 모든 노드에 반영된 후 트랜젝션이 커밋되기 때문에 데이터 일관성이 보장된다.
- Master-Slave 방식에서는 Master 에서 발생한 데이터 변경 사항이 Slave로 비동기적으로 복제된다. 따라서 데이터 변경 사항이 적용되는 과정에서 씽크차이가 생길 수 있다. 이는 데이터 일관성을 떨어뜨리게 된다.
- 다중 마스터 구성(Multi-Master Configuration):
- 모든 노드가 읽기와 쓰기 작업을 처리할 수 있다. 이는 단일 마스터에 대한 의존성을 없애고, 쓰기 작업의 병목을 줄여준다.
- Master-Slave 방식에서는 Master만이 쓰기가 가능하고 Slave는 읽기만 가능하다.
- 확장성(Scalability):
- 노드를 추가함으로써 쉽게 클러스터를 확장할 수 있다.
💡 Galera Cluster vs Master-Slave
<Master-Slave 구조>
장점:
- 단순한 구성: 설정 및 관리가 상대적으로 간단하다.
- 읽기 성능 향상: 읽기 요청을 슬레이브 노드로 분산시켜 읽기 성능을 향상시킬 수 있다.
- 마스터 장애 대응: 마스터 노드에 장애가 발생하면 슬레이브 노드를 승격하여 빠르게 대체할 수 있습니다.
단점:
- 데이터 일관성 문제: 비동기 복제 특성상 복제 지연이 발생할 수 있어 데이터 일관성이 보장되지 않을 수 있다.
- 쓰기 성능 제한: 모든 쓰기 작업이 단일 마스터에서 처리되므로 마스터의 성능에 의해 전체 쓰기 성능이 제한된다.
- 복잡한 장애 복구: 마스터 장애 시 수동으로 슬레이브를 승격하는 과정이 필요할 수 있으며, 이는 운영 복잡성을 증가시킨다.
<Galera 클러스터>
장점:
- 데이터 일관성 보장: 동기식 복제를 통해 데이터 일관성을 제공한다.
- 쓰기 성능 향상: 다중 마스터 구성을 통해 쓰기 병목을 줄이고 쓰기 성능을 향상시킬 수 있습니다.
- 자동 노드 조인: 새로운 노드를 쉽게 클러스터에 추가할 수 있어 확장성이 뛰어난다.
단점:
- 복잡한 설정: 초기 설정 및 관리가 상대적으로 복잡할 수 있다.
- 성능 오버헤드: 동기식 복제의 특성상 네트워크 지연이나 복제 과정에서 성능 오버헤드가 발생할 수 있다.
- 네트워크 요구사항: 노드 간 동기화를 위해 안정적이고 빠른 네트워크 연결이 필요gk다.Galera Cluster에서 DB서버가 데이터를 동기식으로 복제하는 과정
- 클라이언트가 Galera 클러스터의 특정 노드(노드 A)에 트랜잭션을 시작한다.
- 클라이언트가 트랜잭션을 커밋하면, 노드 A는 해당 트랜잭션을 다른 노드에 동기화하기 위한 준비를 한다.
- 노드 A는 트랜잭션의 변경 내용을 다른 모든 노드에 멀티캐스트 메시지로 전송한다.
- 다른 노드(B, C 등)는 노드 A로부터 받은 트랜잭션 메시지를 인증하고, 트랜잭션을 적용할 준비를 한다.
- 각 노드는 이 단계에서 트랜잭션을 잠시 보류 상태로 유지한다.
- 모든 노드(B, C 등)는 트랜잭션을 적용할 준비가 완료되면 노드 A에 준비 완료 메시지를 보낸다.
- 노드 A는 모든 노드로부터 준비 완료 메시지를 받으면 트랜잭션을 커밋한다.
- 노드 A는 트랜잭션 커밋을 다른 노드(B, C 등)에 알린다.
- 모든 노드(B, C 등)는 트랜잭션을 최종적으로 적용하고, 클라이언트에게 트랜잭션 커밋이 완료되었음을 알린다
실습 - Galera Cluster로 Clustering구성하기
1. 준비
1) DB 서버 세대 준비 (MariaDB)
2) Galera 프로그램 및 추가 프로그램 설치
// 갈레라 프로그램 설치 yum install -y galera //rsync 설치 : 노드 간 데이터베이스 상태를 동기화하는 역할 yum install -y rsync //그 외 부가 프로그램 설치 (있으면 좋은 프로그램 - 여기서는 설명 x) yum install -y nmap lsof perl-DBI nc💡 rsync ?
Galera 클러스터에서 사용하는 SST(State Snapshot Transfer)는 새로운 노드가 클러스터에 참여하거나 기존 노드가 데이터 동기화가 필요할 때 전체 데이터베이스 스냅샷을 전송하는 과정이다.
rsync는 이러한 SST 방법 중 하나로 사용된다.
SST가 필요할 때
- 새로운 노드가 클러스터에 처음 합류할 때: 새로운 노드가 클러스터에 추가될 때 새로운 노드는 클러스터의 다른 노드로부터 데이터베이스 스냅샷을 받아 동기화된다.
- 노드가 오프라인 상태에서 다시 온라인 상태로 돌아올 때
- 클러스터 내 데이터 불일치가 발생할 때: 노드가 클러스터에서 일시적으로 분리됐었거나, 데이터가 손상되는 등 특정 노드가 다른 노드와의 데이터 일관성을 유지하지 못하는 상황에서 SST를 통해 데이터베이스를 다시 동기화한다.2. 3대의 DB서버에서 mariadb 파일 설정
vi /etc/my.cnf.d/mariadb-server.cnf [galera] //여기 밑에 아래의 내용을 추가 wsrep_on=ON // 주석 표시인 '#'을 지워서 옵션 실행 wsrep_provider=/usr/lib64/galera/libgalera_smm.so # 갈레라가 제공하는 so파일의 경로 설정 wsrep_cluster_address='gcomm://10.10.10.10,10.10.10.20,10.10.10.30' # 연결할 3대의 DB서버 IP주소 binlog_format=row default_storage_engine=InnoDB innodb_autoinc_lock_mode=2 wsrep_cluster_name='maria_cluster' # 클러스터의 이름, 3대 통일 wsrep_node_address='10.10.10.20' # 현재 컴퓨터의 IP wsrep_node_name='DB2' # 노드 이름, 노드마다 달라야함. wsrep_sst_method=rsync # sst할 때 rsync방식으로 하겠다 라는 뜻3. 대표 DB서버 설정
처음 클러스터를 구성하기 위해서는 대표 DB서버가 필요하다.
yum install -y mariadb-galera-server # 아래 명령어를 입력하기 위해 설치하는 파일 galera_new_cluster # 클러스터링 시작4. 나머지 두대 DB서버에서 mariadb 실행
systemctl restart mariadb5. 설정 확인
# mysql -> db클라이언트 프로그램 실행 # !!첫번째 db서버에서는 start mariadb에서 mysql을 실행하는게 아니라 galera_new_cluster에서 mysql실행 show status like 'wsrep%';연결이 잘 됐으면, wrep_cluster_status의 상태가 Disconnected가 아니라 Primary로 바뀌어있을 것이다!

이 과정까지 마치면 클러스터 구성이 잘 된것이다.
DB 서버가 정말 잘 연결된것인지 다시 확인하고싶으면, 하나의 DB서버에서 database 생성하고, 해당 database가 나머지 DB에도 잘 생성됐는지 확인해보면 된다.
'환경 구축' 카테고리의 다른 글
k8s에 Logstash 환경 구축하기 (1) 2024.10.28 k8s에 Elasticsearch 환경 구축하기 (1) 2024.10.14 서버 이중화(5) - DB 서버에 HAproxy 연결하기 (2) 2024.05.28 서버 이중화(4) - DB서버로 핫사이트 실습해보기 / Keepalived / Virtual IP (3) 2024.05.16 서버 이중화(3) - 핫 사이트란? / master<->slave 데이터 동기화 (0) 2024.05.14 - 동기식 복제(Synchronous Replication):