第23章 ファイルのスプリットブレインの手動リカバリー
- 以下のコマンドを実行して、スプリットブレインにあるファイルのパスを取得します。
gluster volume heal VOLNAME info split-brain
# gluster volume heal VOLNAME info split-brainCopy to Clipboard Copied! Toggle word wrap Toggle overflow コマンド出力から、クライアントから実行したファイル操作が Input/Output エラーで失敗したファイルを特定します。 - マウントポイントからスプリットブレインファイルを開くアプリケーションを閉じます。仮想マシンを使用している場合は、マシンの電源をオフにする必要があります。
- getfattr コマンドを使用して、ファイルの AFR changelog 拡張属性を取得して検証します。次に、スプリットブレインのタイプを特定し、ファイルの 'good copy' が含まれるブリックを決定します。
getfattr -d -m . -e hex <file-path-on-brick>
getfattr -d -m . -e hex <file-path-on-brick>Copy to Clipboard Copied! Toggle word wrap Toggle overflow 以下に例を示します。Copy to Clipboard Copied! Toggle word wrap Toggle overflow trusted.afr.VOLNAMEvolname-client-<subvolume-index> を持つ拡張属性は、ファイルの changelog を維持するために AFR によって使用されます。trusted.afr.VOLNAMEvolname-client-<subvolume-index> の値は、glusterFS クライアント (FUSE または NFS-server) プロセスにより計算されます。glusterFS クライアントがファイルまたはディレクトリーを変更すると、クライアントは各ブリックに問い合わせ、ブリックのレスポンスに従って changelog 拡張属性を更新します。subvolume-index は gluster volume info VOLNAME のbrick number - 1です。以下に例を示します。Copy to Clipboard Copied! Toggle word wrap Toggle overflow 上記の例では、以下のようになります。Copy to Clipboard Copied! Toggle word wrap Toggle overflow ブリック内の各ファイルは、それ自体の変更ログと、そのブリックがレプリカセット内の他のすべてのブリックに存在するファイルを維持します。上記の例のボリュームでは、brick-a のすべてのファイルにはエントリーが 2 つ、それ自体には、そのレプリカペアにあるファイルのもう 1 つがエントリーになります。以下は、brick2 の changelog です。- trusted.afr.vol-client-0=0x000000000000000000000000 - is the changelog for itself (brick1)
- trusted.afr.vol-client-1=0x000000000000000000000000 - changelog for brick2 as seen by brick1
同様に、brick2 のすべてのファイルは以下のようになります。- trusted.afr.vol-client-0=0x000000000000000000000000 - changelog for brick1 as seen by brick2
- trusted.afr.vol-client-1=0x000000000000000000000000 - changelog for itself (brick2)
注記このファイルは、レプリカの他のブリックにのみエントリーを持ちません。たとえば、brick1にはtrusted.afr.vol-client-1が設定され、brick2にはtrusted.afr.vol-client-0だけが設定されます。changelog の解釈は、以下の説明と同じです。他のレプリカのペアでも同じ拡張が可能です。changelog (保留中の操作数) 値を解釈
各拡張属性には、24 進数の 16 進数の値があります。最初の 8 桁はデータの変更ログを表します。2 番目の 8 桁はメタデータの変更ログを表します。最後の 8 桁はディレクトリーエントリーの変更ログを表します。
同じ語を表す Pictally は以下の通りです。0x 000003d7 00000001 00000000110 | | | | | \_ changelog of directory entries | \_ changelog of metadata \ _ changelog of data0x 000003d7 00000001 00000000110 | | | | | \_ changelog of directory entries | \_ changelog of metadata \ _ changelog of dataCopy to Clipboard Copied! Toggle word wrap Toggle overflow ディレクトリーの場合は、メタデータおよびエントリー変更ログは有効です。通常のファイルでは、データおよびメタデータの changelogs が有効となります。デバイスファイルなどの特別なファイルの場合は、メタデータの変更ログが有効になります。ファイルのスプリットブレインが発生すると、データスプリットブレインまたはメタデータスプリットブレインのいずれかになります。以下は、同じファイルにあるメタデータのスプリットブレインの例です。Copy to Clipboard Copied! Toggle word wrap Toggle overflow changelogs のスクラッチ
ファイル/rhgs/brick1/aの changelog 拡張属性は以下のとおりです。trusted.afr.vol-client-0 are all zeros (0x00000000................)の最初の 8 桁trusted.afr.vol-client-1の最初の 8 桁は、すべてのゼロ (0x000003d7................) ではありません。そのため、/rhgs/brick-a/aの changelog は、一部のデータ操作が、/rhgs/brick2/aで失敗したことを示します。trusted.afr.vol-client-0 are all zeros (0x........00000000........)の 2 番目の 8 桁と、trusted.afr.vol-client-1の 2 番目の 8 桁がすべてゼロ (0x........00000001........) ではありません。そのため、/rhgs/brick1/aの changelog は、一部のデータ操作が、/rhgs/brick2/aで失敗したことを示します。
ファイル/rhgs/brick2/aの changelog 拡張属性は以下のとおりです。- 最初の 8 桁の
trusted.afr.vol-client-0は、すべてのゼロ(0x000003b0................)ではありません。trusted.afr.vol-client-1の最初の 8 桁はすべて 0x00000000................ です。そのため、/rhgs/brick2/aの changelog は、一部のデータ操作が、/rhgs/brick1/aで失敗したことを示します。 trusted.afr.vol-client-0の 2 番目の 8 桁は、ゼロ(0x........00000001........)trusted.afr.vol-client-1の 2 番目の 8 桁はすべてゼロ(0x........00000000........)です。そのため、/rhgs/brick2/aの changelog は、一部のデータ操作が、/rhgs/brick1/aで失敗したことを示します。
ここでは、両方のコピーには、他のファイル上にないデータ、メタデータの変更があります。したがって、これはデータとメタデータのスプリットブレインです。正しいコピーの決定
ファイルの stat および getfattr の出力を検査して、保持するメタデータとファイルの内容を決定し、保持するデータを決定する必要があります。上記の例を続けるために、ここでは
/rhgs/brick1/aのデータと/rhgs/brick2/aのメタデータを保持しています。スプリットブレインを解決するための関連する changelogs のリセット
データスプリットブレインの解決
ファイルの changelog 拡張属性を、
/rhgs/brick1/aで成功しているが /rhgs/brick-b/a で失敗したかのようにファイルを変更する必要があります。ただし、/rhgs/brick2/aには、/rhgs/brick2/aでデータ操作が成功したことを示す changelog はありませんが、/rhgs/brick1/aで失敗します。/rhgs/brick2/aの trusted.afr.vol-client-0 で changelog のデータ部分をリセットする必要があります。メタデータのスプリットブレインの解決
ファイルの変更ログ拡張属性は、/rhgs/brick2/aで成功したものの、/rhgs/brick1/aで失敗したかのように、ファイルの changelog 拡張属性を変更する必要があります。ただし、/rhgs/brick1/aには、一部のメタデータ操作が/rhgs/brick1/aで成功しても /rhgs /brick2/a で失敗したことを示す changelog を含めることはできません。/rhgs/brick1/aの trusted.afr.vol-client-1 の changelog のメタデータ部分をリセットする必要があります。以下のコマンドを実行して、拡張属性をリセットします。trusted.afr.vol-client-0 0x000003b00000000100000000から0x000000000000000100000000にするには、/rhgs/brick2/aで以下のコマンドを実行します。setfattr -n trusted.afr.vol-client-0 -v 0x000000000000000100000000 /rhgs/brick2/a
# setfattr -n trusted.afr.vol-client-0 -v 0x000000000000000100000000 /rhgs/brick2/aCopy to Clipboard Copied! Toggle word wrap Toggle overflow trusted.afr.vol-client-1 0x0000000000000000ffffffffから0x000003d70000000000000000にするには、/rhgs/brick1/aで以下のコマンドを実行します。setfattr -n trusted.afr.vol-client-1 -v 0x000003d70000000000000000 /rhgs/brick1/a
# setfattr -n trusted.afr.vol-client-1 -v 0x000003d70000000000000000 /rhgs/brick1/aCopy to Clipboard Copied! Toggle word wrap Toggle overflow
拡張属性をリセットすると、changelogs は以下のようになります。Copy to Clipboard Copied! Toggle word wrap Toggle overflow ディレクトリーエントリーのスプリットブレインの解決
AFR には、ディレクトリーにスプリットブレインがある場合に、ディレクトリーに異なるエントリーを一貫してマージする機能があります。1 つのブリックディレクトリー
storageにエントリー1、2があり、他のブリックに3、4のエントリーがある場合、AFR はディレクトリー内の全エントリーをマージして、同じディレクトリーに1, 2, 3, 4エントリーを追加します。ただし、ディレクトリーのファイルが削除されたためスプリットブレインが発生した場合は、ファイルが再び削除される可能性があります。スプリットブレインの解決では、ファイル名が同じエントリーがあり、そのディレクトリーにgfidが異なるエントリーが 1 つ以上ある場合、人間の介入が必要になります。以下に例を示します。brick-aでは、ディレクトリーには、gfid_xを持つfile1と、file2の2つのエントリーがあります。brick-bでは、ディレクトリーには、gfid_yを持つfile1とfile3の 2 つのエントリーがあります。ここでは、ブリック上のfile1の gfid は異なります。このようなディレクトリーのスプリットブレインには、問題の解決に人間の介入が必要です。スプリットブレインを解消するためには、brick-aのfile1かbrick-bのfile1を削除する必要があります。さらに、対応するgfid-linkファイルを削除する必要があります。gfid-linkファイルは、ブリックのトップレベルディレクトリーにある .glusterfsディレクトリーにあります。ファイルの gfid が0x307a5c9efddd4e7c96e94fd4bcdcbd1b(get fattr コマンドから受信した trusted.gfid 拡張属性)の場合、gfid-link ファイルは/rhgs/brick1/.glusterfs/30/7a/307a5c9efddd4e7c96e94fd4bcdcbd1bにあります。警告gfiid-linkを削除する前に、そのブリックに存在するファイルへのハードリンクがないことを確認する必要があります。ハードリンクが存在する場合は、それらを削除する必要があります。 - 以下のコマンドを実行して自己修復をトリガーします。
ls -l <file-path-on-gluster-mount>
# ls -l <file-path-on-gluster-mount>Copy to Clipboard Copied! Toggle word wrap Toggle overflow またはgluster volume heal VOLNAME
# gluster volume heal VOLNAMECopy to Clipboard Copied! Toggle word wrap Toggle overflow