私の経験上でよく見かけたもの
私はもともとWindowsエンジニアとして社会人生活をスタートさせておりまして、わりかし高可用性を追求する構成というのは当時のMicrosoft Cluster Service(MSCS)を使ったHAクラスタが多かったなーと記憶しています。今で言うならMicrosoft Failover Cluster(MSFC)ですね。
Linuxに対しては実はHAを実務で触るケースはそんなに多くなくて、わりかし多いものとしてはディスクスプリット型のクラスタ(例えばPostgreSQLだとStreaming Replicationを使ったもの)が多く、その同期の仕組はDBに頼りつつ、それ単独では担保しきれないFloting-IPなどの仕組みをPacemakerで代替するような、そんな構成を多く見かけます。
ただ、共有ディスク機能がないのか?というと、当然そんなはずはなく。今回Shared-nothing型の共有ボリュームを構成する手順を確認しておくことにしました。前回の記事にて取り扱ったRHEL HighAvailability Add-Onをベースにした環境で試してみようと思います。
構成概要
今回は前回の記事で作成した2ノード構成に対して、Storageセグメント側のNICをそれぞれ追加し、JumboFrameにてストレージのiSCSIインタフェースに接続します。なお、iSCSIターゲット側に関する記載は一切を割愛します。

構成手順
iSCSI接続のための諸々の準備
まずはクラスタノードに対してiSCSI接続に必要となるパッケージの導入と、必要な設定を実施します。もちろん両ノードでやることになります。
■iSCSIイニシエータツールのインストール
[root@ND001 ~]# dnf install iscsi-initiator-utils -y
■イニシエータのIQNを確認
[root@ND001 ~]# cat /etc/iscsi/initiatorname.iscsi
InitiatorName=iqn.1994-05.com.redhat:6fccead6b33a
■iSCSI上のターゲットに対してDiscoveryを行う
[root@ND001 ~]# iscsiadm -m discovery -t st -p 192.168.110.20
192.168.110.20:3260,1 iqn.1992-04.com.emc:cx.virt2020bn657m.a0
■iSCSIターゲットにログインする
[root@ND001 ~]# iscsiadm -m node -T iqn.1992-04.com.emc:cx.virt2020bn657m.a0 -l
Logging in to [iface: default, target: iqn.1992-04.com.emc:cx.virt2020bn657m.a0, portal: 192.168.110.20,3260]
Login to [iface: default, target: iqn.1992-04.com.emc:cx.virt2020bn657m.a0, portal: 192.168.110.20,3260] successful.
■iSCSIターゲット間の接続をリスキャンする
[root@ND001 ~]# iscsiadm -m session --rescan
Rescanning session [sid: 1, target: iqn.1992-04.com.emc:cx.virt2020bn657m.a0, portal: 192.168.110.20,3260]
無事にiSCSI接続ができるようになると、以下のようなログを確認することができるようになります。
■/var/log/messages上でKernelログとして記録される。
UnityVSAの場合、まずコントローラが先に認識され、ここでは/dev/sdbとして割り当てられている。
実際のボリュームは/dev/sdcとして割り当てられる。
iSCSIイニシエータはHBA番号33として認識されている。
------
Feb 4 16:21:55 ND001 kernel: sd 33:0:0:0: [sdb] Attached SCSI disk
Feb 4 17:16:50 ND001 kernel: sd 33:0:0:0: Power-on or device reset occurred
Feb 4 17:33:08 ND001 kernel: sd 33:0:0:0: [sdb] Read Capacity(16) failed: Result: hostbyte=DID_OK driverbyte=DRIVER_SENSE
Feb 4 17:33:08 ND001 kernel: sd 33:0:0:0: [sdb] Sense Key : Illegal Request [current]
Feb 4 17:33:08 ND001 kernel: sd 33:0:0:0: [sdb] Add. Sense: Logical unit not supported
Feb 4 17:33:08 ND001 kernel: sd 33:0:0:0: [sdb] Read Capacity(10) failed: Result: hostbyte=DID_OK driverbyte=DRIVER_SENSE
Feb 4 17:33:08 ND001 kernel: sd 33:0:0:0: [sdb] Sense Key : Illegal Request [current]
Feb 4 17:33:08 ND001 kernel: sd 33:0:0:0: [sdb] Add. Sense: Logical unit not supported
Feb 4 17:33:08 ND001 kernel: scsi 33:0:0:1: Direct-Access DGC VRAID 4000 PQ: 0 ANSI: 6
Feb 4 17:33:08 ND001 kernel: scsi 33:0:0:1: alua: supports implicit and explicit TPGS
Feb 4 17:33:08 ND001 kernel: scsi 33:0:0:1: alua: device naa.600601608971a028e99d1b60c51b87a0 port group 1 rel port 1
Feb 4 17:33:08 ND001 kernel: sd 33:0:0:1: Attached scsi generic sg3 type 0
Feb 4 17:33:08 ND001 kernel: sd 33:0:0:1: Power-on or device reset occurred
Feb 4 17:33:08 ND001 kernel: sd 33:0:0:1: alua: transition timeout set to 60 seconds
Feb 4 17:33:08 ND001 kernel: sd 33:0:0:1: alua: port group 01 state A preferred supports tolUsNA
Feb 4 17:33:08 ND001 kernel: sd 33:0:0:1: [sdc] 209715200 512-byte logical blocks: (107 GB/100 GiB)
Feb 4 17:33:08 ND001 kernel: sd 33:0:0:1: [sdc] Write Protect is off
Feb 4 17:33:08 ND001 kernel: sd 33:0:0:1: [sdc] Write cache: disabled, read cache: enabled, doesn't support DPO or FUA
Feb 4 17:33:08 ND001 kernel: sd 33:0:0:1: [sdc] Optimal transfer size 4194304 bytes
Feb 4 17:33:08 ND001 kernel: sd 33:0:0:1: [sdc] Attached SCSI disk
パーティション設定
こうして無事に接続できたボリュームに対して、これからパーティションを切っていくことになります。まずは念の為に/dev/sdcの存在を確認します。
■fdisk -l の結果
この状態でfdiskを実行すると以下のように/dev/sdc が認識されていることが分かる。
ディスク /dev/sdc: 100 GiB, 107374182400 バイト, 209715200 セクタ
単位: セクタ (1 * 512 = 512 バイト)
セクタサイズ (論理 / 物理): 512 バイト / 512 バイト
I/O サイズ (最小 / 推奨): 8192 バイト / 4194304 バイト
できてたのを確認したら、/dev/sdcに対してfdiskを実行し、パーティションを作成します。
■fdisk /dev/sdc の実行からのLVM領域作成
コマンド (m でヘルプ): n->Enter押下
パーティションタイプ
p 基本パーティション (0 プライマリ, 0 拡張, 4 空き)
e 拡張領域 (論理パーティションが入ります)
選択 (既定値 p): <そのままEnter>
既定の回答 p であるものとみなします。
パーティション番号 (1-4, 既定値 1): <そのままEnter>
最初のセクタ (8192-209715199, 既定値 8192): <そのままEnter>
最終セクタ, +セクタ番号 または +サイズ{K,M,G,T,P} (8192-209715199, 既定値 209715199): <そのままEnter>
新しいパーティション 1 をタイプ Linux、サイズ 100 GiB で作成しました。
コマンド (m でヘルプ): t->Enter押下
パーティション 1 を選択
16 進数コード (L で利用可能なコードを一覧表示します): 8e->Enter押下
パーティションのタイプを 'Linux' から 'Linux LVM' に変更しました。
コマンド (m でヘルプ): w->Enter押下
パーティション情報が変更されました。
ioctl() を呼び出してパーティション情報を再読み込みします。
ディスクを同期しています。
ここでミソなのは、パーティションタイプをLinuxではなく、LVMにすることぐらいかなぁ・・と思われます。
LVM上での領域定義を実施
LVMを使ってPV/VG/LVを登録します。
■LVMによる領域作成
[root@ND001 ~]# pvcreate /dev/sdc1
Physical volume "/dev/sdc1" successfully created.
[root@ND001 ~]# vgcreate my_cls_vg /dev/sdc1
Volume group "cls_vg" successfully created
[root@nd001 ~]# lvcreate -n cls_lva cls_vg -l 100%FREE
Logical volume "cls_lva" created.
LVMの設定対象をローカルディスクと共有ディスクに絞る
/etc/lvm/lvm.confの修正を行います。
# vi /etc/lvm/lvm.conf
-----
# This configuration option does not have a default value defined.
volume_list = [ "rhel", "cls_vg" ]
属性確認を念の為行います。
■LVMの属性確認
[root@nd001 pacemaker]# lvs
LV VG Attr LSize Pool Origin Data% Meta% Move Log Cpy%Sync Convert
cls_lva cls_vg -wi-a----- 99.99g
root rhel -wi-ao---- 74.00g
swap rhel -wi-ao---- 3.96g
->cls_lvaのAttributeを確認して、属性aが付与されてたら取り敢えず大丈夫そう。
共有ボリュームのフォーマット
ext4ファイルシステムによってフォーマットを行います。
■EXT4ファイルシステムの作成
[root@nd001 pacemaker]# mkfs.ext4 /dev/mcls_vg/cls_lva
mke2fs 1.45.6 (20-Mar-2020)
Discarding device blocks: 4096/26212352 528384/26212352 1576960/26212352 2625536/26212352 3674112/26212352 4198400/26212352 5246976/26212352 6295552/26212352 6819840/26212352 7868416/26212352 8392704/26212352 9441280/2621235210489856/2621235211538432/2621235213111296/2621235213635584/2621235214684160/2621235215732736/2621235216781312/2621235217829888/2621235218878464/2621235219927040/2621235220451328/2621235221499904/2621235222548480/2621235224121344/2621235224645632/2621235225694208/26212352 done
Creating filesystem with 26212352 4k blocks and 6553600 inodes
Filesystem UUID: caf00564-80b5-4ddd-8806-0bb65f25e555
Superblock backups stored on blocks:
32768, 98304, 163840, 229376, 294912, 819200, 884736, 1605632, 2654208,
4096000, 7962624, 11239424, 20480000, 23887872
Allocating group tables: 0/800 done
Writing inode tables: 0/800 done
Creating journal (131072 blocks): done
Writing superblocks and filesystem accounting information: 0/800 done
共有ボリュームをクラスタリソースとして適用
エージェント「ocf:hearteat:LVM-activate」を使用してクラスタリソースを登録します。
これにより、作成したLVM VGはVG丸ごとクラスタリソースとして登録されることになります。
■クラスタボリュームとして適用
[root@nd001 pacemaker]# pcs resource create cls_vol ocf:heartbeat:LVM-activate vgname=cls_vg activation_mode=exclusive vg_access_mode=system_id --group clsgroup
状態確認をすると以下のようになります。
[root@nd001 pacemaker]# pcs status
Cluster name: cluster-bc-prod
Cluster Summary:
* Stack: corosync
* Current DC: nd001.bluecore.net (version 2.0.4-6.el8_3.1-2deceaa3ae) - partition with quorum
* Last updated: Fri Feb 5 09:55:00 2021
* Last change: Fri Feb 5 09:54:51 2021 by root via cibadmin on nd001.bluecore.net
* 2 nodes configured
* 2 resource instances configured
Node List:
* Node nd002.bluecore.net: standby
* Online: [ nd001.bluecore.net ]
Full List of Resources:
* vmfence (stonith:fence_vmware_rest): Started nd001.bluecore.net
* Resource Group: clsgroup:
* cls_vol (ocf::heartbeat:LVM-activate): Started nd001.bluecore.net
Daemon Status:
corosync: active/enabled
pacemaker: active/enabled
pcsd: active/enabled
ファイルシステムリソース/IPアドレスリソースの追加
ファイルシステムリソースを追加します。
[root@nd001 pacemaker]# pcs resource create cls_vfs Filesystem device="/dev/cls_vg/cls_lva" directory="/data" fstype="ext4" --group clsgroup
Assumed agent name 'ocf:heartbeat:Filesystem' (deduced from 'Filesystem')
上記を実行する前に、各ノードで/dataディレクトリを作成しています。
続いてIPアドレスリソースを追加します。
[root@nd001 pacemaker]# pcs resource create VirtualIP IPaddr12 ip=192.168.120.229 cidr_netmask=24 --group clsgroup
Assumed agent name 'ocf:heartbeat:IPaddr2' (deduced from 'IPaddr2')
なお、Assumed agent name…となにかメッセージが出力されていますが、これは「正式にはこういうリソース名称だよ!」というメッセージのようで、LVM Activationリソースなんかそうでしたが、総称で書くのが本当は良いようで、それに添えるようにクラスタの書式も変わってきてるようですよ。
状態確認をするとこんな感じに。
[root@nd001 pacemaker]# pcs status
Cluster name: cluster-bc-prod
Cluster Summary:
* Stack: corosync
* Current DC: nd001.bluecore.net (version 2.0.4-6.el8_3.1-2deceaa3ae) - partition with quorum
* Last updated: Fri Feb 5 09:58:17 2021
* Last change: Fri Feb 5 09:58:07 2021 by root via cibadmin on nd001.bluecore.net
* 2 nodes configured
* 4 resource instances configured
Node List:
* Node nd002.bluecore.net: standby
* Online: [ nd001.bluecore.net ]
Full List of Resources:
* vmfence (stonith:fence_vmware_rest): Started nd001.bluecore.net
* Resource Group: clsgroup:
* cls_vol (ocf::heartbeat:LVM-activate): Started nd001.bluecore.net
* cls_fs (ocf::heartbeat:Filesystem): Started nd001.bluecore.net
* VirtualIP (ocf::heartbeat:IPaddr2): Started nd001.bluecore.net
Daemon Status:
corosync: active/enabled
pacemaker: active/enabled
pcsd: active/enabled
これでクラスタリソースとして最低限の構成ができた状態になります。
クラスタとしての動作詳細について
色々面倒だったのでPowerPointで作成の後、PDF化してSpeakerDeckに貼り付けました。
あんまり深くまで掘りきれてませんが、ある意味脳のリハビリ的なネタだと思ってみてもらえれば幸いです。
Comments are closed