1. Galera Cluster 란? 

  • 오픈소스이다.
  • 동기 방식의 복제를 지원한다.
  • 노드간 통신을 위해 wsrep API를 사용한다.
  • Active-Active 방식의 다중 Master 구성 및 모든 노드에서 Read/Write가 가능하다.
  • 노드의 추가와 제거가 간단하고, 특정 노드에서 장애가 발생하면 자동으로 해당 노드가 제거된다.
  • InnoDB 만 지원한다.
  • Mysql 및 MariaDB 5.5 이상 버전에서 사용가능하다.
wsrep(Write Set REPlication) 란?
MySQL의 InnoDB 스토리지 엔진 내부에서 Write Set을 추출하고 기능을 구현합니다. 
(Write Set은 트랜잭션을 기록하는 모든 논리적 데이터 집합이다.)

노드간 Write Set을 송수신하기 위해서 별도의 복제 플러그인을 사용하며 wsrep에 정의된 call/callback 함수에 의해 동작하는 모듈입니다.

 

Galera Cluster 구성도

각 노드 마다 wsrep 모듈이 존재합니다. 이 모듈은 데이터베이스 복제를 위한 범용 모듈로 여기에 Galera Replication을 연결해주면 데이터베이스 변경이 있을 때 마다 다른 노드로 데이터를 복사합니다.


2. Galera Cluster 설치

System Information

HostName galera03 galera04 galera05
IP Address 192.168.152.143 192.168.152.144 192.168.152.145
OS CentOS 7 CentOS 7 CentOS 7
MariaDB Version MariaDB 10.4 MariaDB 10.4 MariaDB 10.4

 

MariaDB 설치

root 계정으로 MariaDB yum repo를 설치합니다.

[root@galera03 ~]# curl -sS https://downloads.mariadb.com/MariaDB/mariadb_repo_setup | bash

mariaDB 최신버전이 다운되므로 10.4버전이 아닐 수도 있습니다. 
10.4 버전을 받고 싶다면 /etc/yum.repos.d/mariadb.repo를 수정해주세요.

모든 repo에 대한 캐시 빌드

[root@galera03 ~]# yum makecache fast

MariaDB 및 Galera 설치

[root@galera03 ~]# yum install -y mariadb-server galera

3. 방화벽 설정 및 Galera Cluster 설정

Galera Cluster에서 사용하는 포트 설명

프로비저닝 포트

클러스터에서 개별 노드로 데이터를 복제하여 노드를 클러스터와 동기화하는 프로세스를 프로비저닝이라고합니다. 
Galera Cluster에는 노드를 프로비저닝하기 위해 사용할 수 있는 두 가지 방법을 제공합니다.

4444 (SST , State Snapshot Transfer)
새 노드가 클러스터에 참여하면 SST를 실행해 다른 노드와 동기화합니다.

4568 (IST , Incremental State Transfer) 
기준 노드와 비교할 때, 누락된 트랜잭션이 존재하면 동기화합니다.

나머지 포트

4567 (Galera Cluster)
각 노드의 연동 상태를 체크하고, 멀티 캐스트 복제 시, 이 포트에서 UDP 전송과 TCP를 모두 사용합니다.

3306 (Maria DB)
MariaDB 클라이언트 연결 및 상태 스냅 샷 전송

mysql 및 4567,4568,4444 포트 허용하기

[root@galera03 ~]# firewall-cmd --state  (방화벽이 실행되지 않았을 경우 systemctl start firewalld 입력)
running
[root@galera03 ~]# firewall-cmd --permanent --add-service=mysql
success
[root@galera03 ~]# firewall-cmd --permanent --add-port={4567,4568,4444}/tcp
success
[root@galera03 ~]# firewall-cmd --reload
success
[root@galera03 ~]# firewall-cmd --list-all

SELinux를 허용 모드로 설정

[root@galera03 ~]# setenforce 0
[root@galera03 ~]# sestatus

Current mode가 permissive 상태여야 합니다.

(MariaDB 클러스터에 대한 모든 작업이 끝나면 SELinux 정책을 1(강제모드)로 변경해주어야 합니다.)

Galera Cluster 설정

[root@galera03 ~]# vi /etc/my.cnf.d/server.cnf
...
[galera]
# Mandatory settings
wsrep_on=ON
wsrep_provider=/usr/lib64/galera-4/libgalera_smm.so
wsrep_cluster_address=gcomm://192.168.152.143,192.168.152.144,192.168.152.145
binlog_format=row
default_storage_engine=InnoDB
innodb_autoinc_lock_mode=2
...

위 옵션들을 [galera] 아래에 입력해주고, wsrep_cluster_address에는 모든 노드의 IP를 입력해주세요.

(주의할 점은 galera 버전마다 /usr/lib64/galera-4/libgalera_smm.so 경로가 바뀔 수 있습니다.
실제 해당 파일이 존재하는지 확인 후에 설정해주세요.)

여기까지가 galera cluster의 설치 및 설정입니다. galera03과 같이 나머지 galera04, galera05에도 똑같이 작업해줍니다.


4. galera cluster 실행

galera03에서 다음 명령어를 입력해주세요.

[root@galera03 ~]# galera_new_cluster

galera_new_cluster 명령어는 기준 DB를 설정하는 동시에 mariadb를 실행하는 명령어입니다.

(나머지 node들이 실행되면 기준 DB를 기준으로 복제를 시작합니다.)

galera04, galera05 또한 mariadb를 실행해줍니다.

[root@galera04 ~]# systemctl start mariadb.service
[root@galera05 ~]# systemctl start mariadb.service

실행이 완료되었다면 각 노드 마다 Mariadb 비밀번호를 변경해줍니다.

[root@galera03 ~]# /usr/bin/mysqladmin -u root password '변경할 비밀번호 입력'

Mariadb root 계정으로 로그인합니다.

[root@galera03 ~]# mysql -u root -p 
Enter password: 설정한 비밀번호 입력

5. galera 연동 확인

> show global status like 'wsrep_cluster_size';

노드가 모두 연동되었다면 Value에 3이 출력되야합니다.

각 노드에서 위 명령어를 입력해 연동되었는지 확인해주세요.

wsrep 정보를 보고싶다면 다음 명령어를 입력해주세요.

> show status like 'wsrep_%';

여기서 유심히 봐야할 속성은  wsrep_local_state_uuid 속성입니다. 각 노드마다 해당 속성 값이 같은지 확인해주세요.


6. DB 생성 및 테이블 생성

Galera Cluster는 모든 노드가 Read/Write를 지원하기 때문에 기준 노드가 아닌 galera04노드에서 DB생성 및 테이블 생성이 진행되어도 다른 노드에 복제가 이루어집니다.

[ galera04 Node ]

> create database test_db;

Query OK, 1 row affected (0.005 sec)
> use test_db;
Database changed
> create table test_tb ( id int primary key );
Query OK, 0 rows affected (0.021 sec)
> insert into test_tb values(1);
Query OK, 1 row affected (0.020 sec)

위 명령어 실행 후 galera03, galera05에서 각각 test_db, test_tb가 생성되었는지 확인하고 test_tb에 데이터 복제가 되었는지 확인해주세요.

galera03, galera05에서 test_tb를 조회


7. galera cluster 복구 시나리오

1) MariaDB 데몬이 모두 죽었을 경우

SELINUX 허용 설정

setenforce 0

모든 노드의 /var/lib/mysql/grastate.dat 파일을 열어서 safe_to_bootstrap 속성이 1인 값을 찾습니다. 

# vi /var/lib/mysql/grastate.dat

# GALERA saved state version: 2.1
uuid: 2e39d6a4-5df7-11ea-a29f-e38a9ebb7084
seqno: 115
safe_to_bootstrap: 1

safe_to_bootstrap 값이 1인 경우 마지막으로 죽은 노드를 의미하기 때문에 해당 기준 노드로 실행합니다.

galera_new_cluster

실행이 완료 되면 나머지 노드도 실행해줍니다.

systemctl start mariadb

여기까지 완료되었다면 모든 노드에서 MariaDB 로그인 후 연결된 노드 개수가 맞는지 확인합니다.

> show global status like 'wsrep_cluster_size';

각 노드에서 위 명령어 입력 시, 예상했던 노드 개수와 일치하지 않다면, 해당 노드는 동기화 상태가 아닐 확률이 높습니다. 이때, 사용하고 있는 DB의 테이블을 SELECT 해봅니다. 

WSREP has not yet prepared node for application use

위와 같은 오류가 발생하면 동기화 상태가 아니므로 WSREP의 pc.bootstrap 옵션을 YES로 바꾸어주어야 합니다.

> SET GLOBAL wsrep_provider_options='pc.bootstrap=YES';
Query OK, 0 rows affected (0.000 sec)

위 옵션을 적용하고 나서 MariaDB를 옵션을 적용한 노드를 재시작해주어야 합니다.
재시작 후에 test_tb가 잘 조회되는지 확인해주고
show global status like 'wsrep_cluster_size'; 명령어를 입력하여 클러스터 사이즈가 3인지 확인해줍니다.

모든 복구가 완료되면 setenforce 1 명령어를 실행해줍니다.


8. gelera Cluster Test

테스트 환경 

HostName galera03 galera04 galera05
IP Address 192.168.152.143 192.168.152.144 192.168.152.145
OS CentOS 7 CentOS 7 CentOS 7
MariaDB Version MariaDB 10.4 MariaDB 10.4 MariaDB 10.4

 

테스트 설명

Case 1
로그 데이터 10만건 삽입 테스트  

Case 2
새로운 노드 추가 및 동기화 테스트

 

Case 1 - 로그 데이터 10만건 삽입 테스트 

테스트 방법

  • Java에서 Galera Cluster로 이중화된 galera03, galera04을 JDBC를 이용해 연결한다.
  • Galera Cluster에 로그 데이터 10만 건을 삽입한다.

JDBC 연결 URL

jdbc:mariadb:loadbalance://192.168.152.143:3306,192.168.152.144:3306/test_galera

테스트 결과

  • 로그 데이터 10만건 삽입하는데 13분정도 소요되며,  galera03, galera04 동기화 속도가 매우 빠름
  • 로그 삽입 시, 각 노드에 데이터 부하 분산이 골고루 이루어짐

Case 2 - 새로운 노드 추가 및 동기화 테스트 

테스트 내용

  • 기존에 동작하던 galera cluster에 새로운 노드 galera05(192.168.152.145)를 추가해준다. 
  • 데이터 동기화 속도를 측정한다.

테스트 결과

  • 새로운 노드를 galera cluster에 추가 시 모든 데이터베이스, 테이블, 레코드가 복제되며, 이전 테스트에서 삽입한 10만건의 로그데이터가 복제되는데 약 2~5초 정도 소요된다.  

참조 : https://bcho.tistory.com/1062

https://www.centlinux.com/2019/02/install-mariadb-galera-cluster-on-centos-7.html

+ Recent posts