MariaDB Galera Cluster 구축(Rocky Linux 9)
Rocky Linux 9 + MariaDB 10.11 Galera Cluster(3노드) 구축 및 동기화 테스트───1) 사전 준비1-1. 호스트명 설정각 서버에서 호스트명을 지정합니다.# hostnamectl set-hostname db1 # db2, db3 각각 변경1-2. hosts 등록각 노드에서 /etc/hosts에 클러
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_cluster5-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개의 노드를 번갈아가며 장애를 발생시켰으며, 해당 노드들이 장애가 발생하여도 동작 및 연동이 정상적으로 이루어지는 것을 확인했습니다.
───