CentOS7でPacemaker、Corosync、および予約済みIPを使用して高可用性セットアップを作成する方法
序章
Corosyncは、アプリケーション内に高可用性を実装するために使用されるオープンソースクラスターエンジンです。 一般にメッセージングレイヤーと呼ばれるCorosyncは、複製されたステートマシンを作成するためのクラスターメンバーシップとクローズドコミュニケーションモデルを提供し、その上でPacemakerなどのクラスターリソースマネージャーを実行できます。 Corosyncは、クラスターノードを相互に接続する基盤となるシステムと見なすことができますが、Pacemakerはクラスターを監視し、障害が発生した場合にアクションを実行します。
このチュートリアルでは、CorosyncとPacemakerを使用して、CentOS 7サーバーと予約済みIPを備えたDigitalOceanで高可用性(HA)インフラストラクチャを作成する方法を示します。 クラスターノードのセットアップと管理のプロセスを容易にするために、CorosyncとPacemakerの両方と対話するコマンドラインインターフェイスであるPCSを使用します。 ##前提条件
このガイドに従うには、次のものが必要です。
- プライベートネットワークが有効になっている、同じデータセンターにある2つのCentOS7ドロップレット
- ルート以外のsudoユーザー。初期サーバーセットアップチュートリアルに従ってセットアップできます。
- チュートリアルDigitalOceanAPIV2の使用方法に従って生成できるDigitalOceanAPIへのパーソナルアクセストークン
これらのドロップレットを作成するときは、説明的なホスト名を使用してそれらを一意に識別します。 このチュートリアルでは、これらのドロップレットをprimaryおよびsecondaryと呼びます。
先に進む準備ができたら、両方のサーバーにログインしていることを確認してください。 sudo
ユーザー。
##ステップ1—Nginxを設定する
処理を高速化するために、Nginxをインストールし、その特定のサーバーに関する情報を含む基本的なWebページを設定する単純なシェルスクリプトを使用します。 このようにして、予約済みIPセットアップで現在アクティブになっているサーバーを簡単に識別できます。 このスクリプトは、DigitalOceanのメタデータサービスを使用して、ドロップレットのIPアドレスとホスト名を取得します。
スクリプトを実行するには、両方のサーバーで次のコマンドを実行します。
- sudo curl -L -o install.sh http://do.co/nginx-centos
- sudo chmod +x install.sh
- sudo ./install.sh
スクリプトの実行が終了したら、ブラウザからパブリックIPアドレスを介していずれかのDropletにアクセスすると、Dropletのホスト名とIPアドレスを示す基本的なWebページが表示されます。
このチュートリアルの複雑さを軽減するために、クラスターノードとして単純なWebサーバーを使用します。 実稼働環境では、ノードは通常、冗長ロードバランサーとして機能するように構成されます。 ロードバランサーの詳細については、HAProxyの概要と負荷分散の概念ガイドをご覧ください。
##ステップ2—予約済みIPの作成と割り当て最初のステップは、予約済みIPを作成し、それをprimaryサーバーに割り当てることです。 DigitalOceanコントロールパネルで、トップメニューのネットワークをクリックし、次にサイドメニューの予約済みIPをクリックします。
次のようなページが表示されます。
プライマリサーバーを選択し、[予約済みIPの割り当て]ボタンをクリックします。 予約済みIPが割り当てられたら、ブラウザから予約済みIPアドレスにアクセスして、プライマリドロップレットに到達できることを確認します。
http://your_reserved_ip
プライマリドロップレットのインデックスページが表示されます。 ##ステップ3— IP再割り当てスクリプトの作成このステップでは、DigitalOceanAPIを使用して予約済みIPを別のドロップレットに再割り当てする方法を示します。 後で、クラスターがノードの1つで障害を検出したときに、このスクリプトを実行するようにPacemakerを構成します。
この例では、指定されたドロップレットに予約済みIPを割り当てるために、引数として予約済みIPアドレスとドロップレットIDを受け取る基本的なPythonスクリプトを使用します。 ドロップレットのIDは、メタデータサービスを使用してドロップレット自体から取得できます。
ダウンロードから始めましょう assign-ip
スクリプトとそれを実行可能にします。 スクリプトをダウンロードする前に、スクリプトの内容を確認してください。
次の2つのコマンドは、両方のサーバー(プライマリおよびセカンダリ)で実行する必要があります。
- sudo curl -L -o /usr/local/bin/assign-ip http://do.co/assign-ip
- sudo chmod +x /usr/local/bin/assign-ip
The assign-ip
スクリプトを実行するには、次の情報が必要です。
- 予約済みIP:スクリプトの最初の引数、割り当てられている予約済みIP
- ドロップレットID:スクリプトの2番目の引数、予約済みIPを割り当てる必要のあるドロップレットID
- DigitalOcean APIトークン:環境変数DO_TOKEN、読み取り/書き込みDigitalOceanパーソナルアクセストークンとして渡されます
### IP再割り当てスクリプトのテスト発生しているIP再割り当てを監視するために、次のコマンドを使用できます。 curl
各要求の間に1秒の間隔を置いて、ループ内の予約済みIPアドレスにアクセスするコマンド。
新しいローカル端末を開き、次のコマンドを実行します。reserved_IP_addressを実際の予約済みIPアドレスに置き換えてください。
- while true; do curl reserved_IP_address; sleep 1; done
このコマンドは、で中断されるまでアクティブな端末で実行され続けます CTRL+C
. 予約済みIPが現在割り当てられているサーバーによってホストされているWebページを取得するだけです。 出力は次のようになります。
OutputDroplet: primary, IP Address: primary_IP_address
Droplet: primary, IP Address: primary_IP_address
Droplet: primary, IP Address: primary_IP_address
...
それでは、を実行してみましょう assign-ip
予約済みIPをセカンダリドロップレットに再割り当てするスクリプト。 DigitalOceanのメタデータサービスを使用して現在のドロップレットIDを取得し、それをスクリプトの引数として使用します。 メタデータサービスからのドロップレットのIDの取得は、次の方法で実行できます。
- curl -s http://169.254.169.254/metadata/v1/id
どこ 169.254.169.254
はメタデータサービスによって使用される静的IPアドレスであるため、変更しないでください。 この情報は、Droplet自体からのみ入手できます。
スクリプトを実行する前に、DigitalOceanAPIトークンを含むDO_TOKEN環境変数を設定する必要があります。 セカンダリサーバーから次のコマンドを実行し、your_api_tokenをDigitalOceanAPIへの読み取り/書き込みパーソナルアクセストークンに置き換えることを忘れないでください。
- export DO_TOKEN=your_api_token
引き続きセカンダリサーバーで、 assign-ip
reserved_IP_address を予約済みIPアドレスに置き換えるスクリプト:
- assign-ip reserved_IP_address `curl -s http://169.254.169.254/metadata/v1/id`
OutputMoving IP address: in-progress
によって生成された出力を監視することによって curl
ローカル端末でコマンドを実行すると、予約済みIPが割り当てられたIPアドレスを変更し、数秒後にセカンダリドロップレットをポイントし始めます。
OutputDroplet: primary, IP Address: primary_IP_address
Droplet: primary, IP Address: primary_IP_address
Droplet: secondary, IP Address: secondary_IP_address
ブラウザから予約済みIPアドレスにアクセスすることもできます。 セカンダリドロップレット情報を表示するページが表示されます。 これは、再割り当てスクリプトが期待どおりに機能したことを意味します。
予約済みIPをプライマリサーバーに再割り当てするには、2ステップのプロセスを繰り返しますが、今回は primary ドロップレットから:
- export DO_TOKEN=your_api_token
- assign-ip reserved_IP_address `curl -s http://169.254.169.254/metadata/v1/id`
数秒後、予約済みIPがプライマリドロップレットを再び指しているはずです。 ##ステップ4— Corosync、Pacemaker、およびPCSをインストールする次のステップは、Corosync、Pacemaker、およびPCSをドロップレットにインストールすることです。 CorosyncはPacemakerに依存しているため、通常はPacemakerをインストールして、インストールするCorosyncのバージョンをシステムに決定させることをお勧めします。
両方のサーバーにソフトウェアパッケージをインストールします。
- sudo yum install pacemaker pcs
PCSユーティリティは、インストール中にhaclusterという名前の新しいシステムユーザーをパスワードを無効にして作成します。 両方のサーバーでこのユーザーのパスワードを定義する必要があります。 これにより、PCSは、複数のノードでCorosync構成を同期したり、クラスターを開始および停止したりするなどのタスクを実行できるようになります。
両方のサーバーで、次を実行します。
- passwd hacluster
両方のサーバーで同じパスワードを使用する必要があります。 次のステップでは、このパスワードを使用してクラスターを構成します。
ユーザーhaclusterには、アカウントに関連付けられた対話型シェルまたはホームディレクトリがありません。つまり、その資格情報を使用してサーバーにログインすることはできません。
##ステップ5—クラスターのセットアップ両方のサーバーにCorosync、Pacemaker、およびPCSがインストールされたので、クラスターをセットアップできます。 ### PCSの有効化と起動PCSデーモンを有効にして起動するには、両方のサーバーで次を実行します。
- sudo systemctl enable pcsd.service
- sudo systemctl start pcsd.service
###各ノードのプライベートネットワークIPアドレスの取得ネットワークのパフォーマンスとセキュリティを向上させるには、プライベートネットワークを使用してノードを接続する必要があります。 ドロップレットのプライベートネットワークIPアドレスを取得する最も簡単な方法は、メタデータサービスを使用することです。 各サーバーで、次のコマンドを実行します。
- curl http://169.254.169.254/metadata/v1/interfaces/private/0/ipv4/address && echo
このコマンドは、ログインしているドロップレットのプライベートネットワークIPアドレスを出力するだけです。 この情報は、DropletのページのDigitalOceanコントロールパネル(設定タブの下)にもあります。
次の手順のために、両方のドロップレットからプライベートネットワークのIPアドレスを収集します。 ###クラスターノードの認証ユーザー名haclusterと、手順3で定義したものと同じパスワードを使用してクラスターノードを認証します。 各ノードにプライベートネットワークのIPアドレスを指定する必要があります。 primary サーバーから、次のコマンドを実行します。
- sudo pcs cluster auth primary_private_IP_address secondary_private_IP_address
次のような出力が得られるはずです。
OutputUsername: hacluster
Password:
primary_private_IP_address: Authorized
secondary_private_IP_address: Authorized
###Corosync構成の生成primaryサーバー上で、次のコマンドを使用してCorosync構成ファイルを生成します。
- sudo pcs cluster setup --name webcluster \
- primary_private_IP_address secondary_private_IP_address
出力は次のようになります。
OutputShutting 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...
primary_private_IP_address: Succeeded
secondary_private_IP_address: Succeeded
Synchronizing pcsd certificates on nodes primary_private_IP_address, secondary_private_IP_address...
primary_private_IP_address: Success
secondary_private_IP_address: Success
Restaring pcsd on the nodes in order to reload the certificates...
primary_private_IP_address: Success
secondary_private_IP_address: Success
これにより、次の場所にある新しい構成ファイルが生成されます。 /etc/corosync/corosync.conf
に提供されたパラメータに基づく pcs cluster setup
指図。 この例では、クラスター名として webcluster を使用しましたが、任意の名前を使用できます。 ###クラスターの開始セットアップしたクラスターを開始するには、primaryサーバーから次のコマンドを実行します。
- sudo pcs cluster start --all
Outputprimary_private_IP_address: Starting Cluster...
secondary_private_IP_address: Starting Cluster...
これで、いずれかのサーバーで次のコマンドを実行することにより、両方のノードがクラスターに参加したことを確認できます。
- sudo pcs status corosync
OutputMembership information
----------------------
Nodeid Votes Name
2 1 secondary_private_IP_address
1 1 primary_private_IP_address (local)
クラスタの現在のステータスに関する詳細情報を取得するには、次のコマンドを実行できます。
- sudo pcs cluster status
出力は次のようになります。
OutputCluster Status:
Last updated: Fri Dec 11 11:59:09 2015 Last change: Fri Dec 11 11:59:00 2015 by hacluster via crmd on secondary
Stack: corosync
Current DC: secondary (version 1.1.13-a14efad) - partition with quorum
2 nodes and 0 resources configured
Online: [ primary secondary ]
PCSD Status:
primary (primary_private_IP_address): Online
secondary (secondary_private_IP_address): Online
今、あなたは有効にすることができます corosync
と pacemaker
システムの起動時に確実に起動するようにするサービス。 両方のサーバーで以下を実行します。
- sudo systemctl enable corosync.service
- sudo systemctl enable pacemaker.service
### STONITHの無効化STONITH(ヘッド内の他のノードを撃つ)は、応答しないがアプリケーションデータにアクセスしているクラスター内の障害のあるノードによって引き起こされるデータ破損を防ぐことを目的としたフェンシング手法です。 その構成は、このガイドの範囲外の多くの要因に依存するため、クラスターのセットアップでSTONITHを無効にします。
STONITHを無効にするには、プライマリまたはセカンダリのいずれかのドロップレットで次のコマンドを実行します。
- sudo pcs property set stonith-enabled=false
##ステップ6—予約済みのIP再割り当てリソースエージェントを作成するあとは、クラスターノードの1つで障害が検出されたときに、IP再割り当てスクリプトを実行するリソースエージェントを構成するだけです。 リソースエージェントは、クラスターとリソース自体の間のインターフェイスを作成する責任があります。 この場合、リソースはassign-ipスクリプトです。 クラスタは、開始、停止、または監視コマンドが与えられたときに、リソースエージェントに依存して適切な手順を実行します。 リソースエージェントにはさまざまな種類がありますが、最も一般的なのはOCF(Open Cluster Framework)標準です。
両方のサーバーでassign-ipサービスを管理するための新しいOCFリソースエージェントを作成します。
まず、リソースエージェントを含むディレクトリを作成します。 ディレクトリ名は、このカスタムエージェントの識別子としてPacemakerによって使用されます。 両方のサーバーで以下を実行します。
- sudo mkdir /usr/lib/ocf/resource.d/digitalocean
次に、FloatIPリソースエージェントスクリプトをダウンロードして、両方のサーバーの新しく作成されたディレクトリに配置します。
- sudo curl -L -o /usr/lib/ocf/resource.d/digitalocean/floatip http://do.co/ocf-floatip
次に、両方のサーバーで次のコマンドを使用してスクリプトを実行可能にします。
- sudo chmod +x /usr/lib/ocf/resource.d/digitalocean/floatip
PCSユーティリティを使用して、クラスタ内にリソースエージェントを登録する必要があります。 次のコマンドは、ノードの one から実行する必要があります( your_api_tokenをDigitalOceanAPIトークンに置き換え、 reserved_IP_addressを実際の予約済みIPアドレスに置き換えることを忘れないでください) )::
- sudo pcs resource create FloatIP ocf:digitalocean:floatip \
- params do_token=your_api_token \
- reserved_ip=reserved_IP_address
これで、リソースがクラスターに登録され、アクティブになります。 登録されているリソースは、どのノードからでも確認できます。 pcs status
指図:
- sudo pcs status
Output...
2 nodes and 1 resource configured
Online: [ primary secondary ]
Full list of resources:
FloatIP (ocf::digitalocean:floatip): Started primary
...
##ステップ7—フェイルオーバーのテストこれで、クラスターはノード障害を処理する準備ができているはずです。 フェイルオーバーをテストする簡単な方法は、予約済みIPセットアップで現在アクティブになっているサーバーを再起動することです。 このチュートリアルのすべての手順を実行した場合、これはプライマリサーバーである必要があります。
繰り返しになりますが、を使用してIPの再割り当てを監視しましょう。 curl
ループ内のコマンド。 ローカル端末から、次を実行します。
- while true; do curl reserved_IP_address; sleep 1; done
primary サーバーから、再起動コマンドを実行します。
- sudo reboot
しばらくすると、プライマリサーバーが使用できなくなります。 これにより、セカンダリサーバーがアクティブノードとして引き継がれます。 実行中のローカル端末でこれと同様の出力が表示されるはずです curl
:
Output...
Droplet: primary, IP Address: primary_IP_address
Droplet: primary, IP Address: primary_IP_address
curl: (7) Failed connect to reserved_IP_address; Connection refused
Droplet: secondary, IP Address: secondary_IP_address
Droplet: secondary, IP Address: secondary_IP_address
…
「接続が拒否されました」エラーは、IPの再割り当てが行われる直前または同時に要求が行われた場合に発生します。 出力に表示される場合と表示されない場合があります。
セカンダリノードでフェイルオーバーをテストしながら、予約済みIPをプライマリノードに戻す場合は、プロセスを繰り返しますが、今回はセカンダリドロップレットから:
- sudo reboot
##結論
このガイドでは、予約済みIPをCorosync、Pacemaker、およびPCSと一緒に使用して、CentOS7サーバー上に高可用性Webサーバー環境を作成する方法について説明しました。 予約済みIPの使用法を示すために、かなり単純なインフラストラクチャを使用しましたが、このセットアップは、アプリケーションスタックの任意のレベルで高可用性を実装するように拡張できます。