管理サーバ構築 2(Pacemaker、NFS Server)

3層Webシステム

クラスタ構成概要

管理サーバにPacemakerをインストールしてH/Aクラスタを構成し、そのクラスタ上にNFSサーバを構築します。

クラスタ・ノード間の通信は専用ネットワークを用意してこれをメインに、本番サイト管理用ネットワークをバックアップに充てた複数リンクで構成します。また、クラスタ環境のフェンシングにはNFS共有ディスクに対してfence_scsiエージェントを構成します。

【NFSクライアント公開ディレクトリ】

ディレクトリ用途クライアント側権限クライアント
/nfsdisk/exports/media各種インストール・メディア格納用read only本番サイト・全サーバ
/nfsdisk/exports/work作業用read/write本番サイト・全サーバ
/nfsdisk/exports/dbDBバックアップ/アーカイブ用read/writeDBサーバ#1,#2,#3

Pacemakerインストール

事前準備

クラスタ・ノード間通信用ネットワーク追加

管理サーバ#1、管理サーバ#2にネットワーク・アダプタを追加します。追加アダプタ及びN/Wインターフェースの設定値は以下の通りです。

【仮想マシン・ネットワーク・アダプタ設定】

設定項目ポートグループ
ネットワーク アダプタ 2Production MG Prv Network

【N/Wインターフェース・IPアドレス】

デバイス名管理サーバ#1(prsmg01)管理サーバ#2(prsmg02)
ens22410.10.10.1/2410.10.10.2/24

ネットワーク・アダプタ追加

NFS共有ディスク追加

管理サーバ#1、管理サーバ#2にディスク共有用のSCSIコントローラと共有ディスクを追加します。新規ハードディスクの設定値は以下の通りです。

設定項目サイズ場所コントローラの場所
ハードディスク 2100 GB[datastore1] storage/prsmg/disk001.vmdkSCSI Controller 1  SCSI(1:0)

ハードディスク追加(共有ディスク)

管理サーバ#1、管理サーバ#2でlsblkを実行して/dev/sdb(100 GB)が追加されたことを確認します。

【prsmg01、prsmg02で実行】
-----------------------------------------------------------------------------
lsblk

-----------------------------------------------------------------------------
【lsbln実行結果】
-----------------------------------------------------------------------------
[root@prsmg01 ~]# lsblk
NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINTS
sda 8:0 0 100G 0 disk
tqsda1
| 8:1 0 1G 0 part /boot
Lda2
| 8:2 0 99G 0 part
-root_vg-root
| 253:0 0 65G 0 lvm /var/named/chroot/usr/lib64/named
| /var/named/chroot/usr/lib64/bind
| /var/named/chroot/etc/named
| /var/named/chroot/etc/services
| /var/named/chroot/etc/protocols
| /var/named/chroot/etc/crypto-policies/back-ends/bind.config
| /var/named/chroot/etc/rndc.key
| /var/named/chroot/etc/named.rfc1912.zones
| /var/named/chroot/etc/named.conf
| /var/named/chroot/etc/named.root.key
| /var/named/chroot/etc/localtime
| /
-root_vg-swap
| 253:1 0 4G 0 lvm [SWAP]
Lroot_vg-var
253:2 0 30G 0 lvm /var/named/chroot/var/named
/var
sdb 8:16 0 100G 0 disk
sr0 11:0 1 11G 0 rom /mnt/cdrom
[root@prsmg01 ~]#

Pacemakerインストール

インストールメディア(DVD)を使用したローカルリポジトリは既に作成していますがクラスタ関連パッケージはDVDに含まれていないためRed Hat High Availability チャンネルからインストールする必要があります。

管理サーバ#1、管理サーバ#2を直接Red Hat High Availability チャンネルに接続してクラスタ関連パッケージをインストールしてもいいのですが、インターネットに接続できない環境への応用も考えて管理サーバ#1でRed Hat High Availability チャンネルからパッケージをダウンロード、リポジトリ化して両方の管理サーバにインストールします。

管理サーバ#1 Pacemakerインストール

経路情報追加

インターネットへのゲートウェイとなっている物理ルータに管理サーバ#1の経路情報を追加します。

宛先アドレスサブネットマスクゲートウェイ
172.16.10.11255.255.255.255192.168.11.200
Red Hatへのping疎通確認
【prsmg01で実行】
-----------------------------------------------------------------------------
nslookup www.redhat.com
ping -c 2 www.redhat.com
Red Hatへのシステム登録
【prsmg01で実行】
-----------------------------------------------------------------------------
subscription-manager register

-----------------------------------------------------------------------------
【実行結果】
-----------------------------------------------------------------------------
[root@prsmg01 ~]# subscription-manager register
登録中: subscription.rhsm.redhat.com:443/subscription
ユーザー名: <Reh HatユーザID>
パスワード:
このシステムは、次の ID で登録されました:
登録したシステム名: prsmg01.exsample.lan
[root@prsmg01 ~]#
クラスタ関連パッケージ・ダウンロード
【prsmg01で実行】
-----------------------------------------------------------------------------
# インストールメディア(DVD)をマウント
dvdmount

# ダウンロード用ディレクトリ作成
mkdir /tmp/highavailability/

# リポジトリ・ディレクトリ作成
mkdir /root/highavailability/

# クラスタ関連パッケージをダウンロード(fence-agents-allまで1行で記述)
dnf -y install --enablerepo=rhel-9-for-x86_64-highavailability-rpms --downloadonly --destdir=/tmp/highavailability pacemaker pcs fence-agents-all

# ダウンロード・パッケージ数確認
ls /tmp/highavailability | wc -l
→ 管理サーバのインストール構成であれば82

# ダウンロード・ディレクトリのパッケージをリポジトリ・ディレクトリにコピー
cp /tmp/highavailability/* /root/highavailability/

# ダウンロードしたパッケージ数とリポジトリ・ディレクトリのパッケージ数が一致することを確認
ls /root/highavailability/ | wc -l
クラスタ用リポジトリ作成
【prsmg01で実行】
-----------------------------------------------------------------------------
# createrepo_cパッケージ・インストール
dnf -y install createrepo_c

# クラスタ用リポジトリ作成
createrepo_c --repo RHEL-HA --database /root/highavailability

# クラスタ用repoファイル作成
cat > /etc/yum.repos.d/RHEL-HA.repo <<EOF
[RHEL-HA]
name=RHEL highavailability packages
baseurl=file:///root/highavailability
gpgcheck=0
enabled=1
EOF

# リポジトリ・リストを出力
dnf repolist
→ RHEL-HAが含まれていることを確認

# リポジトリRHEL-HAに含まれるパッケージを出力
dnf repo-pkgs RHEL-HA list
→ 82パッケージが出力されることを確認
クラスタ用関連パッケージ・インストール
【prsmg01で実行】
-----------------------------------------------------------------------------
# クラスタ関連パッケージ・インストール
dnf -y install --disablerepo=* --enablerepo=RHEL-HA pacemaker pcs fence-agents-all
クラスタ用リポジトリ転送(管理サーバ#1 → 管理サーバ#2)
【rosmg01で実行】
-----------------------------------------------------------------------------
# クラスタ用リポジトリとrepoファイルを管理サーバ#2に転送
scp -r /root/highavailability/ prsmg02:/root/
scp /etc/yum.repos.d/RHEL-HA.repo prsmg02:/etc/yum.repos.d/
システム登録解除
【rosmg01で実行】
-----------------------------------------------------------------------------
subscription-manager unregister
経路情報削除

物理ルータに登録した管理サーバ#1の経路情報を削除します。

管理サーバ#2 パッケージインストール

理サーバ#1へのパッケージインストールが完了したら管理サーバ#2でインストールを行います。

【prsmg02で実行】
-----------------------------------------------------------------------------
# インストール・メディア(DVD)マウント
dvdmount

# 管理サーバ#1と合わせるためcreaterepo_cインストール
dnf -y install createrepo_c

# クラスタ関連パッケージ・インストール
dnf -y install --disablerepo=* --enablerepo=RHEL-HA pacemaker pcs fence-agents-all

クラスタ構築

事前準備

管理サーバ#1、管理サーバ#2でクラスタ作成の準備を行います。

high-availabilityサービス追加

【prsmg01、prsmg02で実行】
-----------------------------------------------------------------------------
# firewallのサービス許可リストにhigh-availabilityサービスを追加
firewall-cmd --list-all
firewall-cmd --permanent --add-service=high-availability
firewall-cmd --reload
firewall-cmd --list-all

→ high-availabilityサービスが追加されたことを確認

haclusterユーザ・パスワード設定

【prsmg01、prsmg02で実行】
-----------------------------------------------------------------------------
# haclusterアカウントのパスワード設定(prsmg01、prsmg02で同じパスワードを設定)
passwd hacluster

/etc/lvm/lvm.conf 編集

【prsmg01、prsmg02で実行】
-----------------------------------------------------------------------------
# /etc/lvm/lvm.conf編集
vi /etc/lvm/lvm.conf


-----------------------------------------------------------------------------
編集内容
★2500行目近辺「 # system_id_source = "none"」の次行に「system_id_source = "uname"」を追加して保存
-----------------------------------------------------------------------------
# system_id_source = "none"
system_id_source = "uname"

# Configuration option global/system_id_file.
# The full path to the file containing a system ID.
# This is used when system_id_source is set to 'file'.
# Comments starting with the character # are ignored.
# This configuration option does not have a default value defined.
ーーーーーーーーーーーーーーーーーーーーーーーーーー

# lvm systemidとuname -nの結果が一致することを確認
lvm systemid
uname -n

pcsdサービス起動/自動起動設定

【prsmg01、prsmg02で実行】
-----------------------------------------------------------------------------
# pcsdサービス起動
systemctl start pcsd.service
# pcsdサービス自動起動設定
systemctl enable pcsd.service

NFS共有ディスク・マウント・ポイント作成

【prsmg01、prsmg02で実行】
-----------------------------------------------------------------------------
mkdir /nfsdisk

クラスタ構築

クラスタ構築は対象サーバの記述がない限り管理サーバ#1で実行します。

ノード認証/クラスタ作成

【prsmg01で実行】
-----------------------------------------------------------------------------
# クラスタ・ノード認証
pcs host auth prsmg01.exsample.lan prsmg02.exsample.lan
Username: hacluster
Password: <haclusterのパスワードを入力>


# 管理サーバ用クラスタ作成(1行で記述)
pcs cluster setup mg_cluster prsmg01.exsample.lan addr=10.10.10.1 addr=172.16.10.11 prsmg02.exsample.lan addr=10.10.10.2 addr=172.16.10.12

-----------------------------------------------------------------------------
補足
-----------------------------------------------------------------------------
mg_cluster:クラスタ名
prsmg01.exsample.lan :ノード1 サーバ
addr=10.10.10.1 :ノード1 link0 アドレス
addr=172.16.10.11 :ノード1 link1 アドレス
prsmg01.exsample.lan :ノード2 サーバ
addr=10.10.10.1 :ノード2 link0 アドレス
addr=172.16.10.11 :ノード2 link1 アドレス
各ノードで最初に指定したlink0 アドレスが優先度の高いリンクとしてクラスタ間の通信に使用されます。
(link0に障害が発生したときはlink1のリンクに切り替え)

オプションのlink_mode、link_priorityでモードや優先度の設定可能が可能です。

クラスタ起動

【prsmg01で実行】
-----------------------------------------------------------------------------
# 全ノードでクラスタ起動
pcs cluster start --all

# クラスタ状態確認
pcs cluster status
→ エラーが出力されていないことを確認。
→ クラスタ起動直後の「Node List」の各ノード状態は最初「UNCLEAN (offline)」だが少し時間を置くと「Online」に変化

# 全ノードでクラスタ自動起動有効化
pcs cluster enable --all

# 現在のクラスターとリソース状態表示
pcs status
→ 「Daemon Status」のDaemonがすべて「active/enabled」となっていることを確認

NFS共有ディスク・パーティション作成

【prsmg01で実行】
-----------------------------------------------------------------------------
parted /dev/sdb mklabel gpt unit % mkpart nfsdisk xfs 0 100
parted /dev/sdb p

NFS用論理ボリューム作成

【prsmg01で実行】
-----------------------------------------------------------------------------
# Physical Volume作成
pvcreate /dev/sdb1

# Volume Group作成
vgcreate --setautoactivation n nfs_vg /dev/sdb1

# systemid を追加してVolume Groupの情報を表示(nfs_vgが作成結果を確認)
vgs -o+systemid

# Logical Volume作成
lvcreate -l 100%FREE -n nfs_lv1 nfs_vg

# systemid を追加してVolume Groupの情報を表示(nfs_vgの未割当サイズを確認)
vgs -o+systemid

# Logical Volumeの情報表示(nfs_lv1の作成結果を確認)
lvs

# nfs_lv1にxfsファイルシステムを作成
mkfs.xfs /dev/nfs_vg/nfs_lv1

管理サーバ#2・保護対象ディスクへのデバイス追加

管理サーバ#2でlvmの管理対象へNFS共有ディスクを追加します。

【prsmg02で実行】
-----------------------------------------------------------------------------
lvmdevices --adddev /dev/sdb1

-----------------------------------------------------------------------------
補足
-----------------------------------------------------------------------------
lvmdevicesコマンドの実行で"No device found for /dev/sdb1."と返されてしまった場合は管理サーバ#2が/dev/sdb1を認識していない可能性があります。その場合はpartedで/dev/sdb1を認識させてから再度lvmdevicesを実行します。

# lsblkでパーティション/dev/sdb1が表示されるか確認
lsblk

# 表示されなかった場合はpartedでパーティション情報を表示して認識させる
parted /dev/sdb p

# もう一度lsblkでパーティション/dev/sdb1が表示されるか確認
lsblk

NFS用ディレクトリ作成

管理サーバ#1でnfs_lv1を一度マウントしてNFS用ディレクトリを作成します。

【prsmg01で実行】
-----------------------------------------------------------------------------
# /dev/nfs_vg/nfs_lv1アクティブ化
lvchange -ay /dev/nfs_vg/nfs_lv1

# /dev/nfs_vg/nfs_lv1を/nfsdataにマウント
mount /dev/nfs_vg/nfs_lv1 /nfsdisk

# NFS用ディレクトリ作成
mkdir -p /nfsdisk/exports/media
mkdir -p /nfsdisk/exports/work
mkdir -p /nfsdisk/exports/db
mkdir /nfsdisk/nfsinfo

# /dev/nfs_vg/nfs_lv1マウント解除
umount /nfsdisk

# /dev/nfs_vg/nfs_lv1非アクティブ化
vgchange -an nfs_vg

fwence_scsiエージェント構成

NFS共有ディスク・デバイス(/dev/sdb)のWWNを調べます。

【prsmg01で実行】
-----------------------------------------------------------------------------
ls -l /dev/disk/by-id | grep sdb | grep wwn

-----------------------------------------------------------------------------
【実行結果】
-----------------------------------------------------------------------------
[root@prsmg01 ~]# ls -l /dev/disk/by-id | grep sdb | grep wwn
lrwxrwxrwx 1 root root 9 4月 22 13:25 wwn-0x6000c290508961023c70453117d62910 -> ../../sdb
lrwxrwxrwx 1 root root 10 4月 22 15:30 wwn-0x6000c290508961023c70453117d62910-part1 -> ../../sdb1
[root@prsmg01 ~]#

/dev/sdbのWWNを指定してfwence_scsiエージェントを構成します。

【prsmg01で実行】
-----------------------------------------------------------------------------
# fence_scsiエージェント作成(1行で記述)
pcs stonith create scsi-shooter fence_scsi pcmk_host_list="prsmg01.exsample.lan prsmg02.exsample.lan" devices=/dev/disk/by-id/wwn-0x6000c290508961023c70453117d62910 meta provides=unfencing

# fence_scsiエージェント構成
pcs stonith config scsi-shooter

pcs status
→ scsi-shooterリソースが追加され状態が「Started」となっていることを確認

クラスタ・リソース作成 (LVM有効化~NFS共有ルート)

【prsmg01で実行】
-----------------------------------------------------------------------------
# LVM化有効リソース作成
pcs resource create nfs_lvm ocf:heartbeat:LVM-activate vgname=nfs_vg vg_access_mode=system_id --group nfsgroup

pcs status
→ nfs_lvmリソースが作成され状態が「Started」となっていることを確認

# ファイルシステム・リソース作成
pcs resource create nfsshare Filesystem device=/dev/nfs_vg/nfs_lv1 directory=/nfsdisk fstype=xfs --group nfsgroup

pcs status
→ nfsshareリソースが作成され状態が「Started」となっていることを確認

# NFSデーモン・リソース作成
pcs resource create nfs-daemon nfsserver nfs_shared_infodir=/nfsdisk/nfsinfo nfs_no_notify=true --group nfsgroup

pcs status
→ nfs-daemonリソースが作成され状態が「Started」となっていることを確認

# NFS共有ルートとなるexportfsリソースを作成(1行で記述)
pcs resource create nfs-root exportfs clientspec=172.16.10.0/255.255.255.0 options=rw,sync,no_root_squash directory=/nfsdisk/exports fsid=0 --group nfsgroup

pcs status

→ nfs-rootリソースが作成され状態が「Started」となっていることを確認

リソース配置・優先ノード設定

作成した順序に従って各リソースの起動ノードはfanceエージェントがprsmg01、nfsgroupの各リソースとなっています。リソースの作成はまだ続きますが、この時点で優先ノードを設定してリソースの起動ノードを入れ替えます。

【prsmg01で実行】
-----------------------------------------------------------------------------
# リソース配置・優先ノード設定
pcs constraint location nfsgroup prefers prsmg01.exsample.lan=INFINITY
pcs constraint location scsi-shooter prefers prsmg02.exsample.lan=INFINITY

pcs status
→ scsi-shooterリソースがprsmg02.exsample.lan、nfsgroupに属する各リソースがprsmg01.exsample.lanで起動していることを確認

クラスタ・リソース作成 (NFS共有リソース)

NFSクライアントに提供する共有ディレクトリごとにexportfsリソースを追加します。DBバックアップで使用する共有ディレクトリは3台のDBサーバのみアクセスを許可するように、それぞれのサーバごとにexportfsリソースを用意します。

【prsmg01で実行】
-----------------------------------------------------------------------------
# メディア用ディレクトリのexportfsリソースを作成(1行で記述)
pcs resource create nfs-export1 exportfs clientspec=172.16.10.0/24 options=ro,sync,no_root_squash directory=/nfsdisk/exports/media fsid=1 --group nfsgroup

pcs status
→ nfs-export1リソースの追加を確認

# 作業用ディレクトリのexportfsリソースを作成(1行で記述)
pcs resource create nfs-export2 exportfs clientspec=172.16.10.0/24 options=rw,sync,no_root_squash directory=/nfsdisk/exports/work fsid=2 --group nfsgroup

pcs status
→ nfs-export2リソースの追加を確認

# DBサーバ#1・DBバックアップ用ディレクトリのexportfsリソースを作成(1行で記述)
pcs resource create nfs-db01 exportfs clientspec=172.16.10.21 options=rw,sync,no_root_squash directory=/nfsdisk/exports/db fsid=3 --group nfsgroup

# DBサーバ#2・DBバックアップ用ディレクトリのexportfsリソースを作成(1行で記述)
pcs resource create nfs-db02 exportfs clientspec=172.16.10.22 options=rw,sync,no_root_squash directory=/nfsdisk/exports/db fsid=3 --group nfsgroup

# DBサーバ#3・DBバックアップ用ディレクトリのexportfsリソースを作成(1行で記述)
pcs resource create nfs-db03 exportfs clientspec=172.16.10.23 options=rw,sync,no_root_squash directory=/nfsdisk/exports/db fsid=3 --group nfsgroup

pcs status
→ nfs-db01、nfs-db02、nfs-db03リソースの追加を確認

クラスタ・リソース作成(仮想IPアドレス/NFS通知サービス)

NFS接続用のクラスタ仮想IPアドレスとNFS通知サービスを追加します。

【prsmg01で実行】
-----------------------------------------------------------------------------
# クラスタ仮想IPアドレス・リソース作成
pcs resource create nfs_ip IPaddr2 ip=172.16.10.10 cidr_netmask=24 --group nfsgroup

# NFS通知サービス・リソース作成
pcs resource create nfs-notify nfsnotify source_host=172.16.10.10 --group nfsgroup


pcs status

→ nfs_ip、nfs-notifyリソースの追加を確認

ping -c 2 172.16.10.10
→ クラスタ仮想IPアドレスにping疎通できることを確認

自動フェイルバック抑止設定

リソースの作成時のメタ属性resource-stickinessはデフォルトの値が小さく、優先ノード指定による場所の制約スコアが大きい(INFINITY)ため、管理サーバ#1の停止で管理サーバ#2にフェイルオーバーしたnfsgroupのリソースは管理サーバ#1が起動したタイミングで自動的にフェイルバックしてしまいます。これを回避するためnfsgroupのメタ属性resource-stickinessにINFINITYを設定します。

【prsmg01で実行】
-----------------------------------------------------------------------------
pcs resource meta nfsgroup resource-stickiness="INFINITY"

これでクラスタリソースの設定は終了です。管理サーバ#1を停止してのフェイルオーバー動作、自動フェイルバックの抑止、リソースの手動移動を確認します。

なお、サービスに直接関係しないscsi-shooterはメタ属性を設定していないため、管理サーバ#1にフェイルオーバーした場合は管理サーバ#2がクラスタに復帰すると自動的にフェイルバックします。

【prsmg01またはprsmg02で実行】
-----------------------------------------------------------------------------
# nfsgroupの移動
pcs resource move nfsgroup

# scsi-shooterの移動(prsmg02→prsmg01)
pcs resource move-with-constraint scsi-shooter

# scsi-shooterの切り戻し(prsmg01→prsmg02)
pcs resource clear scsi-shooter

nfsサービス許可

最後に管理サーバ#1、管理サーバ#2のfirewalldサービス許可リストにnfsサービスを追加します。

【prsmg01、prsmg02で実行】
-----------------------------------------------------------------------------
firewall-cmd --list-services
firewall-cmd --add-service=nfs --permanent
firewall-cmd --reload
firewall-cmd --list-services

firewalldの設定が終われば管理サーバの構築は終了です。次はDBサーバを構築します。

コメント

タイトルとURLをコピーしました