おうち VMware ESXi 7.0 は HCI の夢を見るか

Hyper Converged Infrastructure とは、

  • Compute Resource
  • Storage
  • Network

が一つになったものを言うらしい。拡張が簡単かどうかはスコープ外のようだ。
それであるなら、VMware ESXi は HCI と呼べるのではないか?
しかし、それは NO であると思う。
ローカルデータストアだけだと、ストレージと言ってはいけないと思う。
そこで今回は、おうち HCI の夢を見るため、単体の VMware ESXi に重複排除ができるストレージを内包してみようとおもう。

■構成
・Virtualization Host

  • CPU: Intel Core i7-2500K
  • Memory: 32GB
  • Disk(SSD): 100GB & 600GB
  • OS: VMware ESXi 7.0

・Storage Server

  • OS: CentOS 8
  • Disk for OS: 57GB
  • Disk for Storage: 443GB
  • Logical Disk(VDO): 2TB
  • Storage Interface: NFSv3

・Network

  • vNetwork Standard Switch

■ストレージの検討
過去の記事【Enterprise Linux で重複排除を使ってみる】を参考にし、ストレージサーバを作成することとする。
しかし、それをどのように ESXi にマウントさせるかは、しっかり考える必要がある。
iSCSI であれば、ブロックストレージとなるため、VMFS を直接作れる。
更に、以下の要件を満たせば、自動再利用の要求(Block Discard (Trim/UNMAP))が有効になる。

  • VMFS6
  • ESXiホスト バージョン 6.5 以降
  • 仮想マシンのディスクがシンプロビジョニング
  • 仮想マシンのハードウェアはバージョン 11 (ESXi 6.0) 以降

※参考:[VMware] ゲスト OS からの容量の再利用の要求
その為、Linux 上に VDO で重複排除ボリュームを作り、iSCSI で橋渡しすれば上記実装が可能となる。
しかし、、、実際に上記のことを実装してみたところ、VDO と iSCSI と VMFS6 を組み合わせた場合には不具合が発生してしまったため、NFS で実装することとする。
NFS の場合、自動再利用の要求は発動しないので、仮想マシンから VMDK 仮想イメージ内のファイルを削除しても、Discard が発生しない。
Discard が発生するのは、ESXi からファイルを削除したときのみとなる。
VMDK そのものを小さくすることはできないが、# dd if=/dev/zero of=/tmp/zero.dat bs=1M ; sync ; rm -f /tmp/zero.dat みたいなことをすれば、VDO による重複排除が発動し、ストレージサーバ側の実使用量は少なくなる。
更にその状態で、ThinProvisioning で Storage vMotion を実施すれば、VMDK そのものを小さくすることができるが、そこまでするメリットはあんまりない。

■VMware ESXi のインストール
・ISO を CD-R や RW に書き込んで実施。
・その後は、次のステップで設定

  • 固定 IPv4 の設定
  • IPv6 の無効化
  • VMware vSphere Hypervisor のライセンス投入
  • NTP 設定
  • ESXi Shell の自動起動設定
  • SSH の自動起動設定
  • Local Datastore の作成

■重複排除を有効にしたストレージサーバの構築
過去の記事【Enterprise Linux で重複排除を使ってみる】を参考にした iSCSI ストレージサーバを作る。

■NFS として export するパーティション用 VDO ボリュームの作成

# vdo create \
     --name=VDO-vol01 \
     --device=/dev/disk/by-partuuid/111851b5-2c7c-0340-b9a1-cbfabceecc2d \
     --sparseIndex=enabled --indexMem=0.25 \
     --vdoLogicalSize=2T
Creating VDO VDO-vol01
      The VDO volume can address 420 GB in 210 data slabs, each 2 GB.
      It can grow to address at most 16 TB of physical storage in 8192 slabs.
      If a larger maximum size might be needed, use bigger slabs.
Starting VDO VDO-vol01
Starting compression on VDO VDO-vol01
VDO instance 1 volume is ready at /dev/mapper/VDO-vol01

# fdisk -l /dev/mapper/VDO-vol01
Disk /dev/mapper/VDO-vol01: 2 TiB, 2199023255552 bytes, 536870912 sectors
Units: sectors of 1 * 4096 = 4096 bytes
Sector size (logical/physical): 4096 bytes / 4096 bytes
I/O size (minimum/optimal): 4096 bytes / 4096 bytes

■VDO ボリュームにファイルシステムを作成する

# mkfs.ext4 -E nodiscard /dev/mapper/VDO-vol01
mke2fs 1.45.4 (23-Sep-2019)
Creating filesystem with 536870912 4k blocks and 134217728 inodes
Filesystem UUID: 595967af-bdb6-4d81-8aa3-ead20b6e1c52
Superblock backups stored on blocks:
        32768, 98304, 163840, 229376, 294912, 819200, 884736, 1605632, 2654208,
        4096000, 7962624, 11239424, 20480000, 23887872, 71663616, 78675968,
        102400000, 214990848, 512000000

Allocating group tables: done
Writing inode tables: done
Creating journal (262144 blocks): done
Writing superblocks and filesystem accounting information: done

Red Hat のドキュメント通り、ファイルシステム作成時に Discard が実行されないよう、オプションで nodiscard を指定している。

■マウント回数や最終 fsck から経過時間でのオート fsck を OFF にする

# tune2fs -c 0 -i 0 /dev/mapper/VDO-vol01
tune2fs 1.45.4 (23-Sep-2019)
Setting maximal mount count to -1
Setting interval between checks to 0 seconds

※最近の RHEL だと、mkfs した時点でこの設定が入ってることある。

■VDO ボリュームのマウント

# mkdir -p /export/VDO-vol01
# cp -piav /etc/fstab /etc/fstab.org
# ls -la /etc/fstab*
# echo "/dev/mapper/VDO-vol01 /export/VDO-vol01 ext4 defaults,_netdev,x-systemd.device-timeout=0,x-systemd.requires=vdo.service 0 0" >> /etc/fstab
# diff /etc/fstab.org /etc/fstab
# mount -a
# mount
# mount | grep VDO-vol01
/dev/mapper/VDO-vol01 on /export/VDO-vol01 type ext4 (rw,relatime,seclabel,_netdev,x-systemd.device-timeout=0)
# df -m /export/VDO-vol01
Filesystem            1M-blocks  Used Available Use% Mounted on
/dev/mapper/VDO-vol01   2063212    81   1958259   1% /export/VDO-vol01

システム起動時に自動的にマウントさせるため、/etc/fstab に追記する。ただし、VDO ボリュームの場合、vdo.service が起動する前にはマウントすることができないため、上記のように requires=vdo を付与する必要がある。
参考:VDO ボリュームのマウント
ファイル削除したときに、ブロックの解放が実行されるよう、discard オプションを付けてマウント。
※discard オプションつけると、仮想マシンイメージなどの大容量ファイル削除時にとても耐えられないレベルまで性能低下してしまう。詳細は後述。

■初回ブロック破棄(discard)の実施

# fstrim -av
/export/VDO-vol01: 2 TiB (2163350589440 bytes) trimmed

かかる時間は CPU の性能に左右されます。

■定期的なブロック破棄(discard)の有効化

# systemctl enable --now fstrim.timer

これを仕込むことで、/usr/sbin/fstrim -av が週に一度動くようになる。

■NFS サーバ用パッケージのインストール

# yum install nfs-utils

■NFS v4 の Disable

# cp -piav /etc/nfs.conf /etc/nfs.conf.org
# sed -i -e 's/^# vers4=y/vers4=n/g' /etc/nfs.conf
# sed -i -e 's/^# vers4.0=y/vers4.0=n/g' /etc/nfs.conf
# sed -i -e 's/^# vers4.1=y/vers4.1=n/g' /etc/nfs.conf
# sed -i -e 's/^# vers4.2=y/vers4.2=n/g' /etc/nfs.conf
# diff /etc/nfs.conf.org /etc/nfs.conf
53,56c53,56
< # vers4=y
< # vers4.0=y
< # vers4.1=y
< # vers4.2=y
---
> vers4=n
> vers4.0=n
> vers4.1=n
> vers4.2=n

VMware ESXi は、NFS version 4 の対応が微妙である。
※参考:[VMware] NFS プロトコルと ESXi
また、一つの Datastore を複数バージョンの NFS でマウントすることは禁忌とされる。
そのため、NFS version 3 でしか動かないようにしてしまう。

■NFS サーバの起動

# systemctl enable rpcbind.service
# systemctl enable nfs-server.service
# systemctl start rpcbind.service
# systemctl start nfs-server.service

■マウントポイントの設定

# cp -piav /etc/exports /etc/exports.org
# echo "/export/VDO-vol01 192.168.24.0/24(rw,no_root_squash)" >> /etc/exports
# diff /etc/exports.org /etc/exports
0a1
> /export/VDO-vol01 192.168.24.0/24(rw,no_root_squash)
# exportfs -v
# exportfs -ra
# exportfs -v
/export/VDO-vol01
                192.168.24.0/24(sync,wdelay,hide,no_subtree_check,sec=sys,rw,secure,no_root_squash,no_all_squash)

■ESXi からのマウント




■使った感想
NFS サーバ側でマウントオプション「discard」を付与すると、ファイル消去時に実使用データも削減されるため精神衛生上とても良いのだが、discard している間レスポンスがとても悪くなってしまう。

・通常時

# dd if=/dev/zero of=/mnt/zero.dat bs=1M count=10240 oflag=direct status=progress
10669260800 bytes (11 GB, 9.9 GiB) copied, 36 s, 296 MB/s
10240+0 records in
10240+0 records out
10737418240 bytes (11 GB, 10 GiB) copied, 36.2342 s, 296 MB/s

・Discard 発生時

# dd if=/dev/zero of=/mnt/zero.dat bs=1M count=10240 oflag=direct status=progress
10710155264 bytes (11 GB, 10 GiB) copied, 316 s, 33.9 MB/s
10240+0 records in
10240+0 records out
10737418240 bytes (11 GB, 10 GiB) copied, 316.953 s, 33.9 MB/s

VDO エンジンでの Discard 処理が遅いというのはわかっているので、やはりエンタープライズストレージには遠く及ばなかった。
ただそれでも、おうち HCI のストレージとしては、優秀と思った。

なお、ストレージサーバの容量監視は、vdostats –human-readable 等で、実使用量を監視しましょう・w・

.
.
.
■■■以下ボツネタ■■■
本来はこちらを実装したかった。
しかし、Discard (Trim/UNMAP) を iSCSI から VDO へ連携させると、どうもうまくいかない。

Sep 24 06:58:35 storageserver kernel: sd 2:0:0:0: [sda] tag#472 FAILED Result: hostbyte=DID_ERROR driverbyte=DRIVER_OK cmd_age=0s
Sep 24 06:58:35 storageserver kernel: sd 2:0:0:0: [sda] tag#472 CDB: Write(10) 2a 00 3e 7e 53 38 00 00 08 00
Sep 24 06:58:35 storageserver kernel: blk_update_request: I/O error, dev sda, sector 1048466232 op 0x1:(WRITE) flags 0x800 phys_seg 1 prio class 0
Sep 24 06:58:35 storageserver kernel: kvdo1:journalQ: Completing write VIO of type 7 for physical block 116115815 with error: System error -5 (-5)
Sep 24 06:58:35 storageserver kernel: kvdo1:journalQ: cannot write recovery journal block 19116: System error -5 (-5)
Sep 24 06:58:35 storageserver kernel: kvdo1:journalQ: Unrecoverable error, entering read-only mode: System error -5 (-5)
Sep 24 06:58:35 storageserver kernel: blkdev_issue_discard() failed: -5
    ... snip ...
Sep 24 06:58:35 storageserver kernel: blkdev_issue_discard() failed: -5
Sep 24 06:58:35 storageserver kernel: bio error: 0000000007114f2f,  err: 10
Sep 24 06:58:35 storageserver kernel: bio error: 0000000098067368,  err: 10
Sep 24 06:58:35 storageserver kernel: bio error: 00000000341be8ae,  err: 10
Sep 24 06:58:35 storageserver kernel: blkdev_issue_discard() failed: -5
Sep 24 06:58:35 storageserver kernel: blkdev_issue_discard() failed: -5
Sep 24 06:58:36 storageserver kernel: blkdev_issue_discard() failed: -5
    ... snip ...
Sep 24 07:10:02 storageserver kernel: ABORT_TASK: Found referenced iSCSI task_tag: 59868
Sep 24 07:10:02 storageserver kernel: kvdo0:cpuQ1: kvdoMapBio called from within a VDO thread!
Sep 24 07:10:02 storageserver kernel: ABORT_TASK: Sending TMR_FUNCTION_COMPLETE for ref_tag: 59868
    ... snip ...

ローカルからの Discard はうまくいくのだが・・・。
というわけで、これはお蔵入り。

■iSCSI ターゲットに接続する VDO ボリュームの作成

# vdo create \
     --name=VDO-vol01 \
     --device=/dev/disk/by-partuuid/111851b5-2c7c-0340-b9a1-cbfabceecc2d \
     --sparseIndex=enabled --indexMem=0.25 \
     --vdoLogicalSize=2T \
     --emulate512=enabled
Creating VDO VDO-vol01
      The VDO volume can address 420 GB in 210 data slabs, each 2 GB.
      It can grow to address at most 16 TB of physical storage in 8192 slabs.
      If a larger maximum size might be needed, use bigger slabs.
Starting VDO VDO-vol01
Starting compression on VDO VDO-vol01
VDO instance 1 volume is ready at /dev/mapper/VDO-vol01

# fdisk -l /dev/mapper/VDO-vol01
Disk /dev/mapper/VDO-vol01: 2 TiB, 2199023255552 bytes, 4294967296 sectors
Units: sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 4096 bytes
I/O size (minimum/optimal): 4096 bytes / 4096 bytes

VMware ESXi は、4K native (4Kn) の対応は直接接続されたディスクのみとのこと。
VDO ボリュームのデフォルトは 4Kn となるため、そのまま iSCSI で LUN に割り当てた場合、ESXi からは認識することができない。
その為 –emulate512=enabled を付与することで、512e として VDO ボリュームを作成している。

■iSCSI ターゲット管理ツールのインストール

# yum install targetcli

■iSCSI ターゲットの設定

# targetcli
targetcli shell version 2.1.51
Copyright 2011-2013 by Datera, Inc and others.
For help on commands, type 'help'.

/> ls
o- / ............................................................................... [...]
  o- backstores .................................................................... [...]
  | o- block ........................................................ [Storage Objects: 0]
  | o- fileio ....................................................... [Storage Objects: 0]
  | o- pscsi ........................................................ [Storage Objects: 0]
  | o- ramdisk ...................................................... [Storage Objects: 0]
  o- iscsi .................................................................. [Targets: 0]
  o- loopback ............................................................... [Targets: 0]
/> /backstores/block create name=iSCSI-VDO-vol01 dev=/dev/mapper/VDO-vol01
Created block storage object iSCSI-VDO-vol01 using /dev/mapper/VDO-vol01.
/> /backstores/block/iSCSI-VDO-vol01 set attribute emulate_tpu=1
Parameter emulate_tpu is now '1'.
/> /iscsi create
Created target iqn.2003-01.org.linux-iscsi.storageserver.x8664:sn.63402b4796b5.
Created TPG 1.
Global pref auto_add_default_portal=true
Created default portal listening on all IPs (0.0.0.0), port 3260.
/> /iscsi/iqn.2003-01.org.linux-iscsi.storageserver.x8664:sn.63402b4796b5/tpg1/luns create /backstores/block/iSCSI-VDO-vol01
Created LUN 0.
/> /iscsi/iqn.2003-01.org.linux-iscsi.storageserver.x8664:sn.63402b4796b5/tpg1/acls create iqn.1998-01.com.vmware:m4gz-76edf1d9
Created Node ACL for iqn.1998-01.com.vmware:m4gz-76edf1d9
Created mapped LUN 0.
/> ls
o- / ............................................................................... [...]
  o- backstores .................................................................... [...]
  | o- block ........................................................ [Storage Objects: 1]
  | | o- iSCSI-VDO-vol01 ........... [/dev/mapper/VDO-vol01 (2.0TiB) write-thru activated]
  | |   o- alua ......................................................... [ALUA Groups: 1]
  | |     o- default_tg_pt_gp ............................. [ALUA state: Active/optimized]
  | o- fileio ....................................................... [Storage Objects: 0]
  | o- pscsi ........................................................ [Storage Objects: 0]
  | o- ramdisk ...................................................... [Storage Objects: 0]
  o- iscsi .................................................................. [Targets: 1]
  | o- iqn.2003-01.org.linux-iscsi.storageserver.x8664:sn.63402b4796b5 ......... [TPGs: 1]
  |   o- tpg1 ..................................................... [no-gen-acls, no-auth]
  |     o- acls ................................................................ [ACLs: 1]
  |     | o- iqn.1998-01.com.vmware:m4gz-76edf1d9 ....................... [Mapped LUNs: 1]
  |     |   o- mapped_lun0 ............................. [lun0 block/iSCSI-VDO-vol01 (rw)]
  |     o- luns ................................................................ [LUNs: 1]
  |     | o- lun0 ..... [block/iSCSI-VDO-vol01 (/dev/mapper/VDO-vol01) (default_tg_pt_gp)]
  |     o- portals .......................................................... [Portals: 1]
  |       o- 0.0.0.0:3260 ........................................................... [OK]
  o- loopback ............................................................... [Targets: 0]
/> exit
Global pref auto_save_on_exit=true
Last 10 configs saved in /etc/target/backup/.
Configuration saved to /etc/target/saveconfig.json

■ESXi から iSCSI の LUN をマウントしたときのログ

Sep 23 02:10:56 storageserver kernel: MODE SENSE: unimplemented page/subpage: 0x1c/0x02

なんか変なエラーログ出るな・x・

■試験
・仮想マシンを作成し、CentOS 8 インストールメディアでファイルシステム作成 & fstrim
 →問題なくできる
・仮想マシンのインストール実施
 →パーティション作成時にハングアップ。
  また、ストレージサーバ側で大量のエラー。

Sep 24 06:58:35 storageserver kernel: sd 2:0:0:0: [sda] tag#472 FAILED Result: hostbyte=DID_ERROR driverbyte=DRIVER_OK cmd_age=0s
Sep 24 06:58:35 storageserver kernel: sd 2:0:0:0: [sda] tag#472 CDB: Write(10) 2a 00 3e 7e 53 38 00 00 08 00
Sep 24 06:58:35 storageserver kernel: blk_update_request: I/O error, dev sda, sector 1048466232 op 0x1:(WRITE) flags 0x800 phys_seg 1 prio class 0
Sep 24 06:58:35 storageserver kernel: kvdo1:journalQ: Completing write VIO of type 7 for physical block 116115815 with error: System error -5 (-5)
Sep 24 06:58:35 storageserver kernel: kvdo1:journalQ: cannot write recovery journal block 19116: System error -5 (-5)
Sep 24 06:58:35 storageserver kernel: kvdo1:journalQ: Unrecoverable error, entering read-only mode: System error -5 (-5)
Sep 24 06:58:35 storageserver kernel: blkdev_issue_discard() failed: -5
    ... snip ...
Sep 24 06:58:35 storageserver kernel: blkdev_issue_discard() failed: -5
Sep 24 06:58:35 storageserver kernel: bio error: 0000000007114f2f,  err: 10
Sep 24 06:58:35 storageserver kernel: bio error: 0000000098067368,  err: 10
Sep 24 06:58:35 storageserver kernel: bio error: 00000000341be8ae,  err: 10
Sep 24 06:58:35 storageserver kernel: blkdev_issue_discard() failed: -5
Sep 24 06:58:35 storageserver kernel: blkdev_issue_discard() failed: -5
Sep 24 06:58:36 storageserver kernel: blkdev_issue_discard() failed: -5
    ... snip ...
Sep 24 07:10:02 storageserver kernel: ABORT_TASK: Found referenced iSCSI task_tag: 59868
Sep 24 07:10:02 storageserver kernel: kvdo0:cpuQ1: kvdoMapBio called from within a VDO thread!
Sep 24 07:10:02 storageserver kernel: ABORT_TASK: Sending TMR_FUNCTION_COMPLETE for ref_tag: 59868
    ... snip ...

■結果
VDO + iSCSI の場合、まだ実装ができなさそう。
VDO + NFS で実装するしかない。

カテゴリー: めも パーマリンク

1 Response to おうち VMware ESXi 7.0 は HCI の夢を見るか

  1. ピンバック: Hyper-V のホストサーバ上に All Flash でインライン重複排除ができるストレージサーバを作る | まこぴかっと

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です