[Linux]Quorum Witness Kit を使用した Storage Quorum/Witness 構成ガイド

LifeKeeper for Linux v9.3 から提供される Storage Quorum/Witness を使用するための手順を記載します。
Storage Quorum/Witness で使用できるストレージの種類は、block, file, aws_s3 の三種です。

この種類について詳細は、ご利用のバージョンのマニュアルを参照してください。

SIOS Technical Documentation
LifeKeeper > インストールと設定 > LifeKeeper I-O フェンシングの概要 > storage モード
http://jpdocs.us.sios.com/Linux/9.3/LK4L/TechDoc/index.htm#configuration/lifekeeper_io_fencing/qwk_storage.htm

また、手順内に記載される /etc/default/LifeKeeper の各パラメータにつきましては、ご利用のバージョンのQuorumパラメータ一覧を参照してください。

Quorumパラメータ一覧
http://jpdocs.us.sios.com/Linux/9.3/LK4L/TechDoc/index.htm#Parameters/Quorum_Parameters.htm
 
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コマンドの実行)を行います。

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コマンドの実行)を行います。

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://qwk.testlk.tokyo/lknode01,s3://qwk.testlk.sydney/lknode01         ###S3オブジェクト上にQWKオブジェクトを配置するため設定
QWK_STORAGE_OBJECT_lknode02=s3://qwk.testlk.tokyo/lknode02,s3://qwk.testlk.sydney/lknode02         ###S3オブジェクト上にQWKオブジェクトを配置するため設定

4.クラスタの両ノードで初期化(qwk_storage_initコマンドの実行)を行います。

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日]

return top