NTNX>日記

個人的な趣味による Nutanix Community Edition 日記。Japanese のみですみません。

Nutanix Volumes VG で SCSI3-PR の動作を確認してみる。(Direct-attached VG)

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 がサポートされるようになっています。

今回は、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

 

以上。

©2023 gowatana
クリエイティブ・コモンズ・ライセンスこの 作品 は クリエイティブ・コモンズ 表示 4.0 国際 ライセンスの下に提供されています。