対象製品
LifeKeeper for Linux(全バージョン)
【事象】
データレプリケーションリソースの稼働系(ソース側)ノードや、待機系(ターゲット側)ノードにて、次のいずれかの作業を実施した場合、データレプリケーションリソースの起動や同期再開が失敗となることがあります。
■OS や保護対象のパーティションに対するリカバリ(データのリストア)
■保護対象のパーティション(ディスク)の交換
【原因】
起動処理や同期処理が失敗となる原因は、上記作業の影響により、OS が認識しているディスク、パーティションの ID が変更となるためです。
LifeKeeper では、OS 上にて認識されているディスク、パーティションの ID を LifeKeeper 内部に取り入れており、ディスク、パーティションの保護(制御)に活用しています。
LifeKeeper 内部に ID を取り入れる処理は、データレプリケーションリソースを作成及び拡張する際のみ動作します。(OS 上での ID の変更に伴い、LifeKeeper 内部の ID の情報が自動的に更新される仕組みはありません。)
そのため、OS 上にて ID が変更されてしまうと(OS 上と LifeKeeper 上で ID の情報に差異が生じると)、LifeKeeper ではディスク、パーティションの保護が不可となります。
※OS が認識しているディスク、パーティションの ID が変更となる仕組みや条件は、OS や環境(物理やクラウド等)に依存します。
※LifeKeeper 内部で保持している ID が OS 上に存在していないことが原因となり、リソースの起動や同期再開が失敗した際、稼働系ノード側における LifeKeeper のログでは次の情報を記録します。
<稼働系ノード自身で ID の変更が発生しているため、リソースの起動に失敗>
(日時) (ホスト名) restore[PID]: NOTIFY:RKActionHandler:restore:(リソース名):001044:BEGIN restore of "リソース名"
(日時) (ホスト名) restore[PID]: INFO:dr:restore:(リソース名):104160:Delete Flag startup_done (tag:(リソース名), sys:(ホスト名))
(日時) (ホスト名) restore[PID]: INFO:dr:restore:(リソース名):104160:Delete Flag data_corrupt (tag:(リソース名), sys:(ホスト名))
(日時) (ホスト名) restore[PID]: INFO:dr:restore:(リソース名):104161:set(0,(ホスト名)) mirrorinfo 0: (リソース固有の情報)
(日時) (ホスト名) restore[PID]: INFO:dr:restore:(リソース名):104162:set mirrorinfo 0: (リソース固有の情報)
(日時) (ホスト名) restore[PID]: INFO:dr:restore:(リソース名):104162:set mirrorinfo 0: (リソース固有の情報)
(日時) (ホスト名) restore[PID]: ERROR:dr:restore:(リソース名):104026:cannot create /dev/mdXX:
(日時) (ホスト名) restore[PID]: ERROR:dr:restore:(リソース名):104027:mdadm: requested 2 devices in array but listed 1
(日時) (ホスト名) restore[PID]: NOTIFY:RKActionHandler:restore:(リソース名):001046:END failed "restore" of "(リソース名)" with return value of 1
<待機系ノード側で ID の変更が発生しているため、同期の再開に失敗>
(日時) (ホスト名) lkcheck[PID]: ERROR:runit:uncaught_error::000000:getId: getId failed or hint (device) wrong for "(LifeKeeper が認識している ID)"
(日時) (ホスト名) lkcheck[PID]: ERROR:runit:uncaught_error::000000:getId: /opt/LifeKeeper/lkadm/subsys/scsi/CPQARRAY/bin/getId -b "(LifeKeeper が認識している ID)" returned ""
(日時) (ホスト名) lkcheck[PID]: ERROR:runit:uncaught_error::000000:getId: /opt/LifeKeeper/lkadm/subsys/scsi/device/bin/getId -b "(LifeKeeper が認識している ID)" returned ""
(日時) (ホスト名) lkcheck[PID]: ERROR:runit:uncaught_error::000000:getId: /opt/LifeKeeper/lkadm/subsys/scsi/disk/bin/getId -b "(LifeKeeper が認識している ID)" returned ""
(日時) (ホスト名) lkcheck[PID]: ERROR:runit:uncaught_error::000000:getId: /opt/LifeKeeper/lkadm/subsys/scsi/gpt/bin/getId -b "(LifeKeeper が認識している ID)" returned ""
(日時) (ホスト名) lkcheck[PID]: ERROR:runit:uncaught_error::000000:getId: /opt/LifeKeeper/lkadm/subsys/scsi/i2o/bin/getId -b "(LifeKeeper が認識している ID)" returned ""
(日時) (ホスト名) lkcheck[PID]: ERROR:runit:uncaught_error::000000:getId: /opt/LifeKeeper/lkadm/subsys/scsi/IDE/bin/getId -b "(LifeKeeper が認識している ID)" returned ""
(日時) (ホスト名) lkcheck[PID]: ERROR:runit:uncaught_error::000000:getId: /opt/LifeKeeper/lkadm/subsys/scsi/nvme/bin/getId -b "(LifeKeeper が認識している ID)" returned ""
(日時) (ホスト名) lkcheck[PID]: ERROR:runit:uncaught_error::000000:getId: /opt/LifeKeeper/lkadm/subsys/scsi/raw/bin/getId -b "(LifeKeeper が認識している ID)" returned ""
(日時) (ホスト名) lkcheck[PID]: ERROR:runit:uncaught_error::000000:getId: /opt/LifeKeeper/lkadm/subsys/scsi/DEVNAME/bin/getId -b "(LifeKeeper が認識している ID)" returned ""
【対処】
LifeKeeper 内部で保持している、ディスク、パーティションの ID を更新することで事象の解消が可能です。
ID を更新する手順は次のとおりです。
1. 次のコマンドにて、ID の不一致が発生しているデバイスの情報を確認します。
# /opt/LifeKeeper/bin/lcdstatus
上記コマンドの実行結果から、次の情報を確認します。
datarep-test: id=x1x2x3x4x5x6 app=scsi type=netraid state=ISP
initialize=(SEC_ISP) initializes OUT-OF-SERVICE except after failover
info=0/dev/sdb1192.168.0.1501676679device0/opt/LifeKeeper/bitmap__test256M
上記情報の 1行目、「id=」項目に記載の値が、LifeKeeper 内部で保持している ID です。
上記情報の 3行目、「info=」項目に記載のパーティションが、ID の不一致を起こしているパーティションです。
上記例の場合、ID は x1x2x3x4x5x6 、問題のパーティションは /dev/sdb1 となります。
2. 次のコマンドにて、OS が認識している、問題のパーティションの ID を確認します。
# /opt/LifeKeeper/lkadm/subsys/scsi/netraid/bin/getId -i (問題のパーティション)
<例>
# /opt/LifeKeeper/lkadm/subsys/scsi/netraid/bin/getId -i /dev/sdb1
コマンドの実行結果(例)は次のとおりです。
[root@host01 ~]# /opt/LifeKeeper/lkadm/subsys/scsi/netraid/bin/getId -i /dev/sdb1
x7x8x9xaxbxc
3. ID を変更するため、次のコマンドにて LifeKeeper サービスを停止します。
# /opt/LifeKeeper/bin/lkstop
4. ID の変更にあたり、次のコマンドにて、LifeKeeper 上のリソースの構成等に関する情報のバックアップを取得します。
# /opt/LifeKeeper/bin/lkbackup -c
※取得されるファイルの格納先及び名前は、コマンドの実行結果に表示されます。
5. 次のコマンドにて、LifeKeeper が認識している ID を更新(変更)します。
# /opt/LifeKeeper/bin/lk_chg_value -o (LifeKeeper が認識している ID) -n (OS が認識している ID) -T -v -F
※手順4 にて取得するバックアップでは、当作業にて変更する ID の情報が含まれています。
そのため、当作業が何らかの理由により失敗となっても、バックアップをもとに、当作業実施前の状態に戻すことが可能です。
※当手順の例の場合、次の内容にて ID の更新が処理されます。
# /opt/LifeKeeper/bin/lk_chg_value -o x1x2x3x4x5x6 -n x7x8x9xaxbxc -T -v -F
6. 次のコマンドにて、LifeKeeper サービスを再開します。
# /opt/LifeKeeper/bin/lkstart
7. リソースの起動、もしくは同期の再開をお試しください。
8. 次のコマンドを順に実行して、すべてのデータを対象とした同期を実施します。
8-1. 同期を一時停止します。(8-2 のコマンドを実行するため、一時停止が必要になります。)
# /opt/LifeKeeper/bin/mirror_action (リソース名) pause
8-2.すべてのデータを対象とした同期を実施します。
# /opt/LifeKeeper/bin/mirror_action (リソース名) fullresync (稼働系ノードのホスト名) (待機系ノードのホスト名)
8-3.10 分程度待機のうえ、次のコマンドを実行して、同期の状態をご確認ください。
# /opt/LifeKeeper/bin/mirror_status (リソース名)
※コマンドの実行結果に Status: Fully Operational との表示がある場合、同期は復旧している状態
(運用を再開できている状態)です。
※コマンドの実行結果に Status: Resynchronizing との表示がある場合、復旧途中となるため、
もう数分お待ちください。復旧次第、Status: Fully Operational に移行します。
<ID の更新後に同期(上記手順8)が必要となる理由について>
データレプリケーションリソースによる同期は、ファイル単位ではなく、ブロック単位にて実施しているためです。
OS のリカバリやデータのリストア、ディスクの交換を実施した場合、パーティション上でのデータの配置が変更される可能性があります。データの配置が変更された場合、稼働系ノードと待機系ノードにてブロックの情報が不一致となります。結果、同期によるデータ転送を契機に、待機系ノード側ではデータが破損してしまう恐れがあります。
すべてのデータを対象とした同期を実施することで、各ノードにおけるブロックの情報(データの配置)が統一されます。
LifeKeeper にて保護されている共有ディスクを交換する場合の対処につきましては、次の記事をご参照ください。
改訂履歴
[公開日:2024年5月30日]