vSphere 6.7 U3 では、ネイティブな VMDK が SCSI-3 Persistent Reservation(SCSI-3 PR)対応になりました。
VMware vSAN 6.7 Update 3 リリース ノート
ネイティブ vSAN VMDK 上の Windows Server Failover Clusters (WSFC)。vSAN 6.7 Update 3 では SCSI-3 PR がネイティブにサポートされており、Windows Server Failover Clusters を最初のクラスのワークロードとして VMDK に直接デプロイできます。この機能を使用すると、物理 RDM のレガシー環境または外部ストレージ プロトコルを vSAN に移行できます。
vSAN 6.7 U2 以前でも、vSAN iSCSI ターゲット(VIT)による LUN を共有ディスクを利用することで
vSAN による仮想ディスク(VMDK)で SCSI-3 PR が利用でき、
WSFC(Windows Server Failover Clustering)のようなクラスタウェアの
排他制御のしくみで利用することができていました。
しかし 6.7 U3 以降では、VIT による LUN ではない(ネイティブな)VMDK(いわゆる 共有 VMDK)でも、WSFC などで利用可能とのことです。
これは下記のあたりが参考になります。
Configuring a shared disk resource for Windows Server Failover Cluster (WSFC)
and migrating SQL Server Failover Cluster Instance (FCI) from SAN (RDMs) to vSAN
https://kb.vmware.com/s/article/74786
Hosting Windows Server Failover Cluster (WSFC) with shared disk on VMware vSphere: Doing it right!
https://blogs.vmware.com/apps/2019/05/wsfc-on-vsphere.html
そこで今回は、vSAN 6.7 U2 と vSAN 6.7 U3 の環境で、Linux VM から SCSI-3 PR の様子を見てみました。
今回の vSAN 環境。
vCenter 6.7 U3 に、ESXi 6.7 U2 / ESXi 6.7 U3 を登録して、
それぞれで vSAN 6.7 U2 / vSAN 6.7 U3 のクラスタを作成してあります。
そして、vSAN バージョンの異なるクラスタを用意しています。
クラスタ: vSAN-Cluster-67u2
- vSAN 6.7 U2
- ESXi 6.7 U2(Build 13006603)
- 稼働している VM: vm01-on-67u2、vm02-on-67u2
クラスタ: vSAN-Cluster-67u2
- vSAN 6.7 U3
- ESXi 6.7 U3(Build 14320388)
- 稼働している VM: vm01-on-67u3、vm02-on-67u3
vSAN-Cluster-67u2 クラスタに参加しているすべての ESXi のビルドは 13006603 なので、
ESXi 6.7 U2 → vSAN 6.7 U2 になります。
vSAN 6.7 U2 では、vSAN オン ディスク フォーマット が バージョン 7 です。
一方、vSAN-Cluster-67u3 クラスタに参加しているすべての ESXi のビルドは 14320388 なので、
ESXi 6.7 U3 → vSAN 6.7 U3 になります。
vSAN 6.7 U3 では、vSAN オン ディスク フォーマット が バージョン 10 です。
vSAN のバージョンアップによる新機能を利用するには、この環境のように
新バージョンの vSAN にあったオン ディスク フォーマットにしておく必要があります。
vSAN バージョンとオン ディスク フォーマットの関係は、下記で確認できます。
Build numbers and versions of VMware vSAN
https://kb.vmware.com/s/article/2150753
今回の vSAN 上のゲスト OS。
検証で利用する ゲスト OS は、Oracle Linux 7 です。
[root@vm01-on-67u2 ~]# cat /etc/oracle-release
Oracle Linux Server release 7.7
SCSI-3 PR の動作確認では、Linux の sg_persist コマンドを利用します。
これは、sg3_utils パッケージ(Linux ディストリビューション同梱のもの)に含まれています。
[root@vm01-on-67u2 ~]# which sg_persist
/usr/bin/sg_persist
[root@vm01-on-67u2 ~]# rpm -qf /usr/bin/sg_persist
sg3_utils-1.37-18.0.1.el7_7.2.x86_64
これらの VM では、vSAN データストアに配置した 10GB の VMDK「ハード ディスク 2」を接続しています。
仮想 SCSI コントローラ 1 で(デフォルトの SCSI コントローラ 0 とは分けて)接続しています。
そして SCSI コントローラ 1 では、SCSI パスの共有を「物理」に設定しています。
この ハード ディスク 2 は、ゲスト OS からは
「VMware Virtual disk」である /dev/sdb という名前で認識されています。
[root@vm01-on-67u2 ~]# lsscsi
[0:0:0:0] disk VMware Virtual disk 2.0 /dev/sda
[1:0:0:0] disk VMware Virtual disk 2.0 /dev/sdb
[4:0:0:0] cd/dvd NECVMWar VMware SATA CD00 1.00 /dev/sr0
/dev/sdb は「ハード ディスク 2」なので 10GB です。
[root@vm01-on-67u2 ~]# lsblk -i
NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINT
sda 8:0 0 16G 0 disk
|-sda1 8:1 0 1G 0 part /boot
`-sda2 8:2 0 15G 0 part
|-ol-root 249:0 0 13.4G 0 lvm /
`-ol-swap 249:1 0 1.6G 0 lvm [SWAP]
sdb 8:16 0 10G 0 disk
sr0 11:0 1 1024M 0 rom
vSAN 6.7 U2 での ネイティブ VMDK と SCSI-3 PR。
vSAN 6.7 U2 までは、ネイティブ VMDK だと SCSI-3 PR に対応していません。
sg_persist を実行すると、サポートされていないことがわかります。
ちなみに、-s は SCSI-3 PR のステータスを、-k では SCSI-3 PR で登録するキーを読み取ろうとしています。
[root@vm01-on-67u2 ~]# sg_persist -d /dev/sdb -s
VMware Virtual disk 2.0
Peripheral device type: disk
PR in (Read full status): bad field in cdb including unsupported service action
[root@vm01-on-67u2 ~]# sg_persist -d /dev/sdb -k
VMware Virtual disk 2.0
Peripheral device type: disk
PR in (Read keys): bad field in cdb including unsupported service action
vSAN 6.7 U2 での vSAN iSCSI LUN と SCSI-3 PR。
vSAN 6.7 U2 でも、vSAN iSCSI ターゲット(VIT)の LUN であれば、SCSI-3 PR に対応しています。
そこで Linux から VIT の LUN に接続して、SCSI-3 PR の動作確認をしてみます。
まず、vSAN で iSCSI ターゲットと、LUN を作成します。
ここでは iqn.2016-09.jp.go-lab:vit67u2 という IQN の iSCSI ターゲットを作成して、
そこに 5GB の LUN を追加しています。
Linux OS 側には iscsi-initiator-utils をインストールして・・・
(設定コマンドの出力結果は、一部省略しています)
[root@vm01-on-67u2 ~]# yum install -y iscsi-initiator-utils
[root@vm01-on-67u2 ~]# systemctl enable iscsid
[root@vm01-on-67u2 ~]# systemctl start iscsid
[root@vm01-on-67u2 ~]# systemctl is-active iscsid
active
iscsiadm コマンドで、iSCSI ターゲットに接続します。
[root@vm01-on-67u2 ~]# iscsiadm --mode discoverydb --type sendtargets --portal 192.168.1.33 --discover
[root@vm01-on-67u2 ~]# iscsiadm --mode node --portal 192.168.1.33:3260 --login
[root@vm01-on-67u2 ~]# iscsiadm -m session
tcp: [1] 192.168.1.33:3260,257 iqn.2016-09.jp.go-lab:vit67u2 (non-flash)
接続された iSCSI LUN は「VMware Virtual SAN」による /dev/sdc として認識されました。
[root@vm01-on-67u2 ~]# lsscsi
[0:0:0:0] disk VMware Virtual disk 2.0 /dev/sda
[1:0:0:0] disk VMware Virtual disk 2.0 /dev/sdb
[4:0:0:0] cd/dvd NECVMWar VMware SATA CD00 1.00 /dev/sr0
[34:0:0:0] disk VMware Virtual SAN 0001 /dev/sdc
さきほどのスクリーンショットにあった LUN なので、/dev/sdc は 5GB です。
[root@vm01-on-67u2 ~]# lsblk
NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINT
sda 8:0 0 16G 0 disk
tqsda1 8:1 0 1G 0 part /boot
mqsda2 8:2 0 15G 0 part
tqol-root 249:0 0 13.4G 0 lvm /
mqol-swap 249:1 0 1.6G 0 lvm [SWAP]
sdb 8:16 0 10G 0 disk
sdc 8:32 0 5G 0 disk
sr0 11:0 1 1024M 0 rom
では、sg_persist コマンドで様子を確認してみます。
この iSCSI LUN であれば、SCSI-3 PR に対応しているため、さきほどの /dev/sdc とは出力結果がことなります。
[root@vm01-on-67u2 ~]# sg_persist -d /dev/sdc -s
VMware Virtual SAN 0001
Peripheral device type: disk
PR generation=0x0
No full status descriptors
[root@vm01-on-67u2 ~]# sg_persist -d /dev/sdc -k
VMware Virtual SAN 0001
Peripheral device type: disk
PR generation=0x0, there are NO registered reservation keys
ためしに /dev/sdc デバイスに、SCSI-3 PR の Reservation を設定してみます。
まずは、キーを登録します。
[root@vm01-on-67u2 ~]# sg_persist -d /dev/sdc -o --register -S 123
VMware Virtual SAN 0001
Peripheral device type: disk
[root@vm01-on-67u2 ~]# sg_persist -d /dev/sdc -k
VMware Virtual SAN 0001
Peripheral device type: disk
PR generation=0x1, 1 registered reservation key follows:
0x123
この時点では、まだ Reservation を持っていません。
[root@vm01-on-67u2 ~]# sg_persist -d /dev/sdc -r
VMware Virtual SAN 0001
Peripheral device type: disk
PR generation=0x1, there is NO reservation held
それでは、登録したキーを指定(-K 123)して、
他のホストから書き込めないように Reservation を設定(-T 1)してみます。
[root@vm01-on-67u2 ~]# sg_persist -d /dev/sdc -o --reserve -K 123 -T 1
VMware Virtual SAN 0001
Peripheral device type: disk
[root@vm01-on-67u2 ~]# sg_persist -d /dev/sdc -r
VMware Virtual SAN 0001
Peripheral device type: disk
PR generation=0x1, Reservation follows:
Key=0x123
scope: LU_SCOPE, type: Write Exclusive
/dev/sdc デバイスには、この Linux からは、書き込みができます。
※デバイスまで書き込むように oflag=sync をつけています。
[root@vm01-on-67u2 ~]# dd if=/dev/zero of=/dev/sdc count=1 oflag=sync
1+0 レコード入力
1+0 レコード出力
512 バイト (512 B) コピーされました、 0.00960002 秒、 53.3 kB/秒
一方で、おなじ LUN に接続している別の Linux からは、書き込みができなくなっています。
ホスト名 vm02-on-67u2 の Linux からも同様に iSCSI LUN に接続して /dev/sdc と認識していますが・・・
[root@vm02-on-67u2 ~]# iscsiadm -m session
tcp: [1] 192.168.1.33:3260,257 iqn.2016-09.jp.go-lab:vit67u2 (non-flash)
[root@vm02-on-67u2 ~]# lsscsi
[0:0:0:0] disk VMware Virtual disk 2.0 /dev/sda
[1:0:0:0] disk VMware Virtual disk 2.0 /dev/sdb
[4:0:0:0] cd/dvd NECVMWar VMware SATA CD00 1.00 /dev/sr0
[34:0:0:0] disk VMware Virtual SAN 0001 /dev/sdc
[root@vm02-on-67u2 ~]# lsblk /dev/sdc
NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINT
sdc 8:32 0 5G 0 disk
SCSI-3 PR の Reservation によって、デバイスへの書き込みはエラーになりました。
[root@vm02-on-67u2 ~]# dd if=/dev/zero of=/dev/sdc count=1 oflag=sync
dd: `/dev/sdc' に書き込み中です: 入力/出力エラーです
1+0 レコード入力
0+0 レコード出力
0 バイト (0 B) コピーされました、 0.0144499 秒、 0.0 kB/秒
そして Reservation を開放すると、他のホストからの書き込みもできるようになります。
vm01-on-67u2 で Reservation を開放(--release)すると・・・
[root@vm01-on-67u2 ~]# sg_persist -d /dev/sdc -o --release -K 123 -T 1
VMware Virtual SAN 0001
Peripheral device type: disk
[root@vm01-on-67u2 ~]# sg_persist -d /dev/sdc -r
VMware Virtual SAN 0001
Peripheral device type: disk
PR generation=0x1, there is NO reservation held
vm02-on-67u2 でも、書き込みができるようになります。
[root@vm02-on-67u2 ~]# dd if=/dev/zero of=/dev/sdc count=1 oflag=sync
1+0 レコード入力
1+0 レコード出力
512 バイト (512 B) コピーされました、 0.0161903 秒、 31.6 kB/秒
最後に、キーの登録も削除しておきます。
[root@vm01-on-67u2 ~]# sg_persist -d /dev/sdc -o --register -K 123
[root@vm01-on-67u2 ~]# sg_persist -d /dev/sdc -k
VMware Virtual SAN 0001
Peripheral device type: disk
PR generation=0x2, there are NO registered reservation keys
vSAN 6.7 U3 での ネイティブ VMDK と SCSI-3 PR。
vSAN 6.7 U3 では、ネイティブ VMDK でも SCSI-3 PR に対応します。
sg_persist コマンドでキーを読み取ろうとすると iSCSI LUN と同様の出力結果となり、
SCSI-3 PR に対応していそうな様子が見られました。
※この時点ではキーが未登録なので「NO registered reservation keys」です。
[root@vm01-on-67u3 ~]# sg_persist -d /dev/sdb -k
VMware Virtual disk 2.0
Peripheral device type: disk
PR generation=0x0, there are NO registered reservation keys
ただし、Full Status を確認しようとすると、失敗(command failed)してしまいます。
[root@vm01-on-67u3 ~]# sg_persist -d /dev/sdb -s
VMware Virtual disk 2.0
Peripheral device type: disk
persistent reservation in: scsi status: Busy
PR in (Read full status): command failed
また、キー登録を試みても同様に失敗してしまいました。
[root@vm01-on-67u3 ~]# sg_persist -d /dev/sdb -o --register -S 123
VMware Virtual disk 2.0
Peripheral device type: disk
persistent reserve out: scsi status: Busy
PR out: command failed
vSAN 6.7 U3 でのネイティブ VMDK の SCSI-3 PR 対応は、WSFC をサポートするようです。
しかし、他のクラスタウェアなどで SCSI-3 PR 要件がある場合に vSAN でネイティブ VMDK の共有接続をするには
実際に利用する想定のソフトウェアで動作確認をしたほうがよさそうかなと思いました。
以上、vSAN の SCSI-3 PR の様子を確認してみる話でした。