MariaDB Galera Cluster 구성기(1)

2025. 6. 21. 12:10·Database

저번 MariaDB Galera Cluster 포스팅에 이어서 이번에는 도커 컨테이너를 띄워서 직접 MariaDB Galera Cluster를 구성해보기로 했다. 참고로, 도커 이미지는 아래 ubuntu 공식 이미지를 기반으로 SSH 접속만 datalab이라는 계정으로 접속할 수 있도록 설정해놓은 커스텀 이미지를 사용하였다. 컨테이너에 굳이 SSH 설정을 하나 생각이 들 수도 있겠지만, 실제 운영 환경에서도 SSH 통신을 통해 서버에 접속하여 작업을 하는 환경이 주이므로 최대한(?) 실전과 같은 세팅으로 해보고 싶어 해당 이미지를 사용하였다.

우분투 공식 이미지

 

MariaDB Galera Cluster에서 요구하는 최소 노드의 개수는 3개이다. 3개의 노드를 생성하기 위해, 먼저 하나의 컨테이너에 마리아 데이터베이스를 설치하고 이미지를 뜬 다음에 해당 이미지로 3개의 컨테이너를 띄워서 노드를 생성하는 방식으로 진행을 할 것이다. 하나의 컨테이너 먼저 띄워보기로 하자. 

 

 

도커 컨테이너 생성

1. 다음 명령어를 통해 준비된 이미지를 기반으로 컨테이너를 띄워준다.

docker run -d -p 2222:22 --hostname galera --name galeranode ubuntussh /usr/sbin/sshd -D

 

2. 컨테이너가 정상적으로 실행이 되고 있는지 확인한다.

 

3. SSH 통신 테스트

참고로 내가 만들어준 test라는 계정은 root 권한을 가지고 있는 계정이다.

 

이렇게 갈레라 클러스터를 구성할 3개의 컨테이너의 기반이 될 이미지를 생성하기 위한 컨테이너 생성은 완료 되었고, 이어서 MariaDB를 설치해보기로 하자.

 

 

MariaDB 커뮤니티 설치 - 커뮤니티 저장소 구성

아래 명령어들을 차례대로 입력해준다. 필자는 ubuntu에 설치하는 것이므로 다음 명령어들을 사용하였다. MariaDB의 공식 문서에 각 OS에 맞는 명령어들이 있으므로 참고해서 설치해준다.

 

$ sudo apt install curl apt-transport-https
curl -LsSO https://r.mariadb.com/downloads/mariadb_repo_setup

echo  "c4a0f3dade02c51a6a28ca3609a13d7a0f8910cccbb90935a2f218454d3a914a mariadb_repo_setup"  \ 
       | sha256sum -c -

chmod +x mariadb_repo_setup

sudo ./mariadb_repo_setup

 

 

MariaDB 커뮤니티 설치 - 패키지 설치

위 과정에서 MAriaDB 저장소를 설정한 상태에서 MariaDB 서버 및 관련 패키지들을 이어서 설치해줘야 한다. 마찬가지로 공식 문서를 참고하여 다음 명령어들을 차례대로 설치해준다. 

sudo apt-get install mariadb-server mariadb-client mariadb-backup
sudo apt-get install maxscale

 

위 명령어대로 설치해줬으면, 다음 명령어를 통해 정상적으로 MariaDB가 설치되었는지 확인한다.

mariadb --version

 

 

MariaDB Galera 설치

아래 명령어를 이용해 갈레라를 설치해준다.

sudo apt install mariadb-server mariadb-client galera-4 -y

 

여기까지 해준 뒤, 다음 명령어를 통해 해당 컨테이너의 이미지를 저장해준다.

docker commit [컨테이너 ID or 컨테이너 이름] [이미지이름]:[태그]

 

 

테스트 환경 정보

위와 같은 작업들을 통해 다음과 같이 테스트 환경을 구성하였다.

  • 실행 환경: Container
  • 컨테이너 엔진: Docker
  • 운영체제: Ubuntu 24.04.2 LTS
  • 클러스터 노드 수: 3개

 

네트워크 설정

일반적인 환경에서는 다음과 같이 갈레라 클러스터의 노드 간 통신을 위해 다음과 같은 방화벽 설정이 필요하다.

# Example for UFW (Ubuntu)
sudo ufw allow 3306/tcp  # MariaDB client connections
sudo ufw allow 4567/tcp  # Galera replication (multicast and unicast)
sudo ufw allow 4567/udp  # Galera replication (multicast)
sudo ufw allow 4568/tcp  # Incremental State Transfer (IST)
sudo ufw allow 4444/tcp  # State Snapshot Transfer (SST)
sudo ufw reload
sudo ufw enable # If firewall is not already enabled

 

하지만 현재 필자는 도커 컨테이너 환경이기에 위의 과정은 해주지 않아도 되고, 다음과 같이 별도 네트워크 설정이 필요하다.

 

사용자 정의 브리지 네트워크 생성

현재 로컬위에 떠있는 3개의 컨테이너(galera_node1, galera_node2, galera_node3)가 서로 같은 네트워크에서 통신할 수 있도록 별도의 네트워크를 생성해준다. 3개의 컨테이너를 같은 사용자 정의 브리지 네트워크로 묶어주면 별도의 포트 개방 없이도 서로 통신이 가능하게 된다.

또한 기본 브리지 네트워크에서는 도메인 기반 통신이 되지 않고, IP를 통해 통신해야 하므로 컨테이너를 내렸다 띄우게 되면 설정들을 일일히 다시 해줘야 하는 불편함이 있다. 따라서 컨테이너들 간에 컨테이너 이름(도메인)을 통해 네트워크 통신이 가능하도록 다음 명령어를 통해 네트워크를 새로 생성해준다.

cf. 컨테이너들이 속해 있는 기본 브리지 네트워크를 그대로 사용하고 노드 간의 통신을 IP를 통해 직접 해줘도 되지만, 도커 컨테이너는 재시작을 할 시 IP가 동적으로 변하기 때문에, 편의성을 생각한다면 컨테이너 이름을 통해 노드 간의 통신이 가능하도록 설정해주는 것이 좋다.

 

docker network create --driver bridge galera-net

 

cf. 도커 기본 네트워크(bridge)는 컨테이너 이름 기반 DNS 해석이 제대로 되지 않는다. Galera 클러스터는 gcomm://노드이름들 형식으로 서로 이름 기반으로 통신해야 하므로, 사용자 정의 네트워크를 사용해야 컨테이너 이름으로 통신 가능함.

 

참고로 도커 네트워크 연결/해제 명령어는 다음과 같다.

docker network disconnect -f [네트워크명] [컨테이너명]
docker network connect [네트워크명] [컨테이너명]

 

 

컨테이너 생성

이제 생성해준 도커 네트워크로 3개의 컨테이너를 띄워주자. 필자는 SSH 통신을 위한 포트 말고도 갈레라 클러스터에서 기본적으로 사용하는 포트들과 DB 포트 번호도 바인딩을 해줬는데, 외부와 컨테이너 간 통신이 없고 컨테이너 간의 통신만 할거면 굳이 안해줘도 된다. 

하지만 필자는 현재 생성해놓은 Galera Cluster를 나중에 프로젝트에도 사용할 수도 있을 것 같아서 galera_node1에는 추가적으로 포트 바인딩을 해주었다. 

cf. 이미 로컬에 MySQL 서비스가 올라가 있어서 컨테이너와 바인딩 되는 로컬 포트는 3307번을 이용하였다.
# galera_node1 컨테이너 RUN

docker run -d \
  --name galera_node1 \
  --hostname galera_node1 \
  -p 2223:22 \
  -p 3307:3306 \
  -p 4567:4567 \
  -p 4568:4568 \
  -p 4444:4444 \
  --network galera-net \ # 방금 생성한 사용자 정의 네트워크 기입
  galera_node1:init /usr/sbin/sshd -D
# glaera_node2 컨테이너 RUN

docker run -d \
  --name galera_node2 \
  --hostname galera_node2 \
  -p 2223:22 \
   --network galera-net galera_node2:init /usr/sbin/sshd -D

 

docker run -d \
  --name galera_node3 \
  --hostname galera_node3 \
  -p 2224:22 \
   --network galera-net galera_node3:init /usr/sbin/sshd -D

 

 

연결해준 후 다음 명령어를 통해 각 컨테이너들이 네트워크에 정상적으로 연결되었는지 확인해준다.

docker network inspect galera-net

 

docker network inspect galera-net 결과

 

위와 같이 정상적으로 네트워크에 연결된 것을 확인할 수 있다.

 

Galera 클러스터 구성(각 노드 별 galera.cnf)

이제 여태 생성한 3개의 노드들을 Galera Cluster로 구성하기 위해 다음과 같이 각 노드에 /etc/mysql/conf.d/galera.cnf 파일을 만들어준다. 

 

galera_node1 /etc/mysql/conf.d/galera.cnf 생성

/etc/mysql/my.cnf에 Galera 관련 내용들을 추가 설정해도 되지만, 유지보수의 용이성을 생각한다면 따로 cnf를 생성하는 것이 좋을 것 같아서 다음 내용의 /etc/mysql/conf.d/galera.cnf를 따로 만들어주었다.

# /etc/mysql/conf.d/galera.cnf

[mysqld]
wsrep_on=ON 
wsrep_provider=/usr/lib/galera/libgalera_smm.so 

wsrep_cluster_name="galera_cluster" 

wsrep_cluster_address="gcomm://galera_node1,galera_node2,galera_node3"

wsrep_node_name="galera_node1" 
wsrep_node_address="galera_node1" 

wsrep_sst_method=rsync 

binlog_format=ROW
default_storage_engine=InnoDB
innodb_autoinc_lock_mode=2

 

  • wsrep_on=ON
    • Galera 기능을 활성화하는 설정이다.
    • OFF 해둘 시 Galera 관련 복제, 클러스터 기능이 전혀 동작하지 않는다.
  • wsrep_provider=/usr/lib/galera/libgalera_smm.so
    • Galera의 복제 엔진(shared object 파일) 경로이다.
    • 이 경로는 시스템마다 다를 수 있지만, 보통 MariaDB 기본 설치 시 저 경로에 있다.
    • 해당 .so 파일이 없으면 Galera 클러스터 자체가 구동되지 않는다.
  • wsrep_cluster_name="galera_cluster"
    • 클러스터의 이름을 지정한다.
    • 모든 노드에서 이 이름이 동일해야 같은 클러스터로 인식된다.
    • 이름이 다르면 서로 별개의 클러스터라고 생각하고 붙지 않는다.
  • wsrep_cluster_address="gcomm://galera_node1,galera_node2,galera_node3"
    • 클러스터를 이루는 노드들의 주소 목록이다.
    • gcomm://는 Galera 내부 통신 프로토콜을 의미한다.
    • 최초 부팅 시 한 노드라도 살아있으면 클러스터가 붙는다.
    • 이름 대신 IP도 가능하지만, 앞서 말했듯이 IP는 도커가 재시작 시 바뀔 수 있으므로 이름으로 설정하는 것이 더 안정적이다.
  • wsrep_node_name="galera_node1"
    • 해당 노드의 고유 이름이다.
    • 클러스터 내에서 개별 노드를 식별하는 데 사용된다.
    • 반드시 각 노드마다 서로 다른 이름을 부여해야 한다.
  • wsrep_node_address="galera_node1"
    • 해당 노드가 클러스터 내부에서 접속 가능한 주소를 의미함.
    • 도커 네트워크 상에서는 컨테이너 이름으로 통신이 되므로 이름을 사용한다.
    • IP도 가능하지만 마찬가지로 재시작 후 바뀔 위험이 있다.
  • wsrep_sst_method=rsync
    • State Snapshot Transfer(SST) 방식을 지정한다.
    • 클러스터에 새 노드가 추가되거나 동기화가 필요한 경우
      전체 데이터를 전송할 방법을 정한다.
      • rsync: 간단하고 빠름 (설정 쉬움)
      • mysqldump: 느림, 전체 백업
      • xtrabackup: 성능 좋음, 외부 설치 필요
  • binlog_format=ROW
    • Galera 복제는 행 단위(ROW) 로그만 지원한다.
    • 즉, 어떤 테이블의 어떤 행이 변경됐는지 명확하게 기록해야 한다.
    • STATEMENT, MIXED 모드 사용 시 클러스터 복제 오류가 발생 가능하다.
  • default_storage_engine=InnoDB
    • Galera는 InnoDB 엔진만 복제 가능하다.
    • MyISAM이나 MEMORY 같은 비트랜잭션 엔진은 Galera 복제 대상이 아니다.
  • innodb_autoinc_lock_mode=2
    • 자동 증가 키의 충돌 방지를 위한 설정이다.
    • Galera는 병렬 복제를 수행하기 때문에, AUTO_INCREMENT 충돌이 날 수 있다.
    • 2번 모드는 interleaved 모드로 가장 안전하며 Galera에서 권장된다.

 

위의 내용들을 간단하게 정리해보자면 다음과 같다.

설정 항목 의미 설정 이유
wsrep_on Galera 활성화 클러스터 기능 사용을 위해
wsrep_provider Galera 복제 모듈 경로 Galera 엔진 로딩
wsrep_cluster_name 클러스터 이름 노드들이 같은 그룹으로 묶이도록
wsrep_cluster_address 클러스터 내 노드 주소 복제 연결 대상 설정
wsrep_node_name 노드 이름 개별 노드 식별자
wsrep_node_address 자기 자신의 주소 클러스터 통신용 주소
wsrep_sst_method 복제 데이터 전송 방식 초기 동기화 또는 장애 시 복구
binlog_format=ROW 복제 로그 방식 행 단위만 지원됨
default_storage_engine=InnoDB 저장 엔진 지정 Galera는 InnoDB만 지원
innodb_autoinc_lock_mode=2 Auto Increment 동시성 설정 키 충돌 방지

 

galera_node2 /etc/mysql/conf.d/galera.cnf 생성

galera_node2 컨테이너에서도 다음과 같이 설정 파일을 만들어준다.

# /etc/mysql/conf.d/galera.cnf 

[mysqld]
wsrep_on=ON
wsrep_provider=/usr/lib/galera/libgalera_smm.so

wsrep_cluster_name="galera_cluster"
wsrep_cluster_address="gcomm://galera_node1,galera_node2,galera_node3"

wsrep_node_name="galera_node2"
wsrep_node_address="galera_node2"

wsrep_sst_method=rsync

binlog_format=ROW
default_storage_engine=InnoDB
innodb_autoinc_lock_mode=2

 

galera_node3 /etc/mysql/conf.d/galera.cnf 생성

마찬가지로, galera_node3 컨테이너에서도 다음과 같이 구성해준다.

# /etc/mysql/conf.d/galera.cnf

[mysqld]
wsrep_on=ON
wsrep_provider=/usr/lib/galera/libgalera_smm.so

wsrep_cluster_name="galera_cluster"
wsrep_cluster_address="gcomm://galera_node1,galera_node2,galera_node3"

wsrep_node_name="galera_node3"
wsrep_node_address="galera_node3"

wsrep_sst_method=rsync

binlog_format=ROW
default_storage_engine=InnoDB
innodb_autoinc_lock_mode=2

 

 

/run/mysqld/mysqld.sock 확인 및 생성 (모든 컨테이너 공통)

위 과정까지 하고 바로 Galera Clusterr가 구성되는 경우도 있을 수 있겠지만, 필자는 다음과 같은 오류가 발생했다. 그래서 만약 필자의 블로그를 보고 그대로 따라하고 하는 독자분들께서는 아래 내용을 한번 더 확인하고 Galera Cluster를 구성해보도록 하자.

[ERROR] Can't start server: Bind on unix socket: No such file or directory
[ERROR] Do you already have another mysqld running on socket: /run/mysqld/mysqld.sock ?

 

위 오류는 mysqld가 Unix 도메인 소켓 파일을 생성하려고 했는데, 디렉토리가 없어서 실패한 경우에 발생한다. 이러한 경우에는 다음과 같은 사항들을 확인한다.

 

1. /run/mysqld 디렉토리가 존재하는지 확인하고, 없으면 다음 명령어를 통해 생성해준다.

sudo mkdir -p /run/mysqld

 

2. 위 디렉토리의 소유자가 mysql인지 확인하고, 그렇지 않다면 다음 명령어를 통해 소유자를 변경해준다.

sudo chown mysql:mysql /run/mysqld

 

 

여기까지 Galera Cluster를 구성하기 위한 사전 준비가 끝났다. 물론 처음부터 MariaDB 이미지로 컨테이너를 띄워서 작업하면 더 쉬웠겠지만, 실제 리눅스 서버 위에서 직접 MariaDB를 올리고 설정도 해보고 싶어서 이렇게 진행을 해보았다.

원래는 하나의 포스팅에서 다 끝낼려고 했지만, 글이 루즈해질 것 같아서 다음 포스팅에서 본격적으로 Galera Cluster를 구성해보겠다.

 

Conference

MariaDB & Galera 설치 및 구성

 https://mariadb.com/docs/galera-cluster/galera-cluster-quickstart-guides/mariadb-galera-cluster-guide

'Database' 카테고리의 다른 글
  • mysqldump VS mariabackup 비교 -1
  • MariaDB Galera Cluster 구성기(2)
  • MariaDB Galera Cluster?
SummerToday
SummerToday
summertoday 님의 블로그 입니다.
  • SummerToday
    SummerToday
    SummerToday
  • 전체
    오늘
    어제
  • 인기 글

  • 블로그 메뉴

    • 홈
    • 태그
    • 방명록
    • 글쓰기
    • 관리자
    • 분류 전체보기 (62)
      • OS & Network (4)
      • Cloud (11)
      • Container & DevOps (41)
      • Database (4)
      • Develop (0)
      • IaC (2)
  • 태그

    openebs
    container
    AmazonSNS
    s2s vpn
    Grafana
    Galera Cluster
    MariaDB
    gitops
    Eni
    K8S
    tailscale
    점프 계정
    CloudWatch
    aws
    계정 관리
    CI/CD
    EIP
    cloud
    Kubernetes
    argocd
  • hELLO· Designed By정상우.v4.10.3
SummerToday
MariaDB Galera Cluster 구성기(1)
상단으로

티스토리툴바