DataKeeperでミラーリングされているディスクの容量をオンラインで拡張する(AWS版)

# DataKeeperとは
サイオステクノロジー株式会社が提供しているストレージのミラーリングソフトです。
DataKeeperを使用することでクラスタノード間でストレージをミラーリングして共有ストレージのように扱うことが可能になります。
クラスタリングソフトのLifeKeeper又はWindowsのWSFCとも連携することができます。

https://bccs.sios.jp/lifekeeper/

# 作業環境
今回の作業は下記の環境で実施しました。

- サーバ：AWS EC2 x 2台 (稼働系と待機系)
- OS：RedHatEnterpriseLinux 7.7
- クラスタリングソフト：LifeKeeper for Linux v9.5.0 (DataKeeper含む)

尚、AWSでのEC2構築やLifeKeeper・DataKeeperのインストール・設定に関しては本記事では記載しておりません。
LifeKeeperのクラスタリソースもDataKeeperによるミラーディスクのみのシンプルな構成で作業を行っています。

# 作業手順
**①拡張対象のディスクデバイス名の確認**
LifeKeeperのコマンドを使用して***稼働系と待機系でミラーリングディスクのデバイス名を確認***します。

```
# lcdstatus

※以下ミラーリングに関する表示のみ抜粋
datarep-mnttest: id=c464694d-8d44-4927-b60b-0a7427ff7049 app=scsi type=netraid state=ISP
        initialize=(AUTORES_ISP) automatic restore to IN-SERVICE by LifeKeeper
        info=0/dev/nvme1n1p110.0.2.2020969472gpt0/opt/LifeKeeper/bitmap__mnttest256M
        reason=restore action has succeeded
        these resources are dependent: /mnttest
        Local priority = 1
        SHARED equivalency with "datarep-mnttest" on "lk-sby", priority = 10
                FAILOVER ALLOWED
```
この例ではコマンドの出力結果の3行目に表示されている「/dev/nvme1n1p1」がミラーリングディスクのデバイス名となります。
AWS EC2の場合はこのデバイス名がOS再起動のタイミング等で変わる可能性があるため、必ず事前にデバイス名を確認することをお勧めします。

<br>
**②ディスクデバイス名に対応するEBS VolumeIDの確認**
AWS側の操作でディスク(EBS)を拡張するためにnvmeコマンドを使用して対象のデバイス名に対応するEBS VolumeIDを確認します。

```
# nvme id-ctrl -v /dev/nvme1n1p1

NVME Identify Controller:
vid       : 0x1d0f
ssvid     : 0x1d0f
sn        : vol07d46259abcccf227
mn        : Amazon Elastic Block Store
fr        : 1.0
rab       : 32
ieee      : a002dc
～以下省略～
```
「sn」の行のvolから始まる文字列がEBS VolumeIDです。
***稼働系、待機系でそれぞれIDが異なる***ため両方で確認します。

<br>
**③ディスクサイズの拡張**
AWS側でディスク(EBS)の拡張を行います。
まずは拡張前のディスクサイズを確認します。
「--volume-ids」オプションの引数には「②ディスクデバイス名に対応するEBS VolumeIDの確認」で確認したVolumeIDを指定します。

```
# aws ec2 describe-volumes --volume-ids vol-07d46259abcccf227
{
    "Volumes": [
        {
            "Attachments": [
                {
                    "AttachTime": "2021-10-13T08:20:57+00:00",
                    "Device": "/dev/sdf",
                    "InstanceId": "i-0xx78bxx85dfxx0e0",
                    "State": "attached",
                    "VolumeId": "vol-07d46259abcccf227",
                    "DeleteOnTermination": false
                }
            ],
            "AvailabilityZone": "ap-northeast-1a",
            "CreateTime": "2021-10-13T08:20:37.496000+00:00",
            "Encrypted": false,
            "Size": 20,
            "SnapshotId": "",
            "State": "in-use",
            "VolumeId": "vol-07d46259abcccf227",
            "Iops": 3000,
～以下省略～
```

「"Size": 20」と表示されており現在のディスクサイズは20GiBであることが確認できます。
このディスクサイズを20GiB→50GiBに拡張します。

```
# aws ec2 modify-volume --volume-id vol-07d46259abcccf227 --size 50

{
    "VolumeModification": {
        "VolumeId": "vol-07d46259abcccf227",
        "ModificationState": "modifying",
        "TargetSize": 50,
        "TargetIops": 3000,
        "TargetVolumeType": "gp3",
        "TargetThroughput": 125,
        "TargetMultiAttachEnabled": false,
        "OriginalSize": 20,
        "OriginalIops": 3000,
        "OriginalVolumeType": "gp3",
        "OriginalThroughput": 125,
        "OriginalMultiAttachEnabled": false,
        "Progress": 0,
        "StartTime": "2021-10-14T10:00:03+00:00"
    }
}

```

再度ディスクサイズを確認します。

```
# aws ec2 describe-volumes --volume-ids vol-07d46259abcccf227

{
    "Volumes": [
        {
            "Attachments": [
                {
                    "AttachTime": "2021-10-13T08:20:57+00:00",
                    "Device": "/dev/sdf",
                    "InstanceId": "i-0xx78bxx85dfxx0e0",
                    "State": "attached",
                    "VolumeId": "vol-07d46259abcccf227",
                    "DeleteOnTermination": false
                }
            ],
            "AvailabilityZone": "ap-northeast-1a",
            "CreateTime": "2021-10-13T08:20:37.496000+00:00",
            "Encrypted": false,
            "Size": 50,
            "SnapshotId": "",
            "State": "in-use",
            "VolumeId": "vol-07d46259abcccf227",
            "Iops": 3000,
～以下省略～
```
「"Size": 50」と表示されておりディスクが50GiBに拡張されたことが確認できます。
この作業を***稼働系、待機系の両方で実施***します。

<br>
**④パーティションの拡張**
ディスクの拡張が完了したので次にOS側のパーティションの拡張を実施します。
まずは拡張前の状態を確認します。

```
# lsblk

NAME        MAJ:MIN RM SIZE RO TYPE  MOUNTPOINT
nbd1         43:1    0  20G  0 disk
mqmd0         9:0    0  20G  0 raid1 /mnttest
nvme0n1     259:2    0  10G  0 disk
┗nvme0n1p1 259:3    0   1M  0 part
┗nvme0n1p2 259:4    0  10G  0 part  /
nvme1n1     259:0    0  50G  0 disk
┗nvme1n1p1 259:1    0  20G  0 part
　┗md0       9:0    0  20G  0 raid1 /mnttest
```

コマンド出力結果の下から3行目に表示されているのが「③ディスクサイズの拡張」で拡張したディスク(EBS)の/dev/nvme1n1を示しており、サイズが拡張後の50GBとなっています。
但しその下に表示されているパーティション/dev/nvme1n1p1のサイズはまだ20GBです。
partedコマンドで対話形式でパーティションを拡張します。

```
# parted /dev/nvme1n1

GNU Parted 3.1
Using /dev/nvme1n1
Welcome to GNU Parted! Type 'help' to view a list of commands.
(parted) p　　　※p を入力
Error: The backup GPT table is not at the end of the disk, as it should be.  This might mean that another operating system believes the disk is
smaller.  Fix, by moving the backup to the end (and removing the old backup)?
Fix/Ignore/Cancel? Fix　　　※これが表示された場合は Fix を入力
Warning: Not all of the space available to /dev/nvme1n1 appears to be used, you can fix the GPT to use all of the space (an extra 62914560
blocks) or continue with the current setting?
Fix/Ignore? Fix　　　※これが表示された場合は Fix を入力
Model: NVMe Device (nvme)
Disk /dev/nvme1n1: 53.7GB
Sector size (logical/physical): 512B/512B
Partition Table: gpt
Disk Flags:

Number  Start   End     Size    File system  Name  Flags
 1      1049kB  21.5GB  21.5GB  xfs          1

(parted) resizepart 1 100%　　　※パーティションサイズをディスク容量の100%まで拡張
(parted) p　　　※p を入力
Model: NVMe Device (nvme)
Disk /dev/nvme1n1: 53.7GB
Sector size (logical/physical): 512B/512B
Partition Table: gpt
Disk Flags:

Number  Start   End     Size    File system  Name  Flags
 1      1049kB  53.7GB  53.7GB  xfs          1　　　　　　※パーティションサイズが拡張された

(parted) q　　　※q を入力してpartedコマンドを終了
Information: You may need to update /etc/fstab.
```

改めてlsblkコマンドでパーティションが拡張されたことを確認します。

```
# lsblk

NAME        MAJ:MIN RM SIZE RO TYPE  MOUNTPOINT
nbd1         43:1    0  20G  0 disk
mqmd0         9:0    0  20G  0 raid1 /mnttest
nvme0n1     259:2    0  10G  0 disk
┗nvme0n1p1 259:3    0   1M  0 part
┗nvme0n1p2 259:4    0  10G  0 part  /
nvme1n1     259:0    0  50G  0 disk
┗nvme1n1p1 259:1    0  50G  0 part
　┗md0       9:0    0  20G  0 raid1 /mnttest
```

この作業も***稼働系、待機系の両方で実施***します。

<br>
**⑤ミラーサイズの変更**
***稼働系でミラーサイズの変更を実施***します。
mirror_resizeコマンドの引数に拡張対象のミラーディスクのリソースタグ名を指定します。
リソースタグ名はlcdstatusコマンドで確認可能です。

```
※リソースタグ名を確認
# lcdstatus -e
BACKUP   TAG               ID                                    STATE     PRIO  PRIMARY
lk-sby   /mnttest          /mnttest                              ISP          1  lk-act
lk-sby    datarep-mnttest  c464694d-8d44-4927-b60b-0a7427ff7049  ISP          1  lk-act

MACHINE  NETWORK ADDRESSES/DEVICE     STATE     PRIO
lk-sby   TCP     10.0.0.10/10.0.0.20  ALIVE        1
lk-sby   TCP     10.0.2.10/10.0.2.20  ALIVE        2


※ミラーサイズの変更
# mirror_resize datarep-mnttest

Resize mirror datarep-mnttest (/dev/md0) from 20.0 GB to 50.0 GB ?
WARNING: This will cause a full resynchronization.
Are you sure (y/n) ? y　　　※y を入力
The mirror datarep-mnttest will now be resized from 20969472 KB (20.0 GB) to 52427759 KB (50.0 GB).
Pausing mirror datarep-mnttest: lk-act -> lk-sby...
The mirror to lk-sby has been paused
Temporary read/write access for datarep-mnttest set up on the mount point "/mnttest" on server lk-sby. You must access the data from this mount point ONLY! All changes made to the data on server "lk-sby" via the mount point "/mnttest" will be DISCARDED when the mirror is resumed.
/opt/LifeKeeper/lkadm/subsys/scsi/netraid/bin/mdadm --grow /dev/md0 --bitmap=none
/opt/LifeKeeper/lkadm/subsys/scsi/netraid/bin/mdadm --grow /dev/md0 --size=52427759
mdadm: component size of /dev/md0 has been set to 52427759K
Resizing bitmap on lk-sby
lcdremexec -d lk-sby -e -- bitmap -x 52427759 /opt/LifeKeeper/bitmap__mnttest
Extending bitmap by 15361 bytes
Resizing bitmap on lk-act
lcdremexec -d lk-act -e -- bitmap -x 52427759 /opt/LifeKeeper/bitmap__mnttest
Extending bitmap by 15361 bytes
/opt/LifeKeeper/lkadm/subsys/scsi/netraid/bin/mdadm --grow /dev/md0 --bitmap=/opt/LifeKeeper/bitmap__mnttest --bitmap-chunk=256 --force
assume non-persistent superblock
: No such file or directory
Forcing full resync...
Resuming mirror datarep-mnttest: lk-act -> lk-sby...
sh: exportfs: command not found
mdadm: stopped /dev/md0
Set full resync to target lk-sby.
Full resynchronization of component "/dev/nbd1" has begun for mirror "/dev/md0"
The mirror to lk-sby has been resumed
The mirror datarep-mnttest has been resized from 20969472 KB (20.0 GB) to 52427759 KB (50.0 GB).
```
ミラーサイズの変更を実行するとディスクの全同期が開始されます。
同期完了までの時間はネットワークレイテンシやディスクサイズに依存するため、クラスタノードがAWSのAZやRegionを跨いでいたりディスクが大容量の場合は同期完了までに時間を要しますので御注意下さい。
同期の状態はコマンドで確認できます。

```
# mirror_status datarep-mnttest
Mirror Configuration:
[-]     lk-act -> lk-sby (10.0.2.20)
        Status: Resynchronizing
        [=========>         ] 54%
        Resync Speed: 59200K/sec
        Type: Synchronous

Bitmap: 204796 bits (chunks), 0 dirty (0.0%)


# cat /proc/mdstat
Personalities : [raid1]
md0 : active raid1 nbd1[2](W) nvme1n1p1[0]
      52427759 blocks super non-persistent [2/1] [U_]
      [===========>.........]  recovery = 57.7% (30260096/52427759) finish=6.2min speed=58805K/sec
      bitmap: 0/100 pages [0KB], 256KB chunk, file: /opt/LifeKeeper/bitmap__mnttest

unused devices: <none>
```

<br>
**⑥ファイルシステムの拡張**
最後に***OSのファイルシステムを稼働系で拡張***します。
今回の環境ではXFSファイルシステムを使用してるため拡張にはxfs_growfsコマンドを使用します。
拡張前のファイルシステム(/dev/md0)は20GBとなっています。

```
# df -h
Filesystem      Size  Used Avail Use% Mounted on
devtmpfs        1.8G     0  1.8G   0% /dev
tmpfs           1.9G     0  1.9G   0% /dev/shm
tmpfs           1.9G  9.0M  1.9G   1% /run
tmpfs           1.9G     0  1.9G   0% /sys/fs/cgroup
/dev/nvme0n1p2   10G  4.0G  6.0G  40% /
tmpfs           373M     0  373M   0% /run/user/1000
/dev/md0         20G   33M   20G   1% /mnttest
```

ファイルシステム(/dev/md0)を拡張します。

```
xfs_growfs /dev/md0
meta-data=/dev/md0               isize=512    agcount=4, agsize=1310592 blks
         =                       sectsz=512   attr=2, projid32bit=1
         =                       crc=1        finobt=0 spinodes=0
data     =                       bsize=4096   blocks=5242368, imaxpct=25
         =                       sunit=0      swidth=0 blks
naming   =version 2              bsize=4096   ascii-ci=0 ftype=1
log      =internal               bsize=4096   blocks=2560, version=2
         =                       sectsz=512   sunit=0 blks, lazy-count=1
realtime =none                   extsz=4096   blocks=0, rtextents=0
data blocks changed from 5242368 to 13106939
```

ファイルシステム(/dev/md0)が50GBに拡張されました。

```
df -h
Filesystem      Size  Used Avail Use% Mounted on
devtmpfs        1.8G     0  1.8G   0% /dev
tmpfs           1.9G     0  1.9G   0% /dev/shm
tmpfs           1.9G  9.0M  1.9G   1% /run
tmpfs           1.9G     0  1.9G   0% /sys/fs/cgroup
/dev/nvme0n1p2   10G  4.0G  6.0G  40% /
tmpfs           373M     0  373M   0% /run/user/1000
/dev/md0         50G   33M   50G   1% /mnttest
```

以上で拡張作業は完了です。
作業中に別ターミナルで拡張領域へ常時ファイルの書き込みを行っていましたが特にエラー等は発生しなかったためオンラインでの拡張が正常に行われたと判断できます。
また、待機系でもリソースを起動してみましたが拡張後のサイズでファイルシステムが認識されていることを確認しました。

尚、オンライン拡張は可能ですが拡張中は対象領域のI/O負荷が高くなるため実施するタイミングについては考慮が必要となります。

# 参考リンク

https://lkdkuserportal.sios.jp/hc/ja/articles/900000874146

https://docs.us.sios.com/spslinux/