[MariaDB] Galera Cluster 설치하기
1. Galera Cluster란?
1.1 Galera Cluster 개념
Galera Cluster는 다음 그림과 같이 동기 방식의 복제구조를 사용하는 멀티마스터 RDB 클러스터이다.

1.2 Galera Cluster 장점
- 다중 마스터를 지원하므로 Active-Active 구성이 가능하다.
- 동기 복제로 지연이 없으며 데이터 손실이 없다.
- 모든 노드가 동일한 상태를 유지하기 때문에 노드간 분기 된 데이터를 구성할 수 없다.
- 장애 조치(Failover)가 없기 때문에 서비스에 연속성을 유지할 수 있다.
- 모든 노드가 읽기/쓰기가 가능하기 때문에 분할하여 사용할 필요가 없다.
- 자동 노드 프로비저닝이 가능하다.
- 모든 서버 노드에 동일한 데이터를 유지해야하므로 저장공간이 낭비된다.
1.3 Galera Cluster 단점
- 동기적 복제이다 보니 클러스터의 성능은 클러스터에서 가장 낮은 성능 노드에 의해 결정된다.
- innodb 스토리지 엔진 테이블만을 지원한다.
- 신규 노드 추가 시 데이터를 복사해야 한다.
2. 주의사항
2.1 Galera에서 사용되는 Network Port 4가지
Galera에서 사용되는 Network Port 4가지가 있다. 포트 충돌 나지 않도록 주의해야한다.
- Standard MariaDB Port(default : 3306) : MariaDB 기본 포트, State Snapshot Transfers(mysqldump)
- Galera Peplication Port(default : 4567) : Galera Cluster replication traffic, UDP & TCP
- IST Port(default : 4568) : Incremental State Transfers(증분)
- SST Port(default : 4444) : 3306 외의 모든 State Snapshot Transfers
2.2 Galera 버전
- MariaDB 10.4 이상 에서 MariaDB Galera Cluster는 Galera 4를 사용한다.
- MariaDB 10.3 및 이전 버전 에서 MariaDB Galera Cluster는 Galera 3을 사용한다.
2.3 노드 개수
Galera Cluster는 3개의 노드로 Clustering 하는 것을 권장한다. 노드가 2개일 경우, Split brain 현상이 발생할 수 있기 때문이다.
Split brain 이란, 각 node들이 단절되어 자기자신을 Primary라고 인식하는 현상이다.
이러한 현상이 발생하면, 이중가동이 되어 동기화 및 복제가 비정상적으로 발생하거나 데드락이 걸릴 수 있다.
3개가 권장되는 이유는 과반수로 우선순위에 대한 결정을 할 수 있기 때문이다.
3. 설치방법
다음과 같은 버전으로 진행하였으며, node는 2개로 구성하여 테스트를 진행하였다. node가 3개여도 동일한 방식으로 진행하면 된다.
- OS : CentOS-7
- DB : MariaDB 10.3
3.1 centos:7 컨테이너 생성하기
각 서버에 다음과 같이 4개의 포트를 설정해 컨테이너를 생성한다.
docker run -d -p 3306:3306 -p 4567:4567 -p 4568:4568 -p 4444:4444 --privileged --restart=always -v /home/MariaDB:/var/lib/mysql --name mariadb-galera centos:7 /sbin/init
💡[참고] --privileged 를 추가하면 시스템 주요 자원에 접근할 수 있는 권한을 부여할 수 있다.
- privileged 모드로 실행하면, 시스템의 모든 장치에 접근할 수 있으며, 커널의 기능 대부분을 사용할 수 있다.
- 도커는 기본적으로 Unprivileged 모드로 실행된다.
- Unprivileged 모드는 시스템 주요 자원에 접근할 수 있는 권한 부족으로 시스템 자원에 접근할 수 없다.
- 예를들어, 네트워크 인터페이스의 활성화/비활성화나 IP 주소 변경 등이 불가능하다.
3.2 컨테이너 내부 접속하기
docker exec -it mariadb-galera /bin/bash
3.3 Mariadb 설치 및 버전 확인
- 필요한 MariaDB 버전을 잘 확인하고 설치하자.
- MariaDB 공식 사이트에서 설치하는 방법을 확인할 수 있다. 필요한 파일 정보를 확인하고 Repository를 생성하면 된다.
- MariaDB Site : https://mariadb.org/
- MariaDB Repositories Download : https://downloads.mariadb.org/mariadb/repositories/#mirror=iweb
# Repository를 생성
# /etc/yum.repo.d/MariaDB.repo 또는 /etc/yum.repos.d/MariaDB.repo 존재하는 폴더명을 확인하면서 생성하기
[root@galera-01 ~]# vi /etc/yum.repo.d/MariaDB.repo
# MariaDB.repo 정보
# http://downloads.mariadb.org/mariadb/repositories/
[mariadb]
name = MariaDB
baseurl = http://yum.mariadb.org/10.3/centos7-amd64/
gpgkey = https://yum.mariadb.org/RPM-GPG-KEY-MariaDB
gpgcheck=1
# Install MariaDB
[root@galera-01 ~]# yum install MariaDB-server MariaDB-client
# MariaDB version 확인
[root@galera-01 ~]# mysql --version
이 과정에서 에러가 발생할 경우 아래 내용을 참고하면 된다.
💡에러 해결하기
➡️ E212: Can't open file for writing 에러 해결 하기
- sudo vi /etc/yum.repo.d/MariaDB.repo 또는 sudo vi /etc/yum.repos.d/MariaDB.repo
- 참고: https://iamrealizer.tistory.com/47
➡️ sudo: command not found
- yum install sudo -y
➡️ 404 error
3.4 MariaDB root 계정 Setup
- MariaDB를 시작하고 root계정을 설정한다.
- 설정 완료 후, DB를 stop 한다.
[root@galera-01 ~]# service mysql start
Starting mysql (via systemctl): [ OK ]
[root@galera-01 ~]# mysql_secure_installation
# Setting
Enter current password for root (enter for none):
OK, successfully used password, moving on...
Set root password? [Y/n] y
New password:
Re-enter new password:
Password updated successfully!
Reloading privilege tables..
... Success!
Remove anonymous users? [Y/n] y
... Success!
Disallow root login remotely? [Y/n] n
... skipping.
Remove test database and access to it? [Y/n] y
- Dropping test database...
... Success!
- Removing privileges on test database...
... Success!
Reload privilege tables now? [Y/n] y
... Success!
[root@galera-01 ~]# service mysql stop
💡에러 해결하기
➡️ bash: service: command not found
- yum -y install initscripts
3.5 Galera Cluster 설정하기
- 여기에서는 두개의 노드를 생성하는데 Node1과 Node2에 대해 각각 /etc/my.cnf.d/server.cnf 내부에 [galera]에 대해 설정해주어야한다.
- 구성하는 Node의 구성에 따라 설정하는데 차이가 있다. 필요에 따라 설정하면 된다.
- Node1 설정
# Config node1(Server One) galera clutser [root@galera-01 ~]# vi /etc/my.cnf.d/server.cnf [galera] # Mandatory settings wsrep_on=ON wsrep_provider=/usr/lib64/galera/libgalera_smm.so # 초기설치 시 기본경로 wsrep_cluster_address='gcomm://' # Galera 초기설정 시 미입력 wsrep_cluster_name='cluster' # Node1/2 동일하게 wsrep_node_address='XXX.XXX.XXX.123' # Node1(Server One) IP wsrep_node_name='galera01' # Node1 Name wsrep_sst_method=rsync binlog_format=row default_storage_engine=InnoDB innodb_autoinc_lock_mode=2 bind-address=0.0.0.0 - Node2 설정
# Config node2(Server Two) galera clutser [root@galera-02 ~]# vi /etc/my.cnf.d/server.cnf [galera] # Mandatory settings wsrep_on=ON wsrep_provider=/usr/lib64/galera/libgalera_smm.so # 초기설치 시 기본경로 wsrep_cluster_address='gcomm://XXX.XXX.XXX.123' # Galera Clustering IP(node1) wsrep_cluster_name='cluster' # Node1/2 동일하게 wsrep_node_address='XXX.XXX.XXX.456' # Node2(Server One) IP wsrep_node_name='galera02' # Node2 Name wsrep_sst_method=rsync binlog_format=row default_storage_engine=InnoDB innodb_autoinc_lock_mode=2 bind-address=0.0.0.0
💡[참고] utf8 설정 (/etc/my.cnf 파일)
- 설치한 모든 컨테이너에 설정 세팅. (참고: https://koonsland.tistory.com/73)
- [client] default-character-set=utf8 [mysql] default-character-set=utf8 [mysqldump] default-character-set=utf8 [mysqld] collation-server=utf8_unicode_ci init-connect='SET NAMES utf8' character-set-server=utf8
3.6 Galera Clustering 작업 : 초기화 및 상태확인
- node1과 node2의 초기화 방법이 다르다.
- node1은 service mysql start --wsrep-new-cluster 를 사용하지만, 다른 노드들은 service mysql start를 사용하면 된다.
# Node 1 Galera Cluster 초기화
# Galera Cluster 초기화
[root@galera-01 ~]# service mysql start --wsrep-new-cluster
Starting mysql (via systemctl): [ OK ]
# node1(Server One) 상태 확인
[root@galera-01 ~]# ps -ef | grep mysql
mysql 14773 14619 0 13:30 ? 00:00:00 /usr/sbin/mysqld
--basedir=/usr
--datadir=/var/lib/mysql
--plugin-dir=/usr/lib64/mysql/plugin
--user=mysql
--wsrep_on=ON
--wsrep_provider=/usr/lib64/galera/libgalera_smm.so
--log-error=/var/lib/mysql/galera-01.err
--pid-file=/var/lib/mysql/galera-01.pid
--wsrep_start_position=a4fe716e-a609-11ea-95ab-fa16ac4cfe80:0
# Node 2 Galera Cluster 추가
# Galera Cluster 초기화
[root@galera-02 ~]# service mysql start
Starting mysql (via systemctl): [ OK ]
# node2(Server Two) 상태 확인
[root@galera-02 ~]# ps -ef | grep mysql
mysql 16041 15887 0 13:46 ? 00:00:00 /usr/sbin/mysqld
--basedir=/usr
--datadir=/var/lib/mysql
--plugin-dir=/usr/lib64/mysql/plugin
--user=mysql
--wsrep_on=ON
--wsrep_provider=/usr/lib64/galera/libgalera_smm.so
--log-error=/var/lib/mysql/galera-02.err
--pid-file=/var/lib/mysql/galera-02.pid
--wsrep_start_position=00000000-0000-0000-0000-000000000000:-1
💡[참고] time-zone 설정
$ mysql_tzinfo_to_sql /usr/share/zoneinfo | mysql -u root -p mysql $ mysql_tzinfo_to_sql /usr/share/zoneinfo/Asia/Seoul KST mysql -u root -p select @@global.time_zone, @@session.time_zone; set global time_zone='Asia/Seoul'; set time_zone='Asia/Seoul';
- 영구 설정을 위해 /etc/my.cnf 파일 [mysqld]에 default-time-zone=Asia/Seoul 추가
- 설치한 모든 컨테이너에 설정 세팅
- 참고 https://hodubab.tistory.com/312
[client] default-character-set=utf8 [mysql] default-character-set=utf8 [mysqldump] default-character-set=utf8 [mysqld] collation-server=utf8_unicode_ci init-connect='SET NAMES utf8' character-set-server=utf8 default-time-zone=Asia/Seoul
3.7 Clustering 상태 확인
[root@galera-01 ~]# mysql -u root -p
Enter password:
MariaDB [(none)]> show status like 'wsrep%';
- wsrep_incoming_addresses에 클러스터링 설정한 노드들이 출력되어야한다.
3.8 DB 생성하고 데이터 sync 확인하기
# galera01
MariaDB [(none)]> show databases;
MariaDB [(none)]> create database test-db;
MariaDB [(none)]> show databases;
# galera02에서 확인
➡️ Host 'IP' is not allowed to connect to this MariaDB server
DB 접속 후 현재 설정 확인.
- select Host,User,plugin,authentication_string FROM mysql.user;
- 모든 IP 허용
- GRANT ALL PRIVILEGES ON . TO 'root'@'%' IDENTIFIED BY '패스워드';
- https://java119.tistory.com/61
3.9 완료 후, node1 설정 변경하기
- node1에도 wsrep_cluster_address='gcomm://'의 값을 추가해주어야함.
- 아무것도 없으면 재시작할때 에러 발생.
# Config node1(Server One) galera clutser
[root@galera-01 ~]# vi /etc/my.cnf.d/server.cnf
[galera]
# Mandatory settings
wsrep_on=ON
wsrep_provider=/usr/lib64/galera/libgalera_smm.so
wsrep_cluster_address='gcomm://XXX.XXX.XXX.456' # Galera Cluster IP 추가
wsrep_cluster_name='cluster'
wsrep_node_address='XXX.XXX.XXX.123'
wsrep_node_name='galera01'
wsrep_sst_method=rsync
binlog_format=row
default_storage_engine=InnoDB
innodb_autoinc_lock_mode=2
bind-address=0.0.0.0
3.10 DB에 데이터 넣기
- DB 두개 stop 하고 하나에 넣은 후, 다시 start하면 두개의 DB의 데이터가 동기화 된 것을 확인할 수 있다.
💡참고자료
What is MariaDB Galera Cluster?
MySQL/MariaDB Galera Cluster 구성하기 - Part 1
MySQL/MariaDB Galera Cluster 구성하기 - Part 2
MySQL/MariaDB Galera Cluster 구성하기 - Part 3
Galera Cluster 재기동 에러 해결 방안
MariaDB galera cluster yum install 설치 centos
galeracluster재기동에러해결_방안 [AllThatLinux!]