데이터베이스 · 7 min read · Dec 07, 2025

우분투 16.04 LTS에서 Heartbeat 및 DRBD로 MariaDB 고가용성 설정하는 방법

Heartbeat와 DRBD는 두 서버를 사용하는 모든 애플리케이션을 위한 클러스터 솔루션에 사용됩니다. 두 서버는 활성 및 수동 모드에서 작동하며, 한 서버는 동시에 작동하고 다른 서버는 백업 서버로 작동합니다. DRBD(Distributed Replicated Block Device)는 두 서버 간의 데이터를 실시간으로 동기화하는 커널 수준의 서비스입니다. Heartbeat는 기본 및 백업 리눅스 서버가 서로 “살아있는지“ 확인하고 기본 서버가 작동하지 않을 경우 백업 서버로 리소스를 전환할 수 있도록 하는 오픈 소스 프로그램입니다. 또한 서버의 IP 고가용성과 기타 서비스를 관리합니다.

이 튜토리얼에서는 우분투 16.04 서버에서 Heartbeat와 DRBD를 사용하여 MariaDB의 고가용성을 달성하는 방법을 배웁니다.

요구 사항

  • 우분투 16.04 서버가 설치된 두 개의 노드.
  • 각 노드에 설치된 두 개의 네트워크 카드.
  • 각 노드에 설치된 추가 파티션이 없는 하드 드라이브.
  • 각 노드에 sudo 권한이 있는 비루트 사용자 설정.

시작하기

시작하기 전에 각 노드에 IP 주소를 설정해야 합니다. 각 노드에서 다음 IP 주소를 사용하십시오:

Node1 :

172.16.0.1은 eth0에, 192.168.0.101은 eth1에

Node2 :

172.16.0.2는 eth0에, 192.168.0.102는 eth1에

IP 192.168.0.103은 고가용성 IP가 됩니다.

다음으로 각 노드에서 호스트 이름 및 호스트 이름 해상도를 설정해야 합니다. 각 노드가 서로 통신할 수 있도록 합니다. 첫 번째 노드에서 /etc/hosts 파일과 /etc/hostname 파일을 엽니다:

sudo nano /etc/hosts

파일 끝에 다음 줄을 추가합니다:

172.16.0.1  Node1
172.16.0.2  Node2
sudo nano /etc/hostname

파일을 아래와 같이 변경합니다:

Node1

작업이 끝나면 파일을 저장하고 닫습니다.

두 번째 노드에서 /etc/hosts 파일과 /etc/hostname 파일을 엽니다:

sudo nano /etc/hosts

파일 끝에 다음 줄을 추가합니다:

172.16.0.1  Node1
172.16.0.2  Node2
sudo nano /etc/hostname

파일을 아래와 같이 변경합니다:

Node2

작업이 끝나면 파일을 저장하고 닫습니다.

다음으로 각 노드를 최신 버전으로 업데이트합니다. 다음 명령을 사용하십시오:

sudo apt-get update -y  
sudo apt-get upgrade -y

시스템이 업데이트되면 변경 사항을 적용하기 위해 시스템을 재시작합니다.

DRBD 및 Heartbeat 설치

다음으로 두 노드 모두에 DRBD 및 Heartbeat를 설치해야 합니다. 기본적으로 두 가지 모두 우분투 16.04 기본 저장소에서 사용할 수 있습니다. 두 노드에서 다음 명령을 실행하여 설치할 수 있습니다:

sudo apt-get install drbd8-utils heartbeat -y

다음으로 DRBD 및 Heartbeat 서비스를 시작하고 부팅 시 시작하도록 활성화합니다:

sudo systemctl start drbd  
sudo systemctl start heartbeat  
systemctl enable drbd  
systemctl enable heartbeat

DRBD 및 Heartbeat 구성

다음으로 각 노드에서 DRBD 장치를 설정해야 합니다. 두 번째 파티션이 없는 드라이브 /dev/sdb에서 단일 파티션을 생성합니다.

각 노드에서 다음 명령을 실행하여 수행할 수 있습니다:

sudo echo -e 'n\np\n1\n\n\nw' | fdisk /dev/sdb

다음으로 두 노드에서 DRBD를 구성해야 합니다. 각 노드에서 /etc/drbd.d/r0.res 파일을 생성하여 수행할 수 있습니다.

sudo nano /etc/drbd.d/r0.res

다음 줄을 추가합니다:

global {
usage-count no;
}
resource r0 {
protocol C;
startup {
degr-wfc-timeout 60;
}
disk {
}
syncer {
rate 100M;
}
net {
cram-hmac-alg sha1;
shared-secret "aBcDeF";
}
on Node1 {
device /dev/drbd0;
disk /dev/sdb1;
address 172.16.0.1:7789;
meta-disk internal;
}
on Node2 {
device /dev/drbd0;
disk /dev/sdb1;
address 172.16.0.2:7789;
meta-disk internal;
}
}

작업이 끝나면 파일을 저장하고 닫습니다. 그런 다음 각 노드에서 다른 구성 파일을 엽니다:

sudo nano /etc/ha.d/ha.cf

다음 줄을 추가합니다:

# 체크 간격
keepalive 1
# 서버가 사망으로 선언되기 전의 시간
deadtime 10
# 부팅 시 보조 대기 지연
initdead 60
# 자동 복귀
auto_failback off
# Heartbeat 인터페이스
bcast eth1
# 모니터링할 노드
node Node1
node Node2

파일을 저장하고 닫습니다.

다음으로 각 노드에서 리소스 파일 /etc/ha.d/haresources를 엽니다:

sudo nano /etc/ha.d/haresources

다음 줄을 추가합니다:

Node1 192.168.0.103/24 drbddisk::r0 Filesystem::/dev/drbd0::/var/lib/mysql::ext4::noatime

여기서 Node1은 기본 활성 노드의 호스트 이름이며, 192.168.0.103은 부동 IP 주소이고, /var/lib/mysql은 마운트 지점이며, /dev/drbd0은 DRBD 장치입니다.

다음으로 두 노드에서 동일한 인증 키를 정의하고 저장해야 합니다. 각 노드에서 /etc/ha.d/authkeys 파일을 사용하여 수행할 수 있습니다:

sudo nano /etc/ha.d/authkeys

다음 줄을 추가합니다:

auth1
1 sha1 your-secure-password

여기서 your-secure-password는 보안 비밀번호입니다. 두 노드에서 동일한 비밀번호를 사용하십시오.

다음으로 Node1에서 다음 명령을 실행하여 DRBD를 생성하고 시작합니다:

sudo drbdadm create-md r0  
sudo systemctl restart drbd  
sudo drbdadm outdate r0  
sudo drbdadm -- --overwrite-data-of-peer primary all  
sudo drbdadm primary r0  
sudo mkfs.ext4 /dev/drbd0  
sudo chmod 600 /etc/ha.d/authkeys  
sudo mkdir /var/lib/mysql

Node1에서 DRBD 디스크가 생성되면 다음 명령을 사용하여 Node2에서 DRBD 디스크를 생성합니다:

sudo drbdadm create-md r0  
sudo systemctl restart drbd  
sudo chmod 600 /etc/ha.d/authkeys  
sudo mkdir /var/lib/mysql

이제 다음 명령을 실행하여 DRBD 디스크가 연결되어 있고 제대로 동기화되고 있는지 확인할 수 있습니다:

sudo cat /proc/drbd

모든 것이 정상이라면 다음 출력이 표시되어야 합니다:

version: 8.4.5 (api:1/proto:86-101)
srcversion: F446E16BFEBS8B115AJB14H
0: cs:SyncSource ro:Primary/Secondary ds:UpToDate/Inconsistent C r-----
ns:210413 nr:0 dw:126413 dr:815311 al:35 bm:0 lo:0 pe:11 ua:0 ap:0 ep:1 wo:f oos:16233752
[>....................] sync'ed: 3.3% (14752/14350)M
finish: 0:12:23 speed: 12,156 (16,932) K/sec

다음으로 두 노드에서 heartbeat를 시작하여 설정의 장애 조치 부분을 활성화합니다.

sudo systemctl start heartbeat

다음으로 Node1에서 다음 명령을 사용하여 마운트된 DRBD 파티션을 확인합니다:

sudo mount | grep drbd

다음 출력이 표시되어야 합니다:

/dev/drbd0 on /var/lib/mysql type ext4 (rw,noatime,data=ordered)

다음으로 다음 명령을 사용하여 부동 IP가 Node1에만 바인딩되어 있는지 확인합니다:

sudo ip addr show | grep 192.168.0.103

다음 출력이 표시되어야 합니다:

inet 192.168.0.103/24 brd 192.168.0.255 scope global secondary eth1:0

MariaDB 설치 및 구성

모든 것이 두 노드에서 제대로 구성되면 이제 두 노드에 MariaDB 서버를 설치할 시간입니다.

다음 명령을 두 노드에서 실행하여 MariaDB 서버를 설치합니다:

sudo apt-get install mariadb-server -y

다음으로 두 노드에서 MariaDB 서비스를 비활성화해야 합니다:

sudo systemctl disable mysql

여기서 우리는 Node1을 기본으로 사용하고 Node2의 데이터베이스는 Node1과의 동기화를 통해 생성되고 채워져야 합니다. 따라서 MariaDB 서비스를 중지하고 Node2의 /var/lib/mysql 내부의 내용을 제거해야 합니다. 다음 명령을 사용하여 수행할 수 있습니다:

sudo systemctl stop mysql  
sudo rm -rf /var/lib/mysql/*

다음으로 Node1에서 Node2로 MySQL 유지 관리 구성 파일을 복사해야 합니다. 다음 명령을 실행하여 수행할 수 있습니다:

sudo scp /etc/mysql/debian.cnf [email protected]:/etc/mysql/debian.cnf

다음으로 고가용성 MySQL 인스턴스의 데이터베이스에 대한 원격 관리 및 액세스를 위해 루트 사용자를 생성해야 합니다.

Node1에서 다음 명령을 실행하여 수행할 수 있습니다:

mysql -u root -p

루트 비밀번호를 입력한 후 다음 명령으로 루트 사용자를 생성합니다:

MariaDB [(none)]> CREATE USER 'root'@'192.168.0.%' IDENTIFIED BY 'password';  
MariaDB [(none)]> GRANT ALL PRIVILEGES ON *.* TO 'root'@'192.168.0..%' WITH GRANT OPTION;  
MariaDB [(none)]> FLUSH PRIVILEGES;  
MariaDB [(none)]> QUIT;

다음으로 두 노드에서 다음 명령을 사용하여 MySQL의 바인드 주소를 설정합니다:

sudo sed -i 's/127.0.0.1/0.0.0.0/g' /etc/mysql/mariadb.conf.d/*.cnf

MariaDB 서비스에 대한 Heartbeat 시작

다음으로 두 노드의 heartbeat 인스턴스에 MariaDB 서비스를 추가해야 합니다. /etc/ha.d/haresources 파일을 편집하여 수행할 수 있습니다:

sudo nano /etc/ha.d/haresources

다음 줄을 수정합니다:

Node1 192.168.0.103/24 drbddisk::r0 Filesystem::/dev/drbd0::/var/lib/mysql::ext4::noatime mysql

작업이 끝나면 파일을 저장하고 닫습니다.

Heartbeat가 구성되면 두 노드에서 다시 시작해야 합니다.

먼저 Node1에서 heartbeat를 다시 시작합니다:

sudo systemctl restart heartbeat

다음으로 50초를 기다린 후 Node2에서 heartbeat 서비스를 다시 시작합니다:

sudo systemctl restart heartbeat

Heartbeat 및 DRBD 테스트

이제 모든 것이 제대로 구성되었으므로 활성 서버가 어떤 방식으로든 실패할 때 heartbeat가 실제로 활성 서버에서 수동 서버로 전환을 트리거하는지 확인하기 위해 일련의 테스트를 수행할 시간입니다.

먼저 Node1이 기본 drbd 노드인지 확인합니다. Node1에서 다음 명령을 실행합니다:

sudo cat /proc/drbd

다음 출력이 표시되어야 합니다:

version: 8.4.5 (api:1/proto:86-101)
srcversion: F446E16BFEBS8B115AJB14H
O cs:Connected ro:Primary/Secondary ds:UpToDate/UpToDate C r-----
ns:22764644 nr:256 dw:529232 dr:22248299 al:111 bm:0 lo:0 pe:0 ua:0 ap:0 ep:1 wo:f oos:0

다음으로 DRBD 디스크가 마운트되었는지 확인합니다. 다음 명령을 실행합니다:

sudo mount | grep drbd
/dev/drbd0 on /var/lib/mysql type ext4 (rw,noatime,data=ordered)

다음으로 MariaDB 서비스를 확인합니다. 다음 명령을 실행합니다:

sudo systemctl status mysql

다음으로 부동 IP를 사용하여 원격 머신에서 MariaDB 서버에 접근하고 테스트 데이터베이스를 생성합니다:

mysql -h 192.168.0.103 -u root -p
MariaDB [(none)]> create database test;  
MariaDB [(none)]> quit

다음으로 Node1에서 heartbeat를 다시 시작합니다:

sudo systemctl restart heartbeat

이제 heartbeat는 이 재시작을 Node1의 MariaDB 실패로 해석하고 Node2를 기본 서버로 만들기 위해 장애 조치를 트리거해야 합니다.

다음 명령을 Node1에서 실행하여 DRBD가 이제 Node1을 보조 서버로 취급하고 있는지 확인할 수 있습니다:

sudo cat /proc/drbd

다음 출력이 표시되어야 합니다:

version: 8.4.5 (api:1/proto:86-101)
srcversion: F446E16BFEBS8B115AJB14H
0: cs:Connected ro:Secondary/Primary ds:UpToDate/UpToDate C r-----
ns:22764856 nr:388 dw:529576 dr:22248303 al:112 bm:0 lo:0 pe:0 ua:0 ap:0 ep:1 wo:f oos:0

이제 Node2에서 다음 명령을 실행하여 Node2가 기본 drbd 노드인지 확인합니다:

sudo cat /proc/drbd

다음 출력이 표시되어야 합니다:

version: 8.4.5 (api:1/proto:86-101)
srcversion: F446E16BFEBS8B115AJB14H
0: cs:Connected ro:Primary/Secondary ds:UpToDate/UpToDate C r-----
ns:412 nr:20880892 dw:20881304 dr:11463 al:7 bm:0 lo:0 pe:0 ua:0 ap:0 ep:1 wo:f oos:0

다음으로 Node2에서 MariaDB가 실행되고 있는지 확인합니다:

sudo systemctl status mysql

이제 원격 사용자로 Node2에서 부동 IP를 사용하여 MariaDB 서버에 연결합니다.

mysql -h 192.168.0.103 -u root -p

다음으로 이전에 Node1이 기본 서버였을 때 생성한 테스트 데이터베이스를 확인합니다.

MariaDB [(none)]> show databases;

다음 출력이 표시되어야 합니다:

 +--------------------+
| Database           |
+--------------------+
| test               |
| information_schema  |
| lost+found         |
| mysql              |
| performance_schema  |
+--------------------+
5 rows in set (0.04 sec)
Share: X/Twitter LinkedIn

새 게시물을 받은 편지함에서 받기

스팸은 없습니다. 언제든지 구독 해지 가능합니다.