💫

クラウドに再現する従来型ストレージ【CLI導入・実践編】

2023/11/15に公開

はじめに

クラウドに再現する[1]従来型ストレージのCLI導入・実践編です。
事前にストレージ環境のセットアップが必要です。GCP、AWS、VirtualBox各記事に沿ってセットアップして下さい。

https://zenn.dev/lightgreenface/articles/b9c4bc74bc9eb2
https://zenn.dev/lightgreenface/articles/753e4271b4c3d8
https://zenn.dev/lightgreenface/articles/4643f25df18946

クラウド利用にあたっては料金がかかります。 未使用時にはインスタンスを停止する、不要になった際には速やかにリソースを削除することで料金を抑えられます。

CLI導入

コントローラ1,2にログイン、sudo su - コマンドでrootユーザになります。

以下コマンドでCLI (シェルスクリプト)を取得、/usr/binに配置、alienユーザでの実行を許可2023.11.19追加します。

コピー&ペースト可
cd /usr/bin ; pwd

curl --retry 3 -OL https://github.com/lightgreenface/star-storage/raw/main/starcli
chmod 755 ./starcli   # 2023.11.19変更

cd ~
starcli
ll /usr/bin | grep starcli

for CMD in `starcli | awk '{ print $1 }'`
do
  CMD_PATH="$(which $CMD 2>/dev/null)" || continue
  ALLOW_CMD="alien ALL=NOPASSWD: $CMD_PATH"
  fgrep -q "$ALLOW_CMD" /etc/sudoers \
      || { echo "$ALLOW_CMD" | EDITOR='tee -a' visudo ; }
done

for ENV in `starclienv | grep STARCLI_ | awk -F= '{ print $1 }'`   # 2024.4.8変更
do
  ALLOW_ENV="Defaults:alien env_keep += \"$ENV\""
  fgrep -q "$ALLOW_ENV" /etc/sudoers \
    || { echo "$ALLOW_ENV" | EDITOR='tee -a' visudo ; }
done

実装されているコマンドは以下の通りです。rootユーザで実行[2]する必要があります。2023.11.19変更

[alien@star0001-ctl1 ~]$ starcli

starcli version 0.9

Available Commands:
  starcli
  starclienv
  starlistlun
  starshowlun lun_or_snap_name1[,lun_or_snap_name2 ...]
  starcreatelun lun_name lun_size
  stardeletelun lun_name [-nop]   # Specify '-nop', does not ask yes/no.
  starlisthost
  starcreatehost host_name host_iqn [lun_or_snap_name1,lun_or_snap_name2 ...]
  stardeletehost host_name [-nop]
  starattachlun host_name lun_or_snap_name1[,lun_or_snap_name2 ...]
  stardetachlun host_name lun_or_snap_name1[,lun_or_snap_name2 ...] [-nop]
  starlistsnap
  starcreatesnap snap_name src_lun_name snap_alloc_size
  starrecreatesnap snap_name [-nop]
  starextendsnap snap_name snap_alloc_size [-nop]
  starrestoresnap snap_name [-nop]
  stardeletesnap snap_name [-nop]
  staractivatelun lun_or_snap_name1[,lun_or_snap_name2 ...]
  stardeactivatelun lun_or_snap_name1[,lun_or_snap_name2 ...] [-nop]
  starshowpool
  stargazing                      # Run 'pcs status' command.
  shootingstar [-nop]             # Run 'pcs resource move' command.
  starupdatetarget [-withclear]   # Update iSCSI target according to definitions.
  stargetactive                   # Return active controller name.
  starshowconfig
  starsetconfig variable1=value1[,variable2=value2 ...] [-nop]
  galaxyrebootnode [-nop]
  galaxyshutdownnode [-nop]
  galaxyshutdownarray [-nop]
  bigbang -force [-nop]   # Delete all hosts and luns. DO NOT USE unless necessary.

CLI実践

新規LUN作成とサーバへのアタッチ (アクセス許可[3])

ACTIVEコントローラにログイン、sudo su - alienコマンドでalienユーザになります。
ストレージをセットアップした初期の構成ではLUNが6つ (LUN0~LUN5) 存在します。

[alien@star0001-ctl1 ~]$ starlistlun
LUN0 20e60a12-ef77-440d-9708-123deb3d3be4 3072M
LUN1 42f2a376-dd7f-489f-80a6-f9c39b37b4be 3072M
LUN2 30380713-77c1-464e-8c1b-9c062343c408 3072M
LUN3 cd696fe0-3667-48e7-945a-99dbc3980c98 3072M
LUN4 9fc64d87-73a8-4524-ac54-dd2cad27e69f 3072M
LUN5 2356cf10-db18-4d00-8422-e6e41c9c85be 3072M

これらのLUNは2台のサーバに対してアタッチ (アクセス許可) されています。

[alien@star0001-ctl1 ~]$ starlisthost
Host_1 iqn.2023-09.com.example:host1-initiator LUN0,LUN1,LUN2,LUN3,LUN4,LUN5
Host_2 iqn.2023-09.com.example:host2-initiator LUN0,LUN1,LUN2,LUN3,LUN4,LUN5

新しく、LUN6を1,024MBで作成します[4]

[alien@star0001-ctl1 ~]$ starcreatelun LUN6 1024M
  Logical volume "LUN6" created.
lunlist                                       100%  336   108.8KB/s   00:00
LUN6 6dfb4039-8f3d-48c6-8b34-8d17bdbb5c11 1024M
変更・操作コマンドはACTIVEコントローラで実行

LUNの作成をSTANDBYコントローラで実行すると以下のようになります。

[root@star0001-ctl2 ~]# starcreatelun LUN6 1024M
This command must be run on active controller.

作成したLUN6が追加されています。

[alien@star0001-ctl1 ~]$ starlistlun | grep LUN6
LUN6 6dfb4039-8f3d-48c6-8b34-8d17bdbb5c11 1024M

作成したLUN6をHost_1にアタッチします。

[alien@star0001-ctl1 ~]$ starattachlun Host_1 LUN6
Updating iSCSI target configs on star0001-ctl1, takes a while.
Last 10 configs saved in /etc/target/backup/.
Configuration saved to /etc/target/saveconfig.json
saveconfig.json.active                        100%   23KB  10.3MB/s   00:00
hostlist                                      100%  159    51.1KB/s   00:00
Updating iSCSI target configs on star0001-ctl2, takes a while.
Waiting for the device to appear. [1]
Last 10 configs saved in /etc/target/backup/.
Configuration saved to /etc/target/saveconfig.json
LUN6 atached to Host_1.

Host_1のアクセス許可にLUN6が増えました。

[alien@star0001-ctl1 ~]$ starlisthost
Host_1 iqn.2023-09.com.example:host1-initiator LUN0,LUN1,LUN2,LUN3,LUN4,LUN5,LUN6
Host_2 iqn.2023-09.com.example:host2-initiator LUN0,LUN1,LUN2,LUN3,LUN4,LUN5

Host_1のサーバでLUN6を検出します。

[root@instance-1 ~]# for ISCSI_HOST in `ls -1 /sys/class/iscsi_host`
> do
> echo '- - -' > /sys/class/scsi_host/$ISCSI_HOST/scan
> done
[root@instance-1 ~]#        # 実行しても出力はありません

LUN6が検出され、マルチパスに組み込まれました。

[root@instance-1 ~]# multipath -ll
 (省略)
mpathg (360014056dfb40398f3d48c68b348d17b) dm-6 LIO-ORG,STAR-LUN6
size=1.0G features='1 queue_if_no_path' hwhandler='1 alua' wp=rw
`-+- policy='round-robin 0' prio=50 status=active
  |- 0:0:0:6 sdm     8:192 active ready running
  `- 1:0:0:6 sdn     8:208 active ready running

ACTIVEコントローラ切替

クラスタ状態の確認をします。リソースが起動するstar0001-ctl1がACTIVEコントローラです。

[alien@star0001-ctl1 ~]$ stargazing
Cluster name: star0001
Cluster Summary:
  * Stack: corosync (Pacemaker is running)
  * Current DC: star0001-ctl1 (version 2.1.6-9.el8_9-6fdc9deea29) - partition with quorum
  * Last updated: Fri Mar 29 12:42:45 2024 on star0001-ctl1
  * Last change:  Fri Mar 29 12:06:48 2024 by hacluster via crmd on star0001-ctl2
  * 2 nodes configured
  * 2 resource instances configured

Node List:
  * Online: [ star0001-ctl1 star0001-ctl2 ]

Full List of Resources:
  * Resource Group: star_group:
    * STARpool  (ocf::heartbeat:LVM-activate):   Started star0001-ctl1
    * STARorbit (lsb:STARorbit):         Started star0001-ctl1

Daemon Status:
  corosync: active/enabled
  pacemaker: active/enabled
  pcsd: active/enabled

ACTIVEコントローラを切り替えます (star0001-ctl1 → star0001-ctl2)。

[alien@star0001-ctl1 ~]$ shootingstar
Execute shootingstar? (means node failover) [y/N]:y
Location constraint to move resource 'STARpool' has been created
Waiting for the cluster to apply configuration changes...
Location constraint created to move resource 'STARpool' has been removed
Waiting for the cluster to apply configuration changes...
resource 'STARpool' is running on node 'star0001-ctl2'

star0001-ctl2でリソースが起動しており、ACTIVEコントローラが切替わったことがわかります。

[alien@star0001-ctl1 ~]$ stargazing
Cluster name: star0001
Cluster Summary:
  * Stack: corosync (Pacemaker is running)
  * Current DC: star0001-ctl1 (version 2.1.6-9.el8_9-6fdc9deea29) - partition with quorum
  * Last updated: Fri Mar 29 12:44:13 2024 on star0001-ctl1
  * Last change:  Fri Mar 29 12:43:45 2024 by root via cibadmin on star0001-ctl1
  * 2 nodes configured
  * 2 resource instances configured

Node List:
  * Online: [ star0001-ctl1 star0001-ctl2 ]

Full List of Resources:
  * Resource Group: star_group:
    * STARpool  (ocf::heartbeat:LVM-activate):   Started star0001-ctl2
    * STARorbit (lsb:STARorbit):         Started star0001-ctl2

Daemon Status:
  corosync: active/enabled
  pacemaker: active/enabled
  pcsd: active/enabled

外部ホストからSSHによるコマンド投入 2023.11.19追加

コントローラ1,2のalienユーザの~/.ssh/authorized_keysに外部ホストの公開鍵を登録することで外部ホストからSSHによるコマンド投入が可能です。

以下はHost_1のサーバから実行したものです。

[root@instance-1 ~]# ssh -l alien star0001-ctl1 starlisthost
Host_1 iqn.2023-09.com.example:host1-initiator LUN0,LUN1,LUN2,LUN3,LUN4,LUN5,LUN6
Host_2 iqn.2023-09.com.example:host2-initiator LUN0,LUN1,LUN2,LUN3,LUN4,LUN5

ACTIVEコントローラは以下コマンドで取得できます。

[root@instance-1 ~]# ssh -l alien star0001-ctl1 stargetactive
star0001-ctl2

変更・操作コマンドをACTIVEコントローラから実行するには以下のように組み合わせます。

[root@instance-1 ~]# ssh -l alien `ssh -l alien star0001-ctl1 stargetactive` \
> starcreatelun LUN7 256M
  Logical volume "LUN7" created.
LUN7 d67b7268-f037-4f83-a3e6-c20c5e326619 256M

補足

CLIの実装は非常に簡素であるため、不整合が起こる可能性があります。
例えば、STANDBYコントローラが停止した状態でACTIVEコントローラからstarattachlunコマンドを投入するとコマンドは実行され、STANDBYだけが古い不整合な状態になります。

上記ケースではSTANDBYコントローラ起動後にACTIVEコントローラの/etc/star/hostlistファイルの内容をSTANDBYコントローラに反映 (scp転送 or 手動編集) し、ACTIVE → STANDBYコントローラの順番でstarupdatetargetコマンドを実行することで不整合を解消できます (または単純にstardetachlunしてから再度starattachlunしても解消します)。

他のケースでもACTIVE / STANDBYコントローラの/etc/star/hostlistファイルと/etc/star/lunlistファイルを同じ内容になるようにし、両コントローラでstarupdatetargetコマンドを実行することで不整合を解消できる可能性があります[5]

あとがき

ストレージ構築・操作を習得するにあたって最低限のコマンドを実装しました。
この環境で実際に動かし、ストレージの基礎・バイブスを掴んだうえで実際の製品について学ぶとより早く・深く理解できるのではないかと考えています[6]

一連の記事と誰でも自分用に使える環境がストレージを学習する人の助けになることを願います。

脚注
  1. GCPからはじまったのでこのようなタイトルになっています。 ↩︎

  2. 一般にストレージ製品では装置のroot相当権限は利用者には開示されませんが、CLIをシェルスクリプトで実装した都合によりroot権限での実行が必要です (シェルスクリプトにはSUIDが効かないため)。 → sudoにより非rootのalienユーザで実行可能になりました。 ↩︎

  3. 一般にLUNマスキングと言われます。 ↩︎

  4. lunlistの転送が見えるのはSTANDBYコントローラへの反映処理によるものです。 ↩︎

  5. starattachlunコマンドをはじめ変更コマンドは/etc/star配下のファイルを変更してから内部的にstarupdatetargetコマンドを呼び出しており、これと同じことをしています。 ↩︎

  6. 本記事のコマンドと実際の製品のコマンドの対応表などあればさらに捗るかもしれません。 ↩︎

Discussion