Nutanix Volumes の Volume Group(VG)を仮想マシンに直接接続し、SCSI-3 Persistent Reservation(SCSI-3 PR)の動作を確認してみます。
今回の内容です。
1. Nutanix Volumes VG の SCSI-3 PR サポート
ゲスト OS 側での HA クラスタを構成する際などに、データの引継ぎのために共有ディスクが利用されます。そして、共有ディスクの排他制御のために、SCSI-3 PR が利用されることがあります。
Nutanix Volumes の VG も、SCSI-3 PR に対応した共有ディスクを提供できます。VG には、AHV 上の仮想マシンに接続する場合には2種類の方式があります。
- 接続方式 A: ゲスト OS の iSCSI イニシエータで接続
- 接続方式 B: 仮想マシンに直接接続
このうち、以前は接続方式 A のみで、SCSI-3 PR がサポートされていました。しかし、AOS 5.17 / AOS 5.20 からは、接続方式 B でも SCSI-3 PR がサポートされるようになっています。
- Directly attached volume groups are not supported with clustered applications that require PR3 reservations
https://portal.nutanix.com/page/documents/kbs/details?targetId=kA00e000000CvIDCA0
今回は、Nutainx CE 2.0(AOS 6.5.2 ベース)で、VG を 2台の仮想マシンに直接接続して、SCSI3-PR を利用してみます。
2. 今回の環境
2-1. Prism Element の様子
今回は、Nutainx CE 2.0 を利用しています。
2台の仮想マシンを用意してあります。(vm01 と vm02)
Nutanix Volumes による VG(test-vg-01)に、5GB の LUN を作成してあります。
この VG は、vm01 と vm02 に直接接続してあります。
2-2. 仮想マシン / ゲスト OS の様子(vm01)
vm01 と vm02 には、Oracle Linux 9.3 をインストールしてあります。
[root@vm01 ~]# cat /etc/system-release Oracle Linux Server release 9.3
仮想ディスクは、SCSI 接続のデバイスとして認識されています。
- /dev/sda: OS インストール領域。仮想マシンごとの vDisk。
- /dev/sdb: VG による共有ディスク
[root@vm01 ~]# lsscsi --scsi_id [0:0:0:0] cd/dvd QEMU QEMU DVD-ROM 2.5+ /dev/sr0 1ATA_QEMU_DVD-ROM_QM00001 [2:0:0:0] disk NUTANIX VDISK 0 /dev/sda 8naa.6506b8da30db3e59f7f265ce88bbfa5d [2:0:1:0] disk NUTANIX VDISK 0 /dev/sdb 8naa.6506b8d48e1a7b159b64d5e141faff18
/dev/sdb は、VG に作成されている 5GB の LUN です。
[root@vm01 ~]# lsblk /dev/sd? --ascii NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINTS sda 8:0 0 16G 0 disk |-sda1 8:1 0 1G 0 part /boot `-sda2 8:2 0 15G 0 part `-ol_ol93--min--01-root 252:0 0 15G 0 lvm / sdb 8:16 0 5G 0 disk
2-3. 仮想マシン / ゲスト OS の様子(vm02)
vm02 側で lsscsi で確認すると、/dev/sdb は共有デバイスなので、SCSI ID が vm01 側と同値になっています。
ちなみに、今回は vm01 / vm02 両方で共有ディスクが /dev/sdb として認識されていますが、このデバイス名は各ゲスト OS で揃うとは限りません。ディスクが複数ある場合は、vm01 / vm02 で別の名前で認識されてしまうこともあるので、運用環境では、 UUID やファイルシステムのラベル、マルチパス ドライバによるデバイス名などで識別します。
[root@vm02 ~]# lsscsi --scsi_id [0:0:0:0] disk NUTANIX VDISK 0 /dev/sda 8naa.6506b8d764ac50c9b3b57002072bdf5f [0:0:1:0] disk NUTANIX VDISK 0 /dev/sdb 8naa.6506b8d48e1a7b159b64d5e141faff18 [1:0:0:0] cd/dvd QEMU QEMU DVD-ROM 2.5+ /dev/sr0 1ATA_QEMU_DVD-ROM_QM00001
vm02 も、vm01 と同様のディスク構成になっています。
[root@vm02 ~]# lsblk /dev/sd? --ascii NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINTS sda 8:0 0 16G 0 disk |-sda1 8:1 0 1G 0 part /boot `-sda2 8:2 0 15G 0 part `-ol_ol93--min--01-root 252:0 0 15G 0 lvm / sdb 8:16 0 5G 0 disk
3. SCSI-3 PR の動作確認
3-1. 初期状態の様子
まず /dev/sdb から、各ノードが予約で指定するキー(Reservation key)を読み取ってみます。まだキーは登録されていません。
[root@vm01 ~]# sg_persist -d /dev/sdb --in --read-keys NUTANIX VDISK 0 Peripheral device type: disk PR generation=0x0, there are NO registered reservation keys
ちなみに、SCSI-3 PR に対応していないディスクに実行すると、下記のように「command not supported」となります。(これは別のマシンで実行しています)
[root@infra-jbox-01 ~]# sg_persist -d /dev/sda --in --read-keys VMware Virtual disk 2.0 Peripheral device type: disk PR in (Read keys): command not supported
3-2. Reservation Key の登録
vm01 で、Reservation Key(キー)を登録します。「-S」には、各ノードで重複しないように16進数の数値を指定します。
[root@vm01 ~]# sg_persist -d /dev/sdb --out --register -S 1 NUTANIX VDISK 0 Peripheral device type: disk
キーが登録されました。
[root@vm01 ~]# sg_persist -d /dev/sdb --in --read-keys NUTANIX VDISK 0 Peripheral device type: disk PR generation=0x1, 1 registered reservation key follows: 0x1
vm02 でも、キーを登録します。
[root@vm02 ~]# sg_persist -d /dev/sdb --out --register -S 2 NUTANIX VDISK 0 Peripheral device type: disk [root@vm01 ~]# sg_persist -d /dev/sdb --in --read-keys NUTANIX VDISK 0 Peripheral device type: disk PR generation=0x2, 2 registered reservation keys follow: 0x1 0x2
まだ、予約(reservation)は設定されていません。
[root@vm01 ~]# sg_persist -d /dev/sdb --in --read-reservation NUTANIX VDISK 0 Peripheral device type: disk PR generation=0x2, there is NO reservation held
3-3. Reservation の動作確認
vm01 から、 Reservation(予約)を設定します。
- -K 1: 事前に設定したキーを指定しています。
- -T 1:予約のタイプとして「write exclusive」を指定するオプションです。
[root@vm01 ~]# sg_persist -d /dev/sdb --out --reserve -K 1 -T 1 NUTANIX VDISK 0 Peripheral device type: disk
vm01 のキー(Key=0x1)で、予約されました。
[root@vm01 ~]# sg_persist -d /dev/sdb --in --read-reservation NUTANIX VDISK 0 Peripheral device type: disk PR generation=0x2, Reservation follows: Key=0x1 scope: LU_SCOPE, type: Write Exclusive
これは、vm02 側で実行しても同様の表示が確認できます。
[root@vm02 ~]# sg_persist -d /dev/sdb --in --read-reservation NUTANIX VDISK 0 Peripheral device type: disk PR generation=0x2, Reservation follows: Key=0x1 scope: LU_SCOPE, type: Write Exclusive
vm01 側から /dev/sdb に書き込むと、普通に成功します。ちなみに、ディスクまで書き込みが実行されるように「oflag=sync」オプションを指定しています。
[root@vm01 ~]# dd if=/dev/zero of=/dev/sdb count=1 oflag=sync 1+0 レコード入力 1+0 レコード出力 512 bytes copied, 0.0208906 s, 24.5 kB/s
一方、vm02 から /dev/sdb に書き込みを実行すると、I/O エラーになりました。
[root@vm02 ~]# dd if=/dev/zero of=/dev/sdb count=1 oflag=sync dd: '/dev/sdb' に書き込み中です: 入力/出力エラーです 1+0 レコード入力 0+0 レコード出力 0 bytes copied, 0.0554255 s, 0.0 kB/s
vm02 側で予約を設定しようとしても、vm01 で予約を解除するまでは Conflict で失敗します。
[root@vm02 ~]# sg_persist -d /dev/sdb --out --reserve -K 2 -T 1 NUTANIX VDISK 0 Peripheral device type: disk PR out (Reserve): Reservation conflict sg_persist failed: Reservation conflict
vm01 で、予約を解放します。
[root@vm01 ~]# sg_persist -d /dev/sdb --out --release -K 1 -T 1 NUTANIX VDISK 0 Peripheral device type: disk [root@vm01 ~]# sg_persist -d /dev/sdb --in --read-reservation NUTANIX VDISK 0 Peripheral device type: disk PR generation=0x2, there is NO reservation held
vm02 側でも、予約が解放されたことを確認しておきます。
[root@vm02 ~]# sg_persist -d /dev/sdb --in --read-reservation NUTANIX VDISK 0 Peripheral device type: disk PR generation=0x2, there is NO reservation held
これで、vm02 側で予約を設定できるようになりました。この時点では SCSI-3 PR で保護されなくなっているので、vm02 側から /dev/sdb への書き込みも、成功してしまうようになっています。
[root@vm02 ~]# dd if=/dev/zero of=/dev/sdb count=1 oflag=sync 1+0 レコード入力 1+0 レコード出力 512 bytes copied, 0.0217605 s, 23.5 kB/s
3-4. キーの削除
vm01 で、キーの登録を削除しておきます。
[root@vm01 ~]# sg_persist -d /dev/sdb --out --register -K 1 NUTANIX VDISK 0 Peripheral device type: disk [root@vm01 ~]# sg_persist -d /dev/sdb --in --read-keys NUTANIX VDISK 0 Peripheral device type: disk PR generation=0x3, 1 registered reservation keys follow: 0x2
vm02 でも、キーの登録を削除しておきます。
[root@vm02 ~]# sg_persist -d /dev/sdb --out --register -K 2 NUTANIX VDISK 0 Peripheral device type: disk [root@vm02 ~]# sg_persist -d /dev/sdb --in --read-keys NUTANIX VDISK 0 Peripheral device type: disk PR generation=0x4, there are NO registered reservation keys
以上。