データベース · 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 heartbeatDRBDと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/mysqlNode1で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:0MariaDBのインストールと設定
両方のノードですべてが適切に設定されたら、両方のノードに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/*.cnfMariaDBサービスのための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 heartbeatHeartbeatと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 -pMariaDB [(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)新しい投稿を受信箱で受け取る
スパムはありません。いつでも購読を解除できます。