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)
■使った感想
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 で実装するしかない。
ピンバック: Hyper-V のホストサーバ上に All Flash でインライン重複排除ができるストレージサーバを作る | まこぴかっと