DB

[MariaDB] Galera Cluster 설치하기

kittity 2024. 7. 28. 22:11

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 설치 및 버전 확인

# 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: 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;

 

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!]

728x90