Rocky Linux 9 + MariaDB 10.11 Galera Cluster(3노드) 구축 및 동기화 테스트

───

1) 사전 준비

1-1. 호스트명 설정

각 서버에서 호스트명을 지정합니다.

# hostnamectl set-hostname db1 # db2, db3 각각 변경

1-2. hosts 등록

각 노드에서 /etc/hosts에 클러스터 노드 정보를 추가합니다.

# cat >> /etc/hosts <<'EOF'

192.168.0.11 db1

192.168.0.12 db2

192.168.0.13 db3

EOF

1-3. 시간 동기화 확인

장애 대응과 로그 분석 편의성을 위해 시간 동기화 상태를 확인합니다.

# timedatectl

───

2) MariaDB/Galera 설치

2-1. 공식 MariaDB 레포 등록

# cat > /etc/yum.repos.d/MariaDB.repo <<'EOF'

[mariadb]

name = MariaDB

baseurl = https://rpm.mariadb.org/10.11/rhel/9/x86_64

module_hotfixes=1

gpgkey= https://rpm.mariadb.org/RPM-GPG-KEY-MariaDB

gpgcheck=1

EOF

2-2. 메타데이터 갱신 및 패키지 설치

# dnf clean all
# dnf makecache
# dnf install -y MariaDB-server MariaDB-client galera-4 MariaDB-backup socat

───

3) SST 계정 생성

MariaDB를 시작하고 접속한 뒤 SST용 계정을 생성합니다.

# systemctl start mariadb
# mariadb

> CREATE USER 'testuser'@'localhost' IDENTIFIED BY 'p@ssw0rd!';

> GRANT RELOAD, PROCESS, LOCK TABLES, REPLICATION CLIENT ON *.* TO 'testuser'@'localhost';

> FLUSH PRIVILEGES;

> exit;

설정 전 MariaDB를 중지합니다.

# systemctl stop mariadb

───

4) Galera 설정 (/etc/my.cnf.d/galera.cnf)

4-1. db1 예시

[mysqld]

binlog_format=ROW

default_storage_engine=InnoDB

innodb_autoinc_lock_mode=2

bind-address=0.0.0.0

wsrep_on=ON

wsrep_provider=/usr/lib64/galera-4/libgalera_smm.so

wsrep_cluster_name=db_cluster_test

wsrep_cluster_address=gcomm://nodeIP_1,nodeIP_2,nodeIP_3

wsrep_node_name=db1

wsrep_node_address=nodeIP_1

wsrep_sst_method=mariabackup

wsrep_sst_auth=testuser:p@ssw0rd!

wsrep_slave_threads=4

4-2. db2 / db3 예시

[mysqld]

binlog_format=ROW

default_storage_engine=InnoDB

innodb_autoinc_lock_mode=2

bind-address=0.0.0.0

wsrep_on=ON

wsrep_provider=/usr/lib64/galera-4/libgalera_smm.so

wsrep_cluster_name=db_cluster_test

wsrep_cluster_address=gcomm://nodeIP_1,nodeIP_2,nodeIP_3

wsrep_node_name=db2 # db3는 db3로 변경

wsrep_node_address=nodeIP_2 # db3는 nodeIP_3

wsrep_sst_method=mariabackup

wsrep_sst_auth=testuser:p@ssw0rd!

wsrep_slave_threads=4

wsrep_cluster_name / wsrep_cluster_address는 3대 모두 동일해야 합니다.

───

5) 클러스터 부팅 및 상태 확인

5-1. db1에서 클러스터 최초 부팅

# galera_new_cluster

5-2. 상태 확인

# mariadb -uroot -e "SHOW STATUS LIKE 'wsrep_cluster_size';"
# mariadb -uroot -e "SHOW STATUS LIKE 'wsrep_cluster_status';"
# mariadb -uroot -e "SHOW STATUS LIKE 'wsrep_local_state_comment';"
# mariadb -uroot -e "SHOW VARIABLES LIKE 'wsrep_sst_method';"

정상 기준:

초기에는 wsrep_cluster_size = 1이어도 정상입니다(db1만 올라온 상태).

이후 db2,3을 실행할 경우 wsrep_cluster_size = 3인 것을 확인할 수 있습니다.

───

6) 동기화 테스트

6-1. db1에서 테스트 DB/테이블 생성 및 데이터 입력

> CREATE DATABASE galera_test;

> USE galera_test;

> CREATE TABLE sync_test (

id INT AUTO_INCREMENT PRIMARY KEY,

node_name VARCHAR(50) NOT NULL,

msg VARCHAR(200) NOT NULL,

created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP

) ENGINE=InnoDB;

> INSERT INTO sync_test (node_name, msg)

VALUES ('db1', 'first insert from db1');

> SELECT * FROM sync_test;

6-2. db2, db3에서 INSERT 후 조회

각 노드에서 데이터를 입력하고 전체 조회를 실행합니다.

> USE galera_test;

> INSERT INTO sync_test (node_name, msg) VALUES ('db2', 'second insert from db2');

> SELECT * FROM sync_test;

> USE galera_test;

> INSERT INTO sync_test (node_name, msg) VALUES ('db3', 'second insert from db3');

> SELECT * FROM sync_test;

6-3. 모든 노드에서 최종 검증

db1이 장애가 발생했을 때를 가정하여 해당 mariadb를 중단시키고 이후 다른 노드들의 동작이 정상적으로 이루어지는 지 확인해보겠습니다.

# systemctl stop mariadb
# systemctl status mariadb

로 db1의 mariadb를 중단시켰습니다.

db2나 db3에 SQL에 접속하여

> CREATE TABLE IF NOT EXISTS node_check (

id BIGINT AUTO_INCREMENT PRIMARY KEY,

msg VARCHAR(200),

writer_host VARCHAR(100),

writer_ip VARCHAR(100),

created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP

);

로 서버들의 ip가 나와 노드의 정보를 볼 수 있게 테이블을 생성하였습니다.

> INSERT INTO node_check (msg, writer_host, writer_ip)

VALUES ('galera write test', @@hostname, @@wsrep_node_address);

> SELECT * FROM node_check ORDER BY id DESC LIMIT 2;

을 통해 노드의 구별을 위해 ip 정보가 들어간 테이블에 내용을 삽입하여

db1에 장애가 발생하여도 db 운용에는 문제가 없는 것을 확인할 수 있습니다.

%아래 사진에 LIMIT은 입력한 열의 갯수만큼 표시할 때 사용하는 명령어 입니다.

*db1에 장애가 발생하였을 때

db1 down

* db2에 장애가 발생하였을 때

db2 down

* db3에 장애가 발생하였을 때

db3 down

3개의 노드를 번갈아가며 장애를 발생시켰으며, 해당 노드들이 장애가 발생하여도 동작 및 연동이 정상적으로 이루어지는 것을 확인했습니다.

───