見出し画像

PacemakerをEC2 by Cloudformationでやってみた

パブリッククラウドを利用していると冗長構成の組み方や細かい仕組みはほとんど意識することがありませんが、仕事柄HAクラスタ製品を利用して1から環境構築する必要がでてきました。

勉強のため、まずはPacemakerの動作確認環境をCloudformationを利用してAWS EC2上に構築しましたので、需要はほとんどないかと思いつつ手順を記したいと思います。

今回はやってみた記事なのですが、Cloudformationを使ってインフラ構築した部分以外は以下の記事をほぼほぼ参考にさせていただいてますので、Pacemakerに関わる詳細は以下を参考にしていただければと思います。

全体構成

画像1

・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で構築しようと思います。

よろしければサポートお願いします!頂いたサポート費は、執筆活動に使わせて頂きます。