今回はサーバーの冗長化について解説します。
レンタルサーバーでもメールサーバーでもWebサーバーでも障害が発生した場合、復旧する必要があります。
今回解説する「DRBD」はフリーソフトでサーバーのデータの冗長化を実現できます。
【DRBD】【VMware 6】DRBD インストール手順および設定手順(Keepalived、Pacemaker(heartbeat)、DRBD)(PostgreSQL冗長構成)【詳細版】
https://go-journey.club/archives/7830
【Linux HA】冗長構成についての基本
DRBDとは何か?
DRBD(Distributed Replicated Block Device)とは、複数台のコンピュータの間でハードディスクをリアルタイムで同期させるミドルウェア(ソフトウェア)です。
ハードディスクをリアルタイムで同期させることにより可用性(ハイ・アベイラビリティ)が実現できます。
イメージ的には、ハードディスクまるごと同期しています。
だからハードディスクにインストールされている MySQL とか WordPress もまるまるコピーされています。
全く同じ状態です。
そのため、メインサーバーがダウンしてもサービス的には何の問題もないというシステムです。
もちろんサイトは引き続き閲覧可能です。
たとえば、以下の図のようにWordPressがインストールされたサーバーが2台あるとします。
WordPressでホームページを運用していると仮定します。
(WordPressを動かすために、ApacheとかMySQLもインストールされています。)
通常メインサーバー(wordpress-01)が通常稼働しています。
クライアントはメインのサーバー(wordpress-01)にアクセスしています。
DRBDの構成図
1台しかサーバーがなければ、誰もホームページにアクセスできなくなります。
個人が利用しているパソコンなら誰も困りません。
しかし企業など多くのお客さんがリアルタイムで注文したり、お金を払ったり、チケットを予約していたら大変な損害になります。
そこで、以下のように2台構成でホームページを運用し、メインの wordpress-01 がダウンしても wordpress-02 がメインになりクライアントはホームページにアクセスができるようにします。
障害が発生したらどうなるのか?
冗長化をしているシステムで障害が発生したらどのような動きをするのでしょうか?
下図にように「wordpress-01」がダウンしたら、データの書き込みは wordpress-02 へ切り替わります。
wordpress-01がダウンしている間は、wordpress-02 が1台でサービスを提供する形になります。
このように無料で簡単にサーバーの冗長化ができるので、DRBDは非常に便利なミドルウェアなのです。
DRBDのインストール&設定
DRBDは無料であるにもかかわらず、非常に使い勝手のいい便利なミドルウェアです。
ただしインストールや設定に関しては少々複雑です。
インストール前の準備から確認しましょう。
1.DRBDのインストール前の準備
以下の環境で構築します。
仮想環境(VMware Player 12 Workstation)
OS:CentOS7.2 (64bit)
ディスク:100GB
メモリ:1GB
CPU:1コア
※上記のスペックのサーバーを2台用意します。
ディスク容量について
ディスク容量ですが、両ノードにほぼ同じ容量の記憶領域を準備します。
同じディスク容量であることが望ましいですが、必ずしも全く同じディスク容量でなければいけないわけではありません。
これがDRBDが管理する仮想的なブロックデバイスになります。
他にも例えば、以下の構成のディスクでもOKです。
- ローカルディスク(物理HDD全体、特定のパーティションなど)
LVM論理ボリューム
ソフトウェアRAID
などです。
通信ポート(TCP/IP)について
DRBDは7788以上のTCPポートを使用します。
※iptables、firewalldが設定されている場合は、ポートを開けておきます。
2.インストールする
CentOS7の場合はyumコマンドでインストール可能です。
ソースファイルをダウンロードして、コンパイルしてインストールすることも可能ですが、管理など面倒なので(あるいは管理しきれずにヒューマンエラーを起こすことになる可能性が高いので) yum コマンドの方がよいです。
DRBDのパッケージは、elrepo(エルレポ)レポジトリから取得できます。
ただ、デフォルトでは elrepo レポジトリはインストールされていないからインストールする必要があります。
CentOS7の場合
CentOS7の場合は以下のように yum コマンドでレポジトリをインストールできます。
# rpm -Uvh http://www.elrepo.org/elrepo-release-7.0-2.el7.elrepo.noarch.rpm |
elrepo レポジトリをインストールしたら、以下のように extras リポジトリを有効にしてインストールする。
# yum –enablerepo=extras install kmod-drbd84 ======================================= トランザクションの要約 総ダウンロード容量: 70 M
|
※extrasとは、追加のパッケージというような意味です。
ちなみにCentOS開発チームの動作確認済みだから怪しいものではありません。
上の場合は kernel も update しているので、インストールが終わったら OS を再起動します。
3.インストール後の各設定ファイルの設定
インストールが終わったら、DRBDの各設定ファイルを設定します。
設定ファイルの場所
$ cd /etc/drbd.d $ ls global_common.conf |
・global_common.conf
→global セクションと common セクションの設定をする。
r0.resファイルを作成する
デフォルトでは、rX.resファイルは存在していないので作成します。
・rX.res
→各resourceセクションの設定をするファイルです。
Xには数字が入ります。r1.resなどです。
※設定ファイルはすべてのノードで同じである必要があります。
# /etc/drbd.d # vi r0.res resource r0 { |
※細かいところは後程説明します。
設定ファイルの例
※引用元
https://www.3ware.co.jp/wp-content/uploads/drbd-users-guide-ja-8.4.pdf
シンプルな DRBD 構成例 (/etc/drbd.d/global_common.conf)
global { usage-count yes; } common { net { protocol C; } } |
シンプルな DRBD リソースの構成例 (/etc/drbd.d/r0.res)
resource r0 { on alice { device /dev/drbd0; disk /dev/sda3; address 1.1.1.1:7789; meta-disk internal; } on bob { device /dev/drbd0; disk /dev/sda3; address 1.1.1.2:7789; meta-disk internal; } } |
この例では、DRBD が次のように構成さています。
・DRBD の使用状況の統計が yes (usage-count yes;の部分)
・完全に同期したレプリケーションを使用する (レプリケーションのモードはデフォルトのProtocol C)
・クラスタには 2 つのノード alice と bob がある。
・任意の名前 r0 を持つリソースがあり /dev/sda3 を使用する。これは、内部メタデータによって設定されている。
・リソースはネットワーク接続に TCP ポート 7789 を使用し、それぞれ IP アドレス 1.1.1.1 と 1.1.1.2 を使用する。
以下、設定ファイルで指定する各セクションの説明です。
global セクション
usage-count の設定をします。
common セクション
各リソースで共通する設定を一括で定義します。
resource セクション
各リソースの設定をします。
このファイルは、通常 /etc/drbd.d/<resource>.res という名前にします。
4.初期設定をする
具体的にDRBDの初期設定をします。
メタデータを有効にする
以下のコマンドはrootで実行します。
全ノードで実行します。
# drbdadm create-md <resource> |
※ここで<resource>は r0 になります。
その場合、具体的なコマンドは「drbdadm create-md r0」になります。
リソースを有効にする
以下のコマンドでリソースを有効にします。
# drbdadm up r0 |
現状を確認する
下記コマンドでDRBDの現状を確認します。
# cat /proc/drbd version: 8.4.1 (api:1/proto:86-100) GIT-hash: 91b4c048c1a0e06777b5f65d312b38d47abaea80 build by buildsystem@linbit, 2011-12-20 12:58:48 0: cs:Connected ro:Secondary/Secondary ds:Inconsistent/Inconsistent C r—– ns:0 nr:0 dw:0 dr:0 al:0 bm:0 lo:0 pe:0 ua:0 ap:0 ep:1 wo:b oos:524236 |
※初期の段階では Secondary/Secondary 、Inconsistent/Inconsistent の状態になっています。
次にどちらかのサーバーを「プライマリ」に設定します。
プライマリを設定する(プライマリにしたいサーバー一台のみで実行)
# drbdadm primary –force <resource> |
※この環境では<resource>は、r0 になる。
このコマンドを実行すると初期のフル同期が実施されます。
状態確認コマンドで確認する
$ cat /proc/drbd version: 8.4.0 (api:1/proto:86-100) GIT-hash: 09b6d528b3b3de50462cd7831c0a3791abc665c3 build by linbit@buildsystem.linbit, 2011-10-12 09:07:35 0: cs:Connected ro:Secondary/Secondary ds:UpToDate/UpToDate C r—– ns:0 nr:0 dw:0 dr:656 al:0 bm:0 lo:0 pe:0 ua:0 ap:0 ep:1 wo:b oos:0 |
【説明】
version: 8.4.0 → DRBDのバージョン
0: → リソース r0 のこと
cs (connection state) → ネットワーク接続の状態
ro (roles) → ノードのロール最初にローカルノードのロールが表示され、スラッシュの後に対向ノードのロールが表示される
ds (disk states) → ハードディスクの状態スラッシュの前にローカルノードの状態、スラッシュの後に対向ノードのハードディスクの状態が表示される
C → リソースが使用するレプリケーションプロトコル。A、B、C のいずれか
r—– → I/O フラグ。リソースの I/O 状態を反映する 6 種のフラグ
ns:0 nr:0 dw:0 dr:656 al:0 bm:0 lo:0 pe:0 ua:0 ap:0 ep:1 wo:b oos:0 → パフォーマンスインジケータ。リソースの利用とパフォーマンスを反映したカウンタ
様々な管理方法を以下に記載します。(手動でやる場合)
リソースの有効化と無効化
# drbdadm up <resource> # drbdadm down <resource> |
リソースの昇格と降格
# drbdadm primary <resource> # drbdadm secondary <resource> |
基本的な手動フェイルオーバ
現在のプライマリノードで DRBD デバイスを使用したい場合、すべてのアプリケーションとサービスを停止し、リソースをセカンダリに降格します。
# umount /dev/drbd/by-res/<resource> # drbdadm secondary <resource> |
プライマリにしたいノードでリソースを昇格してデバイスをマウントする。
# drbdadm primary <resource> # mount /dev/drbd/by-res/<resource> <mountpoint> |
DRBDの障害対応
「heartbeat」と「drbd」の2つのサービスを再起動して確認してみます。
1.heartbeatサービスの停止
2.drbdサービスの再起動
3.heartbeatサービスの開始
障害時のチェックポイント
- ステータスは「Primary」になっている確認
- ディスクはマウントされているか確認
- サービスは正常に動いているか確認
- ログにエラーが出力されていないか確認
ハンドラー用のスクリプト
ハンドラー用のスクリプトが各種揃っています。
ディレクトリ
- /usr/lib/drbd
各種スクリプトファイル一覧
- notify-emergency-reboot.sh
- notify-emergency-shutdown.sh
- notify-io-error.sh
- notify-out-of-sync.sh
- notify-pri-lost-after-sb.sh
- notify-pri-lost.sh
- notify-pri-on-incon-degr.sh
- notify-split-brain.sh
- notify.sh
以下、DRBDの説明をします。
もう少々DRBDの説明
補足的にDRBDの説明をします。
DRBDのリソース
DRBD のリソースは、プライマリ または セカンダリ のどちらかのロール (役割) を持っています。
DRBDの2つのモード
- シングルプライマリモード
→1台のみプライマリモードになれる
- デュアルプライマリモード
→負荷分散が可能
レプリケーションの3つのタイプ
ProtocolA(非同期)
自分のディスクにデータを書き込み、レプリケーション用のパケットをTCP送信バッファに送った時点で同期が完了したと判断します。
→早いですがデータを紛失するリスクがあります。
ProtocolB(半非同期)
自分のディスクにデータを書き込み、レプリケーション用のパケットがセカンダリに届いた時点でレプリケーションが完了したと判断します。
→ProtocolAよりは遅いですが、安定性はあります。
ProtocolC(同期)
デフォルトの設定では、自分のディスクにデータを書き込み、セカンダリのディスクにもデータの書き込みが終わった時点でレプリケーションが完了したと判断します。
→一番遅いですが、データの不整合は起こりにくいです。
※ProtocolCはライトキャッシュに書き込まれた時点ではなく、不揮発性のディスクに書き込まれた時点で完了したとみなします。
そのため、データの信頼性が高いです。
スプリットブレインについての説明
ここではDRBDにつきものの「スプリットブレイン」に関して説明します。
スプリットブレインの原因
- 通信の一時的な中断
- 操作ミス
→HeartBeatなどを管理するホスト間の通信がなくなります。
→相手が死んだと判断し、自分がプライマリになろうとします。
- 両ノードが「プライマリ」の状態になる
→スプリットブレインになります。
スプリットブレインの対処
- 手動で復旧させる(回復させる)
- あらかじめどうするか決め、自動で復旧させる。(回復させる)
→アプリケーションの特性でどのように復旧させるかを決める。
「若い」プライマリ側の変更を切り捨てる方法
「古い」プライマリ側の変更を切り捨てる方法
変更が少ないプライマリ側の変更を切り捨てる方法
片ノードに変更がなかった場合の正常回復
■参考資料
https://www.3ware.co.jp/wp-content/uploads/drbd-users-guide-ja-8.4.pdf
■DRBDの入手先
https://www.linbit.com/en/products-and-services/support/
関連ページ
【DRBD】【VMware 6】DRBD インストール手順および設定手順(Keepalived、Pacemaker(heartbeat)、DRBD)(PostgreSQL冗長構成)【詳細版】
https://go-journey.club/archives/7830
【Linux HA】冗長構成についての基本
結論
もっと細かく調べてどんどん手順を追加していきたいと思います。
コメント