콘텐츠로 건너뛰기

데비안, 우분투에서 MariaDB Galera 고가용성(HA) 클러스터 구성하기

  • by

이 포스트에서는 데비안이나 우분투에서 Galera를 이용하여 MariaDB 고가용성(HA) 클러스터 구성 방법을 다룹니다.

전제 조건

Galera 클러스터는 데비안 또는 우분투를 실행하고, 고정 IP 주소가 있는 서버 또는 가상 머신이 최소 3대 이상 필요합니다. Galera 클러스터에서 3개 이상의 노드를 사용할 수 있지만 클러스터 쿼럼을 충족하려면 총 노드 수가 항상 홀수여야 합니다.

튜토리얼 예시

이 튜토리얼에서는 다음 이름과 IP 주소를 가진 Debian 11 가상머신 세 개가 있습니다.

• cluster-test-01 / 192.168.0.140

• cluster-test-02 / 192.168.0.145

• cluster-test-03 / 192.168.0.150

1. 패키지 설치

가장 먼저 해야 할 일은 각 서버의 패키지가 업데이트되었는지 확인합니다.

sudo apt update && sudo apt upgrade -y && sudo apt autoremove -y

다음으로 모든 서버 노드에 필요한 패키지를 설치합니다.

sudo apt install mariadb-server ufw ntp -y

ufw와 ntp (네트워크 타임 프로토콜) 패키지가 반드시 필요한 것은 아니지만 클러스터에서는 정확한 시간 유지가 필수적이므로 ntp 패키지를 설치하는 것을 권장하며, 보안을 위해 ufw를 설치하는 것을 권장합니다.

2. MariaDB 보안 설정

각 서버 노드에서 아래의 명령어를 실행해서 보안 설치 마법사를 실행합니다.

sudo mysql_secure_installation

root 사용자의 비밀번호는 존재하지 않으므로 엔터를 누릅니다.

(만약 ERROR 2002 (HY000): Can’t connect to local server through socket ‘/run/mysqld/mysqld.sock’ (2) 에러가 발생하면 sudo systemctl enable mariadb, sudo systemctl start mariadb 명령을 입력합니다.)

unix_socket 인증 방식은 Linux 사용자 계정의 인증 메커니즘을 활용하기 때문에 Linux에서 제공하는 강력한 인증 방식을 MariaDB에서도 활용할 수 있습니다. MariaDB root 사용자의 비밀번호를 따로 지정하려면 n을 입력합니다.

y를 입력하여 root 사용자의 비밀번호를 변경합니다.

보안을 위해 익명 사용자를 제거합니다.

root 사용자를 원격으로 로그인할 수 있으면 보안에 취약하므로 y를 입력합니다.

y를 입력하여 test 데이터베이스를 제거합니다.

y를 입력하여 지금까지의 변경 사항을 모두 적용합니다.

MariaDB 보안 설정이 완료되었습니다.

3. MariaDB 바인드 주소

MariaDB가 다른 시스템의 연결을 허용하려면 bind-address를 수정해야 합니다.

nano /etc/mysql/mariadb.conf.d/50-server.cnf

bind-address = 127.0.0.1을 0.0.0.0으로 교체하여 MariaDB가 모든 네트워크 인터페이스에서 수신 대기하도록 합니다. 모든 네트워크 인터페이스 대신 수신 대기하려는 특정 인터페이스가 있는 경우 해당 인터페이스의 IP 주소를 대신 사용합니다.

4. 모든 서버 노드에서 MariaDB 중지

Galera 클러스터 구성을 적용할 수 있도록 각 노드에서 mariadb 서비스를 중지합니다.

sudo systemctl stop mariadb

5. Galera 클러스터 구성

각 서버 노드에서 Galera 클러스터와 구성하려는 특정 노드에 필요한 구성이 포함된 galera.cnf 파일을 만들어야 합니다.

sudo nano /etc/mysql/conf.d/galera.cnf

아래는 Galera 구성에 사용할 수 있는 템플릿입니다. 수정해야 할 부분을 파란색으로 표시했습니다.

[mysqld]
binlog_format=ROW
default-storage-engine=innodb
innodb_autoinc_lock_mode=2
bind-address=0.0.0.0

# Provider Configuration
wsrep_on=ON
wsrep_provider=/usr/lib/galera/libgalera_smm.so

# Galera Cluster Configuration
wsrep_cluster_name="ClusterName"
wsrep_cluster_address="gcomm://FirstNodeIP,SecondNodeIP,ThirdNodeIP"

# Synchronization Configuration
wsrep_sst_method=rsync

# Node Configuration
wsrep_node_address="NodeIP"
wsrep_node_name="NodeName"

ClusterName

실행 중인 다른 클러스터와 식별할 수 있는 이름을 Galera 클러스터에 제공해야 합니다. 이 이름은 무엇이든 선택할 수 있지만, 설명적인 이름을 사용하는 것이 가장 좋습니다.

예를 들어, Galera 클러스터를 Kubernetes 배포의 일부로 설정하는 경우 이름을 KubeCluster로 지정할 수 있습니다. 또는 고가용성 WordPress 스택을 설정하고 있을 수도 있습니다. 이 경우, WordPressDBCluster와 같은 이름을 지정할 수 있습니다.

이 글에서는 클러스터 네임을 ExampleCluster로 합니다.

FirstNodeIP / SecondNodeIP / ThirdNodeIP

이 값은 Galera 클러스터의 구성원인 각 노드의 IP 주소에 해당합니다. 이 글의 앞부분에서 언급했듯이 최소 3개의 노드가 필요하며 쿼럼을 위해 항상 홀수 개의 노드를 사용해야 합니다.

NodeIP

이를 구성 중인 특정 노드의 IP 주소로 바꿉니다. 이 글에서는 첫 번째 노드를 구성하는 IP 192.168.190.140을 사용합니다.

NodeName

이 이름을 구성하려는 특정 노드의 이름으로 바꿉니다. 이 글에서 첫 번째 노드 구성으로 galera-example-01을 사용합니다.

nano에서 구성 파일 설정을 마쳤으면 CTRL + X를 눌러 종료하고, 변경 사항을 저장할지 묻는 메시지가 표시되면 y를 입력하고 엔터를 누릅니다.

완료된 구성 예시

모든 것을 종합한 첫 번째 노드의 최종 구성입니다.

[mysqld]
binlog_format=ROW
default-storage-engine=innodb
innodb_autoinc_lock_mode=2
bind-address=0.0.0.0

# Provider Configuration
wsrep_on=ON
wsrep_provider=/usr/lib/galera/libgalera_smm.so

# Galera Cluster Configuration
wsrep_cluster_name="ExampleCluster"
wsrep_cluster_address="gcomm://192.168.190.140,192.168.190.145,192.168.190.150"

# Synchronization Configuration
wsrep_sst_method=rsync

# Node Configuration
wsrep_node_address="192.168.190.140"
wsrep_node_name="galera-example-01"

앞서 설명했듯이 각 노드에 대한 노드별 값을 수정해야 합니다. 각 노드의 구성 파일이 준비되면 진행할 준비가 된 것입니다.

6. UFW 방화벽 구성

패키지 설치 단계에서 언급했듯이 모든 서버에는 방화벽이 구성되어 있어야 합니다. 먼저 Galera 클러스터의 각 노드에서 어떤 포트를 열어야 하는지 알려드리겠습니다.

sudo ufw allow 3306,4567,4568,4444/tcp
sudo ufw allow 4567/udp

SSH를 통해 서버에 연결하고 있고 아직 액세스를 허용하도록 ufw를 구성하지 않은 경우에도 이를 허용해야 합니다. 비표준 포트를 사용하도록 수정하지 않는 한 기본 SSH 포트는 22번이며, 수정했다면 여기서 무엇을 해야 하는지 이미 알고 있을 것입니다.

sudo ufw allow 22/tcp

다음 명령을 입력하여 ufw를 활성화합니다.

sudo ufw enable

방화벽이 할성화되면 Galera 클러스터를 실행할 준비가 된 것입니다.

7. Galera 클러스터 생성

첫 번째 노드에서 새 Galera 클러스터를 만들도록 시스템에 지시해야 합니다.

sudo galera_new_cluster

이렇게 하면 새 Galera 클러스터가 생성될 뿐만 아니라 MariaDB 서비스도 활성화됩니다.

8. 나머지 노드 시작

나머지 노드에서는 MariaDB 서비스를 수동으로 시작해야 합니다.

sudo systemctl start mariadb

다음 명령으로 MariaDB가 정상적으로 시작되었는지 확인할 수 있습니다.

sudo systemctl status mariadb

이 시점에서 Galera 클러스터가 가동 및 실행 중이어야 합니다. 이 글의 마지막에서 Galera 클러스터 정상 작동 확인 방법을 다룹니다.

9. 테스트

클러스터가 제대로 작동하는지 확인하기 위해 실행해야 하는 테스트는 두 가지입니다.

• Galera 클러스터 크기 확인

먼저, 모든 노드에서 이 명령을 사용하여 모든 노드가 Galera 클러스터에 가입했는지 확인할 수 있습니다.

mysql -u root -p -e "SHOW STATUS LIKE 'wsrep_cluster_size'"

Galera 클러스터에 총 3개의 노드가 있는 경우 3이라는 결과를 얻어야 합니다. 각 노드에서 이와 동일한 결과를 얻어야 합니다.

결과가 3 미만인 경우 각 노드의 구성 문제를 해결하고, MariaDB가 시작되었는지 확인해야 합니다.

• 복제 테스트

모든 것이 제대로 작동하는지 확인하기 위해 마지막으로 수행할 테스트는 노드 중 하나에 테스트 데이터베이스를 생성하여 간단한 복제가 되는지 확인합니다.

다른 노드에서 다음 명령을 실행하여 데이터베이스를 조회합니다. TestDatabase가 보인다면 정상적으로 복제가 이뤄지는 것입니다.

sudo mysql -e "create database TestDatabase;"

완료

Galera 클러스터 구성이 성공적으로 완료되었습니다.

질문이 있거나 의견이 있으면 댓글로 남겨주세요. 친절하게 답변해 드리겠습니다.

Join the conversation

이메일 주소는 공개되지 않습니다. 필수 필드는 *로 표시됩니다