DataKeeperとは
サイオステクノロジー株式会社が提供しているストレージのミラーリングソフトです。
DataKeeperを使用することでクラスタノード間でストレージをミラーリングして共有ストレージのように扱うことが可能になります。
クラスタリングソフトのLifeKeeper又はWindowsのWSFCとも連携することができます。
作業環境
今回の作業は下記の環境で実施しました。
- サーバ: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再起動のタイミング等で変わる可能性があるため、必ず事前にデバイス名を確認することをお勧めします。
**②ディスクデバイス名に対応する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が異なるため両方で確認します。
**③ディスクサイズの拡張** 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に拡張されたことが確認できます。
この作業を稼働系、待機系の両方で実施します。
**④パーティションの拡張** ディスクの拡張が完了したので次に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
この作業も稼働系、待機系の両方で実施します。
**⑤ミラーサイズの変更** ***稼働系でミラーサイズの変更を実施***します。 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>
**⑥ファイルシステムの拡張** 最後に***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負荷が高くなるため実施するタイミングについては考慮が必要となります。
参考リンク