前書き
サービスの停止は非常にコストがかかるため、今日では高可用性が重要なトピックです。 障害が発生した場合にウェブサイトまたはウェブアプリケーションを実行し続ける対策を講じることは賢明です。 Pacemakerスタックを使用すると、高可用性クラスターを構成できます。
Pacemakerはクラスターリソースマネージャーです。 すべてのクラスターサービス(resources)を管理し、基になる_cluster engine_のメッセージングおよびメンバーシップ機能を使用します。 クラスターエンジンとしてCorosyncを使用します。 リソースには_resource agent_があります。これは、サービスを抽象化する外部プログラムです。
アクティブ/パッシブクラスターでは、すべてのサービスがプライマリシステムで実行されます。 プライマリシステムに障害が発生すると、すべてのサービスがバックアップシステムに移動します。 アクティブ/パッシブクラスターにより、中断することなくメンテナンス作業を行うことができます。
このチュートリアルでは、高可用性Apacheアクティブ/パッシブクラスターを構築する方法を学習します。 Webクラスターはその仮想IPアドレスによってアドレス指定され、ノードに障害が発生すると自動的にフェイルオーバーします。
ユーザーは、Pacemakerが管理する仮想IPアドレスでWebアプリケーションにアクセスします。 Apacheサービスと仮想IPは常に同じホスト上にあります。 このホストに障害が発生すると、2番目のホストに移行され、ユーザーは停止に気付かないでしょう。
前提条件
このチュートリアルを始める前に、次のものが必要です。
-
2つのCentOS 7ドロップレット。クラスターノードになります。 これらをwebnode01(IPアドレス:
`)およびwebnode02(IPアドレス: `
)と呼びます。 -
ルート権限を持つ両方のサーバー上のユーザー。 これは、https://www.digitalocean.com/community/tutorials/initial-server-setup-with-centos-7 [CentOS 7での初期サーバーセットアップ]チュートリアルに従って設定できます。
両方のサーバーでいくつかのコマンドを実行し、一方のみでいくつかのコマンドを実行する必要があります。
手順1-名前解決の構成
まず、両方のホストが2つのクラスターノードのホスト名を解決できることを確認する必要があります。 それを達成するために、 `+ / etc / hosts +`ファイルにエントリを追加します。 webnode01とwebnode02の両方でこの手順を実行します。
`+ nano `またはお好みのテキストエディターで ` / etc / hosts +`を開きます。
sudo nano /etc/hosts
ファイルの最後に次のエントリを追加します。
/ etc / hosts
webnode01.example.com webnode01
webnode02.example.com webnode02
ファイルを保存して閉じます。
ステップ2-Apacheのインストール
このセクションでは、Apache Webサーバーをインストールします。 両方のホストでこの手順を完了する必要があります。
まず、Apacheをインストールします。
sudo yum install httpd
Apacheリソースエージェントは、Apacheサーバーステータスページを使用して、Apacheサービスの状態を確認します。 ファイル `+ / etc / httpd / conf.d / status.conf +`を作成してステータスページをアクティブ化する必要があります。
sudo nano /etc/httpd/conf.d/status.conf
このファイルに次のディレクティブを貼り付けます。 これらのディレクティブにより、ローカルホストからステータスページにアクセスできますが、他のホストからはアクセスできません。
/etc/httpd/conf.d/status.conf
<Location /server-status>
SetHandler server-status
Order Deny,Allow
Deny from all
Allow from 127.0.0.1
</Location>
ファイルを保存して閉じます。
ステップ3-Pacemakerのインストール
次に、Pacemakerスタックをインストールします。 両方のホストでこの手順を完了する必要があります。
Pacemakerスタックとpcsクラスターシェルをインストールします。 後者を使用して、クラスターを構成します。
sudo yum install pacemaker pcs
次に、ノード間でCorosync設定を同期するために使用されるpcsデーモンを起動する必要があります。
sudo systemctl start pcsd.service
再起動のたびにデーモンが開始されるように、サービスも有効にします。
sudo systemctl enable pcsd.service
これらのパッケージをインストールすると、システムに* hacluster *という新しいユーザーが作成されます。 インストール後、このユーザーのリモートログインは無効になります。 構成の同期や他のノードでのサービスの開始などのタスクでは、このユーザーに同じパスワードを設定する必要があります。
sudo passwd hacluster
ステップ4-Pacemakerの構成
次に、FirewallDのクラスタートラフィックを許可して、ホストが通信できるようにします。
最初に、FirewallDが実行されているかどうかを確認します。
sudo firewall-cmd --state
実行されていない場合は、起動します。
sudo systemctl start firewalld.service
両方のホストでこれを行う必要があります。 実行したら、 `+ high-availability +`サービスをFirewallDに追加します。
sudo firewall-cmd --permanent --add-service=high-availability
この変更後、FirewallDをリロードする必要があります。
sudo firewall-cmd --reload
FirewallDの詳細については、https://www.digitalocean.com/community/tutorials/how-to-configure-firewalld-to-protect-your-centos-7-server [方法に関するガイド]をご覧ください。 CentOS 7でFirewallDを構成する]。
2つのホストが相互に通信できるようになったので、1つのホスト(この場合は* webnode01 *)でこのコマンドを実行して、2つのノード間の認証を設定できます。
sudo pcs cluster auth webnode01 webnode02
Username:
次のような出力が表示されるはずです。
出力
webnode01: Authorized
webnode02: Authorized
次に、同じホストでCorosync設定を生成して同期します。 ここでは、クラスターに* webcluster *という名前を付けますが、好きな名前を付けることができます。
sudo pcs cluster setup --name webnode01 webnode02
次の出力が表示されます。
出力
Shutting down pacemaker/corosync services...
Redirecting to /bin/systemctl stop pacemaker.service
Redirecting to /bin/systemctl stop corosync.service
Killing any remaining services...
Removing all cluster configuration files...
webnode01: Succeeded
webnode02: Succeeded
これでcorosync構成が作成され、すべてのノードに分散されました。 設定はファイル `+ / etc / corosync / corosync.conf +`に保存されます。
ステップ5-クラスターの開始
webnode01で次のコマンドを実行すると、クラスターを開始できます。
sudo pcs cluster start --all
Pacemakerとcorosyncが起動時に確実に開始されるようにするには、両方のホストでサービスを有効にする必要があります。
sudo systemctl enable corosync.service
sudo systemctl enable pacemaker.service
これで、いずれかのホストで次のコマンドを実行して、クラスターのステータスを確認できます。
sudo pcs status
出力で両方のホストがオンラインとしてマークされていることを確認します。
出力
. . .
Online: [ webnode01 webnode02 ]
Full list of resources:
PCSD Status:
webnode01: Online
webnode02: Online
Daemon Status:
corosync: active/enabled
pacemaker: active/enabled
pcsd: active/enabled
手順6-STONITHの無効化とクォーラムの無視
STONITHとは何ですか?
STONITHデバイスが設定されておらず、STONITHが無効になっていないという警告が「+ pcs status +」の出力に表示されます。
警告
. . .
WARNING: no stonith devices and stonith-enabled is not false
. . .
これはどういう意味ですか、なぜ気にする必要がありますか?
クラスターリソースマネージャーがノードまたはノード上のリソースの状態を判断できない場合、_fencing_を使用してクラスターを既知の状態に再び戻します。
_リソースレベルのフェンシング_は、主に、リソースを構成することにより、停電の場合にデータが破損しないようにします。 たとえば、DRBD(Distributed Replicated Block Device)とリソースレベルのフェンシングを使用して、通信リンクがダウンしたときにノード上のディスクを古くなったものとしてマークできます。
_Nodeレベルのフェンシング_は、ノードがリソースを実行しないようにします。 これは、ノードをリセットすることで実行され、Pacemakerの実装はSTONITHと呼ばれます(これは「頭のもう一方のノードを撮影する」を意味します)。 Pacemakerは、さまざまなフェンシングデバイスをサポートしています。 サーバー用の無停電電源装置または管理インターフェースカード。
ノードレベルのフェンシング設定は環境に大きく依存するため、このチュートリアルでは無効にします。
sudo pcs property set stonith-enabled=false
クォーラムとは何ですか?
ノードの半分以上がオンラインの場合、クラスターには_quorum_があります。 Pacemakerのデフォルトの動作は、クラスターにクォーラムがない場合、すべてのリソースを停止することです。 ただし、これは2ノードクラスタでは意味がありません。 1つのノードに障害が発生すると、クラスターはクォーラムを失います。
このチュートリアルでは、 `+ no-quorum-policy +`を設定してPacemakerにクォーラムを無視するように指示します。
sudo pcs property set no-quorum-policy=ignore
ステップ7-仮想IPアドレスの構成
これから、 `+ pcs +`シェルを介してクラスターと対話するため、すべてのコマンドは1つのホストでのみ実行する必要があります。どちらでもかまいません。
これでPacemakerクラスターが稼働し、最初のリソース(仮想IPアドレス)を追加できます。 これを行うために、 `+ ocf:heartbeat:IPaddr2 +`リソースエージェントを設定しますが、最初にいくつかの用語について説明します。
すべてのリソースエージェント名には、コロンで区切られた3つまたは2つのフィールドがあります。
-
最初のフィールドはリソースクラスであり、リソースエージェントが準拠する標準です。 また、Pacemakerにスクリプトの場所を伝えます。 `+ IPaddr2 +`リソースエージェントは、OCF(Open Cluster Framework)標準に準拠しています。
-
2番目のフィールドは標準に依存します。 OCFリソースは、OCF名前空間の2番目のフィールドを使用します。
-
3番目のフィールドは、リソースエージェントの名前です。
リソースには、_meta-attributes_および_instance attributes_を含めることができます。 メタ属性はリソースタイプに依存しません。インスタンス属性はリソースエージェント固有です。 このリソースエージェントの唯一の必須インスタンス属性は「+ ip 」(仮想IPアドレス)ですが、明示のために「 cidr_netmask +」(CIDR表記のサブネットマスク)も設定します。
_リソース操作_は、クラスターがリソースに対して実行できるアクションです(例: 開始、停止、監視)。 それらはキーワード「+ op 」で示されます。 リソースがまだ正常かどうかクラスターが20秒ごとにチェックするように、20秒間隔で「 monitor +」操作を追加します。 健康とみなされるものは、リソースエージェントによって異なります。
最初に、仮想IPアドレスリソースを作成します。 ここでは、仮想IPとして「127.0.0.2」を使用し、リソースの名前として* Cluster_VIP *を使用します。
sudo pcs resource create Cluster_VIP ocf:heartbeat:IPaddr2 ip= cidr_netmask=24 op monitor interval=20s
次に、リソースのステータスを確認します。
sudo pcs status
出力で次の行を探します。
出力
...
Full list of resources:
Cluster_VIP (ocf::heartbeat:IPaddr2): Started webnode01
...
仮想IPアドレスは、ホストwebnode01でアクティブです。
ステップ8-Apacheリソースの追加
これで、2番目のリソースをクラスターに追加できます。これがApacheサービスになります。 サービスのリソースエージェントは `+ ocf:heartbeat:apache`です。
リソースに「+ WebServer 」という名前を付け、インスタンス属性「 configfile 」(Apache設定ファイルの場所)と「 statusurl +」(ApacheサーバーステータスページのURL)を設定します。 再び20秒の監視間隔を選択します。
sudo pcs resource create WebServer ocf:heartbeat:apache configfile=/etc/httpd/conf/httpd.conf statusurl="http://127.0.0.1/server-status" op monitor interval=20s
以前と同様にリソースのステータスを照会できます。
sudo pcs status
webnode02で実行されている出力に* WebServer *が表示されます。
出力
...
Full list of resources:
Cluster_VIP (ocf::heartbeat:IPaddr2): Started webnode01
WebServer (ocf::heartbeat:apache): Started webnode02
...
ご覧のとおり、リソースは異なるホストで実行されます。 これらのリソースは同じホストで実行する必要があることをPacemakerにまだ伝えていないため、ノード間で均等に分散されます。
ステップ9-コロケーション制約の構成
リソースの実行場所の選択など、Pacemakerクラスターのほぼすべての決定は、スコアを比較することによって行われます。 スコアはリソースごとに計算され、クラスターリソースマネージャーは特定のリソースのスコアが最も高いノードを選択します。 (ノードのリソースのスコアが負の場合、リソースはそのノードで実行できません。)
クラスターの決定を制約付きで操作できます。 制約にはスコアがあります。 制約のスコアがINFINITYより低い場合、それは推奨事項にすぎません。 INFINITYのスコアは、必須であることを意味します。
両方のリソースが同じホストで実行されるようにするため、スコアがINFINITYのコロケーション制約を定義します。
sudo pcs constraint colocation add WebServer Cluster_VIP INFINITY
制約定義内のリソースの順序は重要です。 ここでは、Apacheリソース( + WebServer +
)が仮想IP( + Cluster_VIP +
)がアクティブになっている同じホスト上で実行する必要があることを指定します。 これはまた、「+ Cluster_VIP 」がアクティブでない場合、「 WebSite +」はどこでも実行できないことを意味します。
また、順序の制約を作成してリソースを実行する順序を定義したり、場所の制約を作成して一部のリソースに特定のホストを優先したりすることもできます。
両方のリソースが同じホストで実行されることを確認します。
sudo pcs status
出力
...
Full list of resources:
Cluster_VIP (ocf::heartbeat:IPaddr2): Started webnode01
WebServer (ocf::heartbeat:apache): Started webnode01
...
両方のリソースがwebnode01にあります。
結論
仮想IPアドレスでアクセス可能なApache 2ノードのアクティブ/パッシブクラスターをセットアップしました。 これでApacheをさらに構成できますが、ホスト間で構成を必ず同期してください。 このためのカスタムスクリプトを作成できます(例: (+ rsync + `)またはhttp://oss.linbit.com/csync2/[csync2]のようなものを使用できます。
Webアプリケーションのファイルをホスト間で配布する場合は、DRBDボリュームとhttps://drbd.linbit.com/users-guide/ch-pacemaker.html[Pacemakerと統合]をセットアップできます。