データベース · 3 min read · Dec 07, 2025

Ubuntu 16.04 LTSでHeartbeatとDRBDを使用してMariaDBの高可用性を設定する方法

HeartbeatとDRBDは、2台のサーバーを使用するアプリケーションのためのクラスタソリューションに使用されます。両方のサーバーはアクティブとパッシブモードで動作し、一方のサーバーが同時に動作し、もう一方のサーバーがバックアップサーバーとして機能します。DRBD(Distributed Replicated Block Device)は、2台のサーバー間でデータをリアルタイムで同期するカーネルレベルのサービスです。Heartbeatは、プライマリとバックアップのLinuxサーバーが互いに「生きている」かどうかを判断し、プライマリが生きていない場合はリソースをバックアップにフェイルオーバーすることを可能にするオープンソースプログラムです。また、サーバー内のIP高可用性やその他のサービスも管理します。

このチュートリアルでは、Ubuntu 16.04サーバー上でHeartbeatとDRBDを使用してMariaDBの高可用性を達成する方法を学びます。

要件

  • Ubuntu 16.04サーバーがインストールされた2つのノード。
  • 各ノードにインストールされた2つのネットワークカード。
  • 各ノードにインストールされた追加の未パーティション化ハードドライブ。
  • 各ノードに設定されたsudo権限を持つ非rootユーザー。

始めに

始める前に、各ノードに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

終了したら、ファイルを保存して閉じます。

2番目のノードで、/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をインストールする必要があります。デフォルトでは、両方ともUbuntu 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デバイスを設定する必要があります。2番目の未パーティション化ドライブ/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ノードであることを次のコマンドで確認します:

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をプライマリサーバーにするためのフェイルオーバーをトリガーするはずです。

次のコマンドで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がプライマリ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

新しい投稿を受信箱で受け取る

スパムはありません。いつでも購読を解除できます。