LifeKeeper for Linux v9.3 から提供される Storage Quorum/Witness を使用するための手順を記載します。
Storage Quorum/Witness で使用できるストレージの種類は、block, file, aws_s3 の三種です。
この種類について詳細は、ご利用のバージョンのマニュアルを参照してください。
SIOS Technical Documentation
LifeKeeper > インストールと設定 > LifeKeeper I-O フェンシングの概要 > storage モード
また、手順内に記載される /etc/default/LifeKeeper の各パラメータにつきましては、ご利用のバージョンのQuorumパラメータ一覧を参照してください。
Quorumパラメータ一覧
block を利用する場合の手順へ
file を利用する場合の手順へ
aws_s3 を利用する場合の手順へ
【block】
※以下の環境を前提として記述します。
稼働系ノード名:lknode01
待機系ノード名:lknode02
Quorum/Witness用デバイス:/dev/sdb
1.クラスタの全ノードに対して、必要数のディスクを接続します。
(例)
FC接続ストレージの場合:ストレージ機器によるLUNマッピング
iSCSI接続ストレージの場合:iSCSIターゲットへの接続
vSphere環境のRDMの場合:ディスクデバイスの追加
クラスタの各ノード上で、ディスクが接続されていることを確認します。
#parted -l
2.パーティションを使用する場合、パーティションを HDD のセクターサイズの単位(4KiB) でアラインします。
この作業は、パフォーマンス影響への対応に加え、QWKオブジェクトの整合性を保つため必須の作業です。
(2018年時点では一般的に4KiBセクターのディスクが一般的なため、以下の手順では4KiBでアラインしています)
[root@lknode01 ~]# parted /dev/sdb GNU Parted 3.1 /dev/sdb を使用 GNU Parted へようこそ! コマンド一覧を見るには 'help' と入力してください。 (parted) mklabel gpt (parted) mkpart パーティションの種類? primary/プライマリ/extended/拡張? p ファイルシステムの種類? [ext2]? 開始? 0% 終了? 50% (parted) mkpart パーティションの種類? primary/プライマリ/extended/拡張? p ファイルシステムの種類? [ext2]? 開始? 50% 終了? 100% (parted) unit s (parted) print モデル: XXXXXXX XXXXXXX_XXX (scsi) ディスク /dev/sdb: 41943040s セクタサイズ (論理/物理): 512B/512B パーティションテーブル: gpt ディスクフラグ: 番号 開始 終了 サイズ タイプ ファイルシステム フラグ 1 2048s 20971519s 20969472s primary ###開始セクタ番号が8の倍数になっていればOK 2 20971520s 41943039s 20971520s primary ###開始セクタ番号が8の倍数になっていればOK (parted) align-check opt 1 1 アライメント済 (parted) align-check opt 2 2 アライメント済 (parted) q 通知: 必要であれば /etc/fstab を更新するのを忘れないようにしてください。 [root@lknode01 ~]# ll /dev/sdb* brw-rw---- 1 root disk 8, 16 7月 30 14:53 /dev/sdb brw-rw---- 1 root disk 8, 17 7月 30 14:53 /dev/sdb1 brw-rw---- 1 root disk 8, 18 7月 30 14:53 /dev/sdb2
[root@lknode02 ~]# ll /dev/sdb* brw-rw---- 1 root disk 8, 16 7月 30 15:00 /dev/sdb brw-rw---- 1 root disk 8, 17 7月 30 15:00 /dev/sdb1 brw-rw---- 1 root disk 8, 18 7月 30 15:00 /dev/sdb2
3.クラスタ各ノードの /etc/default/LifeKeeper の内容を確認します。
パラメータが正しく設定されていること、両ノードで設定が同じであることを確認します。
[root@lknode01 ~]# cat /etc/default/LifeKeeper | grep _MODE QUORUM_MODE=storage ###storageモードを使用するため設定 # If QUORUM_MODE eq tcp_remote, this should be a comma delimited # This doesn't matter of the QUORUM_MODE is something else. # This only applies when the QUORUM_MODE is tcp_remote. WITNESS_MODE=storage ###storageモードを使用するため設定 [root@lknode01 ~]# cat /etc/default/LifeKeeper | grep QWK_ QWK_STORAGE_TYPE=block ###storageの種類としてblockを使用するため設定 QWK_STORAGE_HBEATTIME=6 ###デフォルト値 QWK_STORAGE_NUMHBEATS=4 ###デフォルト値 QWK_STORAGE_OBJECT_lknode01=/dev/sdb1 ###デバイス上にQWKオブジェクトを配置するため設定 QWK_STORAGE_OBJECT_lknode02=/dev/sdb2 ###デバイス上にQWKオブジェクトを配置するため設定
4.クラスタの両ノードで初期化(qwk_storage_initコマンドの実行)を行います。
qwk_storage_init を実行する前に、すべてのコミュニケーションパスが稼働していてAliveであることを確認してください。
block では、ディスクに対してRAW書き込みを行うため、初期化に先立ちファイルシステムの作成やマウントは不要です。
クラスターの全ノードの初期化が完了するまでの間、qwk_storage_init コマンドは待ち状態になります。
待ち状態の間、”QWK object of XXX is not yet avail.” が定期的にコンソール上に出力されます。
[root@lknode01 ~]# qwk_storage_init ok: LifeKeeper is running. ok: The LifeKeeper license key is successfully installed. ok: QWK parameter is valid. ok: down: /opt/LifeKeeper/etc/service/qwk-storage: 9674s ok: Initialization of QWK object of own node is completed. QWK object of /dev/sdb2 is not yet avail. QWK object of /dev/sdb2 is not yet avail. QWK object of /dev/sdb2 is not yet avail. QWK object of /dev/sdb2 is not yet avail. ###クラスターの全ノードの初期化が完了すると次に進みます。 ok: quorum system is ready. ok: run: /opt/LifeKeeper/etc/service/qwk-storage: (pid 12870) 0s, normally down Successful.
[root@lknode02 ~]# qwk_storage_init ok: LifeKeeper is running. ok: The LifeKeeper license key is successfully installed. ok: QWK parameter is valid. ok: down: /opt/LifeKeeper/etc/service/qwk-storage: 437415s ok: Initialization of QWK object of own node is completed. ok: quorum system is ready. ok: run: /opt/LifeKeeper/etc/service/qwk-storage: (pid 8323) 1s, normally down Successful.
5.QWKオブジェクトの内容を確認します。
各ノード上のQWKオブジェクトが、指定された間隔で更新されていることを確認します。
QWKオブジェクトの更新間隔は、/etc/default/LifeKeeper に記載される QWK_STORAGE_HBEATTIME(デフォルト6)で定義されます。
なお、両ノード(当記事の例では”lknode01″と”lknode02″)のタイムスタンプは同じになるとは限りません。
[root@lknode01 ~]# dd if=/dev/sdb1 bs=4096 count=1 | strings 1+0 レコード入力 1+0 レコード出力 4096 バイト (4.1 kB) コピーされました、 0.106872 秒、 38.3 kB/秒 signature=lifekeeper_qwk_object local_node=lknode01 time=Mon Jul 30 06:02:13 2018 ###おおよそQWK_STORAGE_HBEATTIMEに記載の秒数(6秒)以内に更新されていればOK sequence=13 node=lknode02 commstat=UP checksum=12990082724002669955 [root@lknode01 ~]# dd if=/dev/sdb2 bs=4096 count=1 | strings 1+0 レコード入力 1+0 レコード出力 4096 バイト (4.1 kB) コピーされました、 0.109584 秒、 37.4 kB/秒 signature=lifekeeper_qwk_object local_node=lknode02 time=Mon Jul 30 06:02:18 2018 ###おおよそQWK_STORAGE_HBEATTIMEに記載の秒数(6秒)以内に更新されていればOK sequence=15 node=lknode01 commstat=UP checksum=12990205886485177731
以上で Storage Quorum/Witness(block)の設定は完了です。
【file】
※以下の環境を前提として記述します。
稼働系ノード名:lknode01
待機系ノード名:lknode02
NFSサーバー名:nfsserver01
exportディレクトリパス:nfsserver01://root/qwkshare
マウントポイント:/mnt/qwkmnt
1.NFSサーバー上でディレクトリを export します。
NFSサーバー上でQWKオブジェクトが使用するディレクトリをエクスポートします。
エクスポート時にオプション (rw,no_root_squash,sync,no_wdelay) を設定します。
[root@nfsserver01 ~]# cat /etc/exports /root/qwkshare lknode01(rw,no_root_squash,sync,no_wdelay) lknode02(rw,no_root_squash,sync,no_wdelay) [root@nfsserver01 ~]# exportfs -a
2.クラスタの両ノード(NFSクライアント)から exportディレクトリをマウントします。
[root@lknode01 ~]# mount nfsserver01://root/qwkshare /mnt/qwkmnt -o soft,timeo=20,retrans=1,intr,noac [root@lknode01 ~]# mount | grep qwkmnt nfsserver01://root/qwkshare on /mnt/qwkmnt type nfs (rw,relatime,sync,vers=3,rsize=262144,wsize=262144,namlen=255,acregmin=0,acregmax=0,acdirmin=0,acdirmax=0,soft,noac,proto=tcp,timeo=20,retrans=1,sec=sys,mountaddr=10.1.5.197,mountvers=3,mountport=947,mountproto=udp,local_lock=none,addr=10.1.5.197)
[root@lknode02 ~]# mount nfsserver01://root/qwkshare /mnt/qwkmnt -o soft,timeo=20,retrans=1,intr,noac [root@lknode02 ~]# mount | grep qwkmnt nfsserver01://root/qwkshare on /mnt/qwkmnt type nfs (rw,relatime,sync,vers=3,rsize=262144,wsize=262144,namlen=255,acregmin=0,acregmax=0,acdirmin=0,acdirmax=0,soft,noac,proto=tcp,timeo=20,retrans=1,sec=sys,mountaddr=10.1.5.197,mountvers=3,mountport=947,mountproto=udp,local_lock=none,addr=10.1.5.197)
3.クラスタ各ノードの /etc/default/LifeKeeper の内容を確認します。
パラメータが正しく設定されていること、両ノードで設定が同じであることを確認します。
[root@lknode01 ~]# cat /etc/default/LifeKeeper | grep _MODE QUORUM_MODE=storage ###storageモードを使用するため設定 # If QUORUM_MODE eq tcp_remote, this should be a comma delimited # This doesn't matter of the QUORUM_MODE is something else. # This only applies when the QUORUM_MODE is tcp_remote. WITNESS_MODE=storage ###storageモードを使用するため設定 [root@lknode01 ~]# cat /etc/default/LifeKeeper | grep QWK_ QWK_STORAGE_TYPE=file ###storageの種類としてfileを使用するため設定 QWK_STORAGE_HBEATTIME=6 ###デフォルト値 QWK_STORAGE_NUMHBEATS=4 ###デフォルト値 QWK_STORAGE_OBJECT_lknode01=/mnt/qwkmnt/lknode01 ###マウントされたexportディレクトリ上にQWKオブジェクトを配置するため設定 QWK_STORAGE_OBJECT_lknode02=/mnt/qwkmnt/lknode02 ###マウントされたexportディレクトリ上にQWKオブジェクトを配置するため設定
4.クラスタの両ノードで初期化(qwk_storage_initコマンドの実行)を行います。
qwk_storage_init を実行する前に、すべてのコミュニケーションパスが稼働していてAliveであることを確認してください。
file では、初期化に伴いQWKオブジェクトファイルが作成されます。
クラスターの全ノードの初期化が完了するまでの間、qwk_storage_init コマンドは待ち状態になります。
待ち状態の間、”QWK object of XXX is not yet avail.” が定期的にコンソール上に出力されます。
[root@lknode01 ~]# qwk_storage_init ok: LifeKeeper is running. ok: The LifeKeeper license key is successfully installed. ok: QWK parameter is valid. ok: down: /opt/LifeKeeper/etc/service/qwk-storage: 972s ok: Initialization of QWK object of own node is completed. QWK object of /mnt/qwkmnt/lknode02 is not yet avail. QWK object of /mnt/qwkmnt/lknode02 is not yet avail. QWK object of /mnt/qwkmnt/lknode02 is not yet avail. QWK object of /mnt/qwkmnt/lknode02 is not yet avail. ###クラスターの全ノードの初期化が完了すると次に進みます。 ok: quorum system is ready. ok: run: /opt/LifeKeeper/etc/service/qwk-storage: (pid 16271) 0s, normally down Successful.
[root@lknode02 ~]# qwk_storage_init ok: LifeKeeper is running. ok: The LifeKeeper license key is successfully installed. ok: QWK parameter is valid. ok: down: /opt/LifeKeeper/etc/service/qwk-storage: 1763s ok: Initialization of QWK object of own node is completed. ok: quorum system is ready. ok: run: /opt/LifeKeeper/etc/service/qwk-storage: (pid 11905) 0s, normally down Successful.
5.QWKオブジェクトの内容を確認します。
各ノード上のQWKオブジェクトが、指定された間隔で更新されていることを確認します。
QWKオブジェクトの更新間隔は、/etc/default/LifeKeeper に記載される QWK_STORAGE_HBEATTIME(デフォルト6)で定義されます。
なお、両ノード(当記事の例では”lknode01″と”lknode02″)のタイムスタンプは同じになるとは限りません。
[root@lknode01 ~]# cat /mnt/qwkmnt/lknode01 signature=lifekeeper_qwk_object local_node=lknode01 time=Mon Jul 30 06:43:31 2018 ###おおよそQWK_STORAGE_HBEATTIMEに記載の秒数(6秒)以内に更新されていればOK sequence=8 node=lknode02 commstat=UP checksum=12796983455390729513 [root@lknode01 ~]# cat /mnt/qwkmnt/lknode02 signature=lifekeeper_qwk_object local_node=lknode02 time=Mon Jul 30 06:43:35 2018 ###おおよそQWK_STORAGE_HBEATTIMEに記載の秒数(6秒)以内に更新されていればOK sequence=8 node=lknode01 commstat=UP checksum=12797115396786324777
以上で Storage Quorum/Witness(file)の設定は完了です。
【aws_s3】
※以下の環境を前提として記述します。
稼働系ノード名:lknode01
待機系ノード名:lknode02
1.AWS S3 上にバケットを登録します。
クラスタと異なるリージョンに、計2つバケットを作成します。
LifeKeeper に設定する IAM ユーザーに対して 読み取り/書き込みのアクセス権を付与します。
s3://qwkbucket.testlk.tokyo
s3://qwkbucket.testlk.sydney
2.クラスタの各ノードに対し、AWS CLIのインストールと、S3にアクセスするための設定を行います。
以下のリンク先の手順に従って実施します。
AWS Command Line Interface のインストール
https://docs.aws.amazon.com/ja_jp/cli/latest/userguide/installing.html
AWS CLI の設定
https://docs.aws.amazon.com/ja_jp/cli/latest/userguide/cli-chap-getting-started.html
[root@lknode01 ~]# aws configure AWS Access Key ID [None]: XXXXXXXXXXXXXXXXXXXX AWS Secret Access Key [None]:XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX Default region name [None]: ap-northeast-1 Default output format [None]: text [root@lknode01 ~]# aws s3 ls | grep qwkbucket 2018-07-30 15:52:59 qwkbucket.testlk.sydney 2018-07-13 16:24:32 qwkbucket.testlk.tokyo [root@lknode01 ~]# aws s3 cp testfile s3://qwkbucket.testlk.tokyo/ upload: ./testfile to s3://qwkbucket.testlk.tokyo/testfile [root@lknode01 ~]# aws s3 ls s3://qwkbucket.testlk.tokyo/ 2018-07-30 16:11:30 0 testfile
3.クラスタ各ノードの /etc/default/LifeKeeper の内容を確認します。
パラメータが正しく設定されていること、両ノードで設定が同じであることを確認します。
[root@lknode01 ~]# cat /etc/default/LifeKeeper | grep _MODE QUORUM_MODE=storage ###storageモードを使用するため設定 # If QUORUM_MODE eq tcp_remote, this should be a comma delimited # This doesn't matter of the QUORUM_MODE is something else. # This only applies when the QUORUM_MODE is tcp_remote. WITNESS_MODE=storage ###storageモードを使用するため設定 [root@lknode01 ~]# cat /etc/default/LifeKeeper | grep QWK_ QWK_STORAGE_TYPE=aws_s3 ###storageの種類としてaws_a3を使用するため設定 QWK_STORAGE_HBEATTIME=6 ###デフォルト値 QWK_STORAGE_NUMHBEATS=4 ###デフォルト値 QWK_STORAGE_OBJECT_lknode01=s3://qwkbucket.testlk.tokyo/lknode01,s3://qwkbucket.testlk.sydney/lknode01 ###S3オブジェクト上にQWKオブジェクトを配置するため設定 QWK_STORAGE_OBJECT_lknode02=s3://qwkbucket.testlk.tokyo/lknode02,s3://qwkbucket.testlk.sydney/lknode02 ###S3オブジェクト上にQWKオブジェクトを配置するため設定
4.クラスタの両ノードで初期化(qwk_storage_initコマンドの実行)を行います。
qwk_storage_init を実行する前に、すべてのコミュニケーションパスが稼働していてAliveであることを確認してください。
aws_s3 では、初期化に伴い s3 上バケット上にQWKオブジェクトファイルが作成されます。
クラスターの全ノードの初期化が完了するまでの間、qwk_storage_init コマンドは待ち状態になります。
待ち状態の間、”QWK object of XXX is not yet avail.” が定期的にコンソール上に出力されます。
[root@lknode01 ~]# qwk_storage_init ok: LifeKeeper is running. ok: The LifeKeeper license key is successfully installed. ok: QWK parameter is valid. ok: down: /opt/LifeKeeper/etc/service/qwk-storage: 392s ok: Initialization of QWK object of own node is completed. QWK object of s3://qwkbucket.testlk.tokyo/lknode02 is not yet avail. QWK object of s3://qwkbucket.testlk.sydney/lknode02 is not yet avail. QWK object of s3://qwkbucket.testlk.tokyo/lknode02 is not yet avail. QWK object of s3://qwkbucket.testlk.sydney/lknode02 is not yet avail. ###クラスターの全ノードの初期化が完了すると次に進みます。 ok: quorum system is ready. ok: run: /opt/LifeKeeper/etc/service/qwk-storage: (pid 7299) 0s, normally down Successful.
[root@lknode02 ~]# qwk_storage_init ok: LifeKeeper is running. ok: The LifeKeeper license key is successfully installed. ok: QWK parameter is valid. ok: down: /opt/LifeKeeper/etc/service/qwk-storage: 848s ok: Initialization of QWK object of own node is completed. ok: quorum system is ready. ok: run: /opt/LifeKeeper/etc/service/qwk-storage: (pid 3282) 0s, normally down Successful.
5.QWKオブジェクトの内容を確認します。
各ノード上のQWKオブジェクトが、指定された間隔で更新されていることを確認します。
QWKオブジェクトの更新間隔は、/etc/default/LifeKeeper に記載される QWK_STORAGE_HBEATTIME(デフォルト6)で定義されます。
なお、両ノード(当記事の例では”lknode01″と”lknode02″)のタイムスタンプは同じになるとは限りません。
[root@lknode01 ~]# aws s3 cp s3://qwkbucket.testlk.tokyo/lknode01 . [root@lknode01 ~]# cat lknode01 signature=lifekeeper_qwk_object local_node=lknode01 time=Mon Jul 30 07:28:53 2018 ###おおよそQWK_STORAGE_HBEATTIMEに記載の秒数(6秒)以内に更新されていればOK sequence=52 node=lknode02 commstat=UP checksum=12990082732592793987 [root@lknode01 ~]# aws s3 cp s3://qwkbucket.testlk.tokyo/lknode02 . [root@lknode01 ~]# cat lknode02 signature=lifekeeper_qwk_object local_node=lknode02 time=Mon Jul 30 07:30:22 2018 ###おおよそQWK_STORAGE_HBEATTIMEに記載の秒数(6秒)以内に更新されていればOK sequence=68 node=lknode01 commstat=UP checksum=12990205933729454467
以上で Storage Quorum/Witness(aws_s3)の設定は完了です。
改訂履歴
[公開日:2018年08月24日] [更新日:2019年05月09日] リンク修正 [更新日:2019年10月21日] リンク先ドキュメントを v9.4.0 へ変更[更新日:2021年12月6日] qwk_storage_initを実行する前にコミュニケーションパスの通信がALIVEになっている必要があることを記載[更新日:2023年9月12日]【aws_s3】の手順3のバケット名の誤りを修正しました。