ハートビートとDRBDはどちらも、2台のサーバーを使用するすべてのアプリケーションのクラスターソリューションに使用されます。両方のサーバーはアクティブモードとパッシブモードで動作し、一方のサーバーは同時に動作し、もう一方のサーバーはバックアップサーバーとして動作します。 DRBD(Distributed Replicated Block Device)は、2台のサーバー間でデータをリアルタイムで同期するカーネルレベルのサービスです。 Heartbeatは、プライマリLinuxサーバーとバックアップLinuxサーバーが他方が「稼働中」であるかどうかを判断し、プライマリが稼働していない場合はリソースをバックアップにフェイルオーバーできるようにするオープンソースプログラムです。また、サーバー内のIPの高可用性やその他のサービスも管理します。
このチュートリアルでは、Ubuntu16.04サーバーでHeartbeatとDRBDを使用してMariaDBの高可用性を実現する方法を学習します。
- Ubuntu16.04サーバーがインストールされている2つのノード。
- 各ノードに2枚のネットワークカードがインストールされています。
- 各ノードにインストールされている追加のパーティション化されていないハードドライブ。
- 各ノードにsudo権限が設定されているroot以外のユーザー。
開始する前に、各ノードでIPアドレスを設定する必要があります。各ノードで次のIPアドレスを使用します:
ノード1:
eth0では172.16.0.1、eth1では192.168.0.101
ノード2:
eth0では172.16.0.2、eth1では192.168.0.102
IP192.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とハートビートをインストールする
次に、両方のノードにDRBDとHeartbeatをインストールする必要があります。デフォルトでは、どちらもUbuntu16.04のデフォルトリポジトリで利用できます。両方のノードで次のコマンドを実行するだけで、それらをインストールできます。
sudo apt-get install drbd8-utils heartbeat -y
次に、DRBDとハートビートサービスを開始し、起動時に開始できるようにします。
sudo systemctl start drbd
sudo systemctl start heartbeat
systemctl enable drbd
systemctl enable heartbeat
DRBDとハートビートを構成する
次に、各ノードで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
次の行を追加します:
# Check Interval keepalive 1 # Time before server declared dead deadtime 10 # Secondary wait delay at boot initdead 60 # Auto-failback auto_failback off # Heartbeat Interface bcast eth1 # Nodes to monitor 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
ノード1でDRBDディスクが作成されたら、次のコマンドを使用してノード2で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
次に、両方のノードでハートビートを開始して、セットアップのフェイルオーバー部分を有効にします。
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/*
次に、MySQLメンテナンス構成ファイルをNode1からNode2にコピーする必要があります。これを行うには、次のコマンドを実行します。
sudo scp /etc/mysql/debian.cnf [email protected]:/etc/mysql/debian.cnf
次に、高可用性MySQLインスタンス上のデータベースをリモート管理してアクセスするためのrootユーザーを作成する必要があります。
これを行うには、Node1で次のコマンドを実行します。
mysql -u root -p
rootパスワードを入力し、次のコマンドを使用してrootユーザーを作成します。
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サービスのハートビートを開始します
次に、両方のノードのハートビートインスタンスに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
終了したら、ファイルを保存して閉じます。
ハートビートを設定したら、両方のノードでハートビートを再起動する必要があります。
まず、Node1でheartbeaを再起動します:
sudo systemctl restart heartbeat
次に、50秒間待ってから、Node2でハートビートサービスを再起動します。
sudo systemctl restart heartbeat
これですべてが適切に構成されました。一連のテストを実行して、アクティブサーバーに何らかの障害が発生したときに、ハートビートがアクティブサーバーからパッシブサーバーへの転送を実際にトリガーすることを確認します。
まず、Node1で次のコマンドを使用して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でハートビートを再起動します:
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
次に、MariaDBがNode2で実行されていることを確認します:
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)