PacemakerをEC2 by Cloudformationでやってみた
パブリッククラウドを利用していると冗長構成の組み方や細かい仕組みはほとんど意識することがありませんが、仕事柄HAクラスタ製品を利用して1から環境構築する必要がでてきました。
勉強のため、まずはPacemakerの動作確認環境をCloudformationを利用してAWS EC2上に構築しましたので、需要はほとんどないかと思いつつ手順を記したいと思います。
今回はやってみた記事なのですが、Cloudformationを使ってインフラ構築した部分以外は以下の記事をほぼほぼ参考にさせていただいてますので、Pacemakerに関わる詳細は以下を参考にしていただければと思います。
全体構成
・EC2×2台
※OSはRHEL8.5 HA add on版を利用
・AWS CLIおよびシークレットキー設定済みのラップトップ環境(Windows Subsystem for Linux 2(ubuntu18.04))からCloudformationを実行
※今回は管理者権限をもつシークレットキーを利用したため、IAM周りの細かい権限説明はしません
Cloudformation解説
ソースコードは以下にあります
今回作成したテンプレートファイルについて簡単に説明します。
EC2の設定やSGの設定などのAWSリソース関連に関しては、以下の記事で記載したものと基本同じなので省略します。
主な変更点はEC2インスタンスリソース内のユーザデータ部分です。
構成図に示したIPアドレスでhostsファイルを設定し、後続で利用するパッケージをインストールします。RHEL8系からはパッケージ管理コマンドがyumの後継であるdnfの利用が推奨されています。
また、pacemakerで利用必須のフェンシング機能をAWS上で実現するため、fence-agentをインストールします。
UserData: !Base64 |
#!/bin/bash
# hostnameとhostsの設定
hostnamectl set-hostname ec2-pacemaker-1-cf
cat <<EOF | sudo tee -a /etc/hosts
10.5.10.11 ec2-pacemaker-1-cf
10.5.10.12 ec2-pacemaker-2-cf
10.5.10.13 ec2-pacemaker-vip-cf
EOF
# set JP timezone
timedatectl set-timezone Asia/Tokyo
# install
# inscall necessafy packages
dnf update -y
dnf install -y wget unzip
dnf install -y fence-agents-aws jq
SSMエージェントとaws-cliをインストールします。
aws-cliインストール後利用するデフォルトリージョンを設定しないと後続のPacemakerで使用するawsvipリソースの起動に失敗します。
# install and start SSM Agent
・・・
# install aws-cli
・・・
## pacemaker awsvipリソース用にシンボリックリング設定
ln -s /usr/local/bin/aws /usr/bin/aws
・・・
aws configure set region $REGION
pacemakerの設定を加えたのち、再起動します。
今回利用したAMIではPacemaker関連モジュールがプレインストールされていましたので、クラスタ管理サービス(pcsd)の自動起動有効化とクラスタ通信で利用するhaclusterユーザのパスワード設定のみ両ノードで実施しています。
# pacemaker setting
systemctl start pcsd.service
systemctl enable pcsd.service
# haclusterユーザのパスワード設定
/usr/bin/passwd hacluster<<EOF
HaPas_123
HaPas_123
EOF
# hostname設定のため再起動
shutdown -r now
Tags:
- Key: Name
Value: ec2-pacemaker-1-cf
EC2起動後のPacemaker設定作業
無事にEC2の構築が完了しましたら、EC2インスタンスにログインしてクラスタの設定をしていきます。
クラスタノードの認証設定 ★片方のノードでのみ実施
pcs host auth ec2-pacemaker-1-cf ec2-pacemaker-2-cf -u hacluster -p HaPas_123
クラスタの作成 ★上記コマンド実行したノードで
pcs cluster setup test-cluster ec2-pacemaker-1-cf ec2-pacemaker-2-cf
クラスタの有効化と起動 ★上記コマンド実行したノードで
pcs cluster enable --all
pcs cluster start --all
フェンシング設定
起動した2ノードでそれぞれ以下のコマンドを実行してインスタンスIDを取得し、片側のノードで以下の環境変数に代入
INSTANCE_ID1=[instance-id1]
INSTANCE_ID2=[instance-id2]
片側のノードで以下を実行
pcs stonith create clusterfence fence_aws region=ap-northeast-1 pcmk_host_map="ec2-pacemaker-1-cf:$INSTANCE_ID1;ec2-pacemaker-2-cf:$INSTANCE_ID2" power_timeout=240 pcmk_reboot_timeout=480 pcmk_reboot_retries=4
pacemaker resourceの作成
pcs resource create privip awsvip secondary_private_ip=10.5.10.13 --group networking-group
pcs resource create vip IPaddr2 ip=10.5.10.13 --group networking-group
※awsvipおよびIPaddr2はPacemaker標準添付のスクリプトです。
各スクリプトの利用方法は以下のコマンドで確認してください。
pcs resource describe awsvip
pcs resource describe Ipaddr2
ここまでで設定完了です。
以下のコマンドで2ノードともonlineかつ片側のノードでnetworking-groupリソースが起動していることを確認してください。
pcs status
動作確認
.11ノードのフェンシング
pcs stonith fence ec2-pacemaker-1-cf
→.11インスタンスが再起動されるはず
pcs status
.12ノードのフェールオーバー
pcs node standby ec2-pacemaker-2-cf
→.12ノードがstadby状態に
pcs node unstandby ec2-pacemaker-2-cf
→.12ノードがOnlineに
以上です。いかがでしたでしょうか。
今回の内容であればPacemakerが予め用意しているスクリプトを利用するだけで簡単にプライベートIPの付け替えを行うことができました。
ただ、今回の作業だけではPacemakerのパラメータ部分の理解が足りていないため、別途深堀が必要そうです。
次はPostgreSQLリソースをPacemakerに組み込むことで、DBのHAクラスタをAWSで構築しようと思います。
よろしければサポートお願いします!頂いたサポート費は、執筆活動に使わせて頂きます。