Red Hat Training
A Red Hat training course is available for Red Hat Ceph Storage
第6章 プレイスメントグループのトラブルシューティング
本章では、Ceph プレイスメントグループ (PG) に関する一般的な問題の解決方法を説明します。
はじめに
- ネットワーク接続を確認してください。詳細は 3章ネットワーク問題のトラブルシューティング を参照してください。
- モニターが quorum を形成可能であることを確認します。モニター関連の問題のトラブルシューティングについては、4章モニターのトラブルシューティング を参照してください。
-
正常な OSD がすべて
up
かつin
であること、またバックフィルと復旧プロセスが完了していることを確認します。OSD 関連の一般的な問題のトラブルシューティングについては、 5章OSD のトラブルシューティング を参照してください。
6.1. プレイスメントグループに関する一般的なエラーメッセージ
以下のテーブルでは、ceph health detail
コマンドで返される最も一般的なエラーメッセージを示しています。各エラーの内容を説明し、その解決方法が記載された対応セクションも表示しています。
また、最適ではない状態に陥ったプレイスメントグループを一覧表示することもできます。詳細は 「stale
、inactive
、unclean
状態のプレイスメントグループ」 を参照してください。
表6.1 プレイスメントグループに関するエラーメッセージ
エラーメッセージ | 参照先 |
---|---|
| |
| |
| |
| |
| |
| |
|
6.1.1. Stale プレイスメントグループ
ceph health
コマンドでは、stale
の プレイスメントグループ (PG) を一覧表示する場合があります。
HEALTH_WARN 24 pgs stale; 3/300 in osds are down
エラー内容
プレイスメントグループがアクティブなプライマリー OSD からステータス更新を受け取らない、またはプライマリー OSD が down
であると他の OSD がレポートした場合、モニターはこのプレイスメントグループを stale
とマークします。
通常は、ユーザーがストレージクラスターを起動してからピアリングプロセスが完了するまで、PG は stale
状態に入ります。ただし、PG が想定期間よりも長く stale
に留まっている場合は、それら PG のプライマリー OSD が down
となっているか、モニターに PG 統計情報を報告していない可能性があります。stale
状態の PG を保存しているプライマリー OSD が up
に戻ると、Ceph は PG の復旧を開始します。
mon_osd_report_timeout
では、OSD が PG 統計情報をモニターに報告する頻度を設定します。デフォルトではこのパラメーターは 0.5
に設定され、OSD は 0.5 秒ごとに統計情報を報告します。
解決方法
どの PG が
stale
にあり、それらがどの OSD に保存されているかを特定します。エラーメッセージには、以下のような情報が含まれます。# ceph health detail HEALTH_WARN 24 pgs stale; 3/300 in osds are down ... pg 2.5 is stuck stale+active+remapped, last acting [2,0] ... osd.10 is down since epoch 23, last address 192.168.106.220:6800/11080 osd.11 is down since epoch 13, last address 192.168.106.220:6803/11539 osd.12 is down since epoch 24, last address 192.168.106.220:6806/11861
-
down
とマークされている OSD の問題を解決します。詳細は、「(1 つ以上の) OSDs Are Down」 を参照してください。
その他の参照先
- Red Hat Ceph Storage 2 の Administration Guide に記載の Monitoring Placement Group States のセクション。
6.1.2. Inconsistent プレイスメントグループ
プレイスメントグループの中には active + clean + inconsistent
とマークされるものがあり、ceph health detail
は以下のようなエラーメッセージを返します。
HEALTH_ERR 1 pgs inconsistent; 2 scrub errors pg 0.6 is active+clean+inconsistent, acting [0,1,2] 2 scrub errors
エラー内容
Ceph がプレイスメントグループ内の 1 つ以上のオブジェクトのレプリカで不一致を検出すると、そのプレイスメントグループを inconsistent
をマークします。一般的な不一致は以下のものです。
- オブジェクトのサイズが正しくない。
- 復旧後にオブジェクトがいずれかのレプリカにない。
ほとんどの場合、スクラビング中のエラーがプレイスメントグループ内での不一致を引き起こします。
解決方法
どのプレイスメントグループが
inconsistent
状態にあるか判定します。# ceph health detail HEALTH_ERR 1 pgs inconsistent; 2 scrub errors pg 0.6 is active+clean+inconsistent, acting [0,1,2] 2 scrub errors
プレイスメントグループが
inconsistent
になっている原因を判定します。プレイスメントグループで詳細なスクラビングプロセスを開始します。
ceph pg deep-scrub <id>
<id>
をinconsistent
プレイスメントグループの ID で置き換えます。例を示します。# ceph pg deep-scrub 0.6 instructing pg 0.6 on osd.0 to deep-scrub
ceph -w
の出力で該当するプレイスメントグループに関連するメッセージを検索します。ceph -w | grep <id>
<id>
をinconsistent
プレイスメントグループの ID で置き換えます。例を示します。# ceph -w | grep 0.6 2015-02-26 01:35:36.778215 osd.106 [ERR] 0.6 deep-scrub stat mismatch, got 636/635 objects, 0/0 clones, 0/0 dirty, 0/0 omap, 0/0 hit_set_archive, 0/0 whiteouts, 1855455/1854371 bytes. 2015-02-26 01:35:36.788334 osd.106 [ERR] 0.6 deep-scrub 1 errors
出力に以下のようなエラーメッセージが含まれる場合は、
inconsistent
プレイスメントグループの修復が可能です。詳細は、「Inconsistent プレイスメントグループの修復」 を参照してください。<pg.id> shard <osd>: soid <object> missing attr _, missing attr <attr type> <pg.id> shard <osd>: soid <object> digest 0 != known digest <digest>, size 0 != known size <size> <pg.id> shard <osd>: soid <object> size 0 != known size <size> <pg.id> deep-scrub stat mismatch, got <mismatch> <pg.id> shard <osd>: soid <object> candidate had a read error, digest 0 != known digest <digest>
出力に以下のようなエラーメッセージが含まれる場合は、
inconsistent
プレイスメントグループの修復を行うとデータが失われる可能性があるので、安全ではありません。この場合は、サポートチケットを開いてください。詳細は 7章Red Hat サポートへの連絡 を参照してください。<pg.id> shard <osd>: soid <object> digest <digest> != known digest <digest> <pg.id> shard <osd>: soid <object> omap_digest <digest> != known omap_digest <digest>
その他の参照先
- 「Inconsistent プレイスメントグループの修復」
- 「不一致の一覧表示」
- Red Hat Ceph Storage 2 の Architecture Guide に記載の Scrubbing のセクション。
- Red Hat Ceph Storage 2 の Configuration Guide に記載の Scrubbing のセクション。
6.1.3. Unclean プレイスメントグループ
ceph health
コマンドで以下のようなエラーメッセージが返されます。
HEALTH_WARN 197 pgs stuck unclean
エラー内容
Ceph 設定ファイルの mon_pg_stuck_threshold
パラメーターで指定されている秒数間、プレイスメントグループが active+clean
状態を達成しないと、Ceph はそのプレイスメントグループを unclean
とマークします。mon_pg_stuck_threshold
のデフォルト値は、300
秒です
プレイスメントグループが unclean
の場合、osd_pool_default_size
パラメーターで指定された回数、複製されていないオブジェクトがそのプレイスメントグループに含まれています。osd_pool_default_size
のデフォルト値は 3
で、Ceph はレプリカを 3 つ作成することになります。
通常、unclean
プレイスメントグループが示すのは、down
となっている OSD があるということです。
解決方法
どの OSD が
down
になっているか判定します。# ceph osd tree
- OSD の問題を解決します。詳細は 「(1 つ以上の) OSDs Are Down」 を参照してください。
その他の参照先
6.1.4. Inactive プレイスメントグループ
ceph health
コマンドで以下のようなエラーメッセージが返されます。
HEALTH_WARN 197 pgs stuck inactive
エラー内容
Ceph 設定ファイルの mon_pg_stuck_threshold
パラメーターで指定されている秒数間、プレイスメントグループがアクティブでなかった場合、Ceph はそのプレイスメントグループを inactive
とマークします。mon_pg_stuck_threshold
のデフォルト値は、300
秒です
通常、inactive
プレイスメントグループが示すのは、down
となっている OSD があるということです。
解決方法
どの OSD が
down
になっているか判定します。# ceph osd tree
- OSD の問題を解決します。詳細は 「(1 つ以上の) OSDs Are Down」 を参照してください。
その他の参照先
6.1.5. プレイスメントグループが down
ceph health detail
コマンドで、プレイスメントグループが down
になっていると報告されます。
HEALTH_ERR 7 pgs degraded; 12 pgs down; 12 pgs peering; 1 pgs recovering; 6 pgs stuck unclean; 114/3300 degraded (3.455%); 1/3 in osds are down ... pg 0.5 is down+peering pg 1.4 is down+peering ... osd.1 is down since epoch 69, last address 192.168.106.220:6801/8651
エラー内容
場合によっては、ピアリングプロセスがブロックされ、プレイスメントグループがアクティブかつ使用可能になりません。通常、OSD の失敗がピアリングの失敗を引き起こしています。
解決方法
ピアリングプロセスをブロックしているものを判定します。
ceph pg <id> query
<id>
を down
となっているプレイスメントグループの ID で置き換えます。例を示します。
# ceph pg 0.5 query { "state": "down+peering", ... "recovery_state": [ { "name": "Started\/Primary\/Peering\/GetInfo", "enter_time": "2012-03-06 14:40:16.169679", "requested_info_from": []}, { "name": "Started\/Primary\/Peering", "enter_time": "2012-03-06 14:40:16.169659", "probing_osds": [ 0, 1], "blocked": "peering is blocked due to down osds", "down_osds_we_would_probe": [ 1], "peering_blocked_by": [ { "osd": 1, "current_lost_at": 0, "comment": "starting or marking this osd lost may let us proceed"}]}, { "name": "Started", "enter_time": "2012-03-06 14:40:16.169513"} ] }
recovery_state
セクションには、ピアリングプロセスがブロックされている原因が表示されています。
-
出力に
peering is blocked due to down osds
というエラーメッセージがある場合は、「(1 つ以上の) OSDs Are Down」 を参照してください。 - これら以外のエラーメッセージがある場合は、サポートチケットを開いてください。詳細は 7章Red Hat サポートへの連絡 を参照してください。
その他の参照先
- Red Hat Ceph Storage 2 の Administration Guide に記載の Peering のセクション。
6.1.6. Unfound オブジェクト
ceph health
コマンドで、unfound
というキーワードを含む以下のようなエラーメッセージが返されます。
HEALTH_WARN 1 pgs degraded; 78/3778 unfound (2.065%)
エラー内容
Ceph は、オブジェクトもしくはそれらの新規コピーが存在することが分かっているものの、見つけられない場合、それらのオブジェクトを unfound
とマークします。その結果、Ceph はそれらのオブジェクトを復旧できず、復旧プロセスを進めることができません。
例
プレイスメントグループがデータを osd.1
と osd.2
に保存します。
-
osd.1
がdown
となります。 -
osd.2
が書き込み操作を処理します。 -
osd.1
がup
となります。 -
osd.1
とosd.2
のピアリングプロセスが開始されます。osd.1
にないオブジェクトが復旧のキューに登録されます。 -
Ceph が新規オブジェクトをコピーする前に、
osd.2
がdown
となります。
この結果、osd.1
はオブジェクトが存在することは分かっているものの、そのオブジェクトを保存している OSD がない状態になります。
このシナリオでは、Ceph は失敗しているノードが再度アクセス可能になること待機し、unfound
オブジェクトが復旧プロセスをブロックします。
解決方法
unfound
オブジェクトが含まれているプレイスメントグループを判定します。# ceph health detail HEALTH_WARN 1 pgs recovering; 1 pgs stuck unclean; recovery 5/937611 objects degraded (0.001%); 1/312537 unfound (0.000%) pg 3.8a5 is stuck unclean for 803946.712780, current state active+recovering, last acting [320,248,0] pg 3.8a5 is active+recovering, acting [320,248,0], 1 unfound recovery 5/937611 objects degraded (0.001%); **1/312537 unfound (0.000%)**
そのプレイスメントグループについての詳細情報を表示します。
# ceph pg <id> query
<id>
をunfound
オブジェクトが含まれているプレイスメントグループの ID で置き換えます。例を示します。# ceph pg 3.8a5 query { "state": "active+recovering", "epoch": 10741, "up": [ 320, 248, 0], "acting": [ 320, 248, 0], <snip> "recovery_state": [ { "name": "Started\/Primary\/Active", "enter_time": "2015-01-28 19:30:12.058136", "might_have_unfound": [ { "osd": "0", "status": "already probed"}, { "osd": "248", "status": "already probed"}, { "osd": "301", "status": "already probed"}, { "osd": "362", "status": "already probed"}, { "osd": "395", "status": "already probed"}, { "osd": "429", "status": "osd is down"}], "recovery_progress": { "backfill_targets": [], "waiting_on_backfill": [], "last_backfill_started": "0\/\/0\/\/-1", "backfill_info": { "begin": "0\/\/0\/\/-1", "end": "0\/\/0\/\/-1", "objects": []}, "peer_backfill_info": [], "backfills_in_flight": [], "recovering": [], "pg_backend": { "pull_from_peer": [], "pushing": []}}, "scrub": { "scrubber.epoch_start": "0", "scrubber.active": 0, "scrubber.block_writes": 0, "scrubber.finalizing": 0, "scrubber.waiting_on": 0, "scrubber.waiting_on_whom": []}}, { "name": "Started", "enter_time": "2015-01-28 19:30:11.044020"}],
might_have_unfound
セクションには、Ceph がunfound
オブジェクトを見つけようとした OSD が含まれます。-
already probed
ステータスは、Ceph が そのunfound
オブジェクトを OSD で見つけられないことを示します。 -
osd is down
ステータスは、Ceph が OSD に連絡できないことを示します。
-
-
down
とマークされている OSD の問題を解決します。詳細は、「(1 つ以上の) OSDs Are Down」 を参照してください。 -
OSD を
down
としている問題を解決できない場合は、サポートチケットを開いてください。詳細は 7章Red Hat サポートへの連絡 を参照してください。
6.2. stale
、inactive
、unclean
状態のプレイスメントグループ
プレイスメントグループは失敗後、degraded
または peering
といった状態になります。この状態は、失敗空の復旧プロセスによる正常な進行状況を示しています。
ただし、これらの状態にプレイスメントグループが想定よりも長い時間留まっている場合は、より大きな問題である可能性があります。プレイスメントグループが最適でない状態に留まっている場合は、モニターが報告します。
以下の表では、これらの状態とその説明を示しています。
State | 説明 | 一般的な原因 | 参照先 |
---|---|---|---|
|
PG が読み取り/書き込みリクエストを実行できない。 |
| |
|
望ましい回数複製されていないオブジェクトが PG に含まれている。なんらかの原因で PG の復旧ができない。 |
| |
|
|
|
Ceph 設定ファイル内の mon_pg_stuck_threshold
パラメーターで設定された秒数が経過すると、プレイスメントグループ はinactive
、unclean
、または stale
であるとみなされます。
stuck した PG を一覧表示します。
# ceph pg dump_stuck inactive # ceph pg dump_stuck unclean # ceph pg dump_stuck stale
その他の参照先
- Red Hat Ceph Storage 2 の Administration Guide に記載の Monitoring Placement Group States のセクション。
6.3. 不一致の一覧表示
rados
ユーティリティーを使ってオブジェクトの各レプリカにおける不一致を一覧表示することができます。 --format=json-pretty
オプションを使うとより詳細な出力が返されます。
以下を一覧表示することが可能です。
プール内で一致しないプレイスメントグループの一覧表示
rados list-inconsistent-pg <pool> --format=json-pretty
例えば、data
というプール内で一致しないプレイスメントグループを一覧表示するには、以下を実行します。
# rados list-inconsistent-pg data --format=json-pretty [0.6]
プレイスメントグループ内で一致しないオブジェクトの一覧表示
rados list-inconsistent-obj <placement-group-id>
例えば、ID が 0.6
であるプレイスメントグループ内で一致しないオブジェクトを一覧表示するには、以下を実行します。
# rados list-inconsistent-obj 0.6 { "epoch": 14, "inconsistents": [ { "object": { "name": "image1", "nspace": "", "locator": "", "snap": "head", "version": 1 }, "errors": [ "data_digest_mismatch", "size_mismatch" ], "union_shard_errors": [ "data_digest_mismatch_oi", "size_mismatch_oi" ], "selected_object_info": "0:602f83fe:::foo:head(16'1 client.4110.0:1 dirty|data_digest|omap_digest s 968 uv 1 dd e978e67f od ffffffff alloc_hint [0 0 0])", "shards": [ { "osd": 0, "errors": [], "size": 968, "omap_digest": "0xffffffff", "data_digest": "0xe978e67f" }, { "osd": 1, "errors": [], "size": 968, "omap_digest": "0xffffffff", "data_digest": "0xe978e67f" }, { "osd": 2, "errors": [ "data_digest_mismatch_oi", "size_mismatch_oi" ], "size": 0, "omap_digest": "0xffffffff", "data_digest": "0xffffffff" } ] } ] }
不一致の原因を判定するには、以下のフィールドが重要になります。
-
name
: 一致しないレプリカのあるオブジェクト名 -
nspace
: プールの論理分離であるネームスペース。デフォルトでは空白です。 -
locator
: 配置の際にオブジェクト名の代わりとして使用されるキー。 -
snap
: オブジェクトのスナップショット ID。オブジェクトの唯一書き込み可能なバージョンは、head
と呼ばれます。オブジェクトがクローンの場合、このフィールドにはシーケンシャル ID が含まれます。 -
version
: 一致しないレプリカのあるオブジェクトのバージョン ID。オブジェクトへの書き込み操作がある度にこれが増加します。 errors
: シャード間に不一致があることを示すエラー一覧。どのシャードが間違っているかは判定しません。このエラーの詳細については、shard
アレイを参照してください。-
data_digest_mismatch
: ある OSD から読み込まれたレプリカのダイジェストが別の OSD とは異なっています。 -
size_mismatch
: クローンまたはhead
オブジェクトのサイズが想定値に一致しません。 -
read_error
: ディスクのエラーで発生した可能性が高い不一致を示すエラーです。
-
union_shard_error
: シャードに固有の全エラーの集合。これらのエラーは、問題のあるシャードに関連しています。oi
で終わるエラーは、問題のあるオブジェクトからの情報を選択したオブジェクトのものと比較する必要があることを示しています。このエラーの詳細は、shard
アレイを参照してください。上記の例では、
osd.2
に保存されているオブジェクトレプリカのダイジェストが、osd.0
およびosd.1
に保存されているレプリカのものとは異なっています。具体的には、レプリカのダイジェストが、osd.2
から読み込まれたシャードからの計算による0xffffffff
ではなく、0xe978e67f
になっています。また、osd.2
から読み込まれたレプリカのサイズは 0 ですが、osd.0
とosd.1
がレポートしているサイズは 968 です。
プレイスメントグループ内で一致しないスナップショットセットの一覧表示
rados list-inconsistent-snapset <placement-group-id>
例えば、ID が 0.23
であるプレイスメントグループ内で一致しないスナップショットのセット (snapsets
) を一覧表示するには、以下を実行します。
# rados list-inconsistent-snapset 0.23 --format=json-pretty { "epoch": 64, "inconsistents": [ { "name": "obj5", "nspace": "", "locator": "", "snap": "0x00000001", "headless": true }, { "name": "obj5", "nspace": "", "locator": "", "snap": "0x00000002", "headless": true }, { "name": "obj5", "nspace": "", "locator": "", "snap": "head", "ss_attr_missing": true, "extra_clones": true, "extra clones": [ 2, 1 ] } ]
このコマンドは、以下のエラーを返しています。
-
ss_attr_missing
: 1 つ以上の属性がありません。属性は、キーと値のペア一覧としてスナップショットセットにエンコードされた情報です。 -
ss_attr_corrupted
: 1 つ以上の属性のデコードに失敗しました。 -
clone_missing
: クローンがありません。 -
snapset_mismatch
: スナップショットセット自体に不一致があります。 -
head_mismatch
: スナップショットセットはhead
の存在の有無を示しますが、スクラビングの結果ではその逆が示されます。 -
headless
: スナップショットセットのhead
がありません。 -
size_mismatch
: クローンまたはhead
オブジェクトのサイズが想定値に一致しません。
その他の参照先
6.4. Inconsistent プレイスメントグループの修復
詳細なスクラビング中のエラーにより、プレイスメントグループに不一致が含まれる場合があります。Ceph はこれらのプレイスメントグループを inconsistent
とレポートします。
HEALTH_ERR 1 pgs inconsistent; 2 scrub errors pg 0.6 is active+clean+inconsistent, acting [0,1,2] 2 scrub errors
修復が可能なのは、特定の不一致のみです。Ceph のログに以下のエラーが含まれる場合は、そのプレイスメントグループを修復しないでください。
<pg.id> shard <osd>: soid <object> digest <digest> != known digest <digest> <pg.id> shard <osd>: soid <object> omap_digest <digest> != known omap_digest <digest>
代わりにサポートチケットを開いてください。詳細は 7章Red Hat サポートへの連絡 を参照してください。
inconsistent
プレイスメントグループを修復します。
ceph pg repair <id>
<id>
を inconsistent
プレイスメントグループの ID で置き換えます。
その他の参照先
6.5. PG カウントの増加
プレイスメントグループ (PG) の数が十分でないと、Ceph クラスターおよびデータ配分のパフォーマンスに影響が出ます。これは、nearfull osds
エラーメッセージの主な原因の 1 つです。
推奨される数は、OSD あたり 100 から 300 の PG です。クラスターにさらに OSD を追加すると、この比率を下げることができます。
pg_num
と pgp_num
のパラメーターで PG カウントを決定します。これらのパラメーターはプールごとに設定されるので、PG カウントが少ないプールは個別に調整する必要があります。
PG カウントを増やす作業は、Ceph クラスターで行う最も集中的なプロセスになります。これは落ち着いて組織的に実行しないと、パフォーマンスに重大な影響を与えかねません。pgp_num
を増やすと、このプロセスを停止したり戻したりすることはできず、完了させる必要があります。
PG カウントを増やす場合は業務の重要な処理時間外に実行し、パフォーマンスに影響が出る可能性を全クライアントに通知することを検討してください。
クラスターが HEALTH_ERR
状態にある場合は、PG カウントを変更しないでください。
手順: PG カウントの増加
個別の OSD および OSD ホストへのデータ配分およびリカバリーの影響を低減します。
osd max backfills
、osd_recovery_max_active
、およびosd_recovery_op_priority
パラメーターの値を低くします。# ceph tell osd.* injectargs '--osd_max_backfills 1 --osd_recovery_max_active 1 --osd_recovery_op_priority 1'
簡易および詳細なスクラブを無効にします。
# ceph osd set noscrub # ceph osd set nodeep-scrub
-
Ceph Placement Groups (PGs) per Pool Calculator を利用して
pg_num
とpgp_num
のパラメーターの値を計算します。 pg_num
の値を希望する数値になるまで少しずつ増やします。- 最初に増やす値を決定します。2 のべき乗の低い数を使用し、クラスターへの影響が分かったら、これを増やします。最適な値は、プールのサイズ、OSD カウント、クライアントの I/O 負荷によって異なります。
pg_num
の値を増やします。ceph osd pool set <pool> pg_num <value>
プール名と新しい値を指定します。例を示します。
# ceph osd pool set data pg_num 4
クラスターのステータス監視します。
# ceph -s
PG の状態は
creating
からactive+clean
に替わります。すべての PG がactive+clean
状態になるまで待機します。
pgp_num
の値を希望する数値になるまで少しずつ増やします。- 最初に増やす値を決定します。2 のべき乗の低い数を使用し、クラスターへの影響が分かったら、これを増やします。最適な値は、プールのサイズ、OSD カウント、クライアントの I/O 負荷によって異なります。
pgp_num
の値を増やします。ceph osd pool set <pool> pgp_num <value>
プール名と新しい値を指定します。例を示します。
# ceph osd pool set data pgp_num 4
クラスターのステータス監視します。
# ceph -s
PG の状態は、
peering
、wait_backfill
、backfilling
、recover
などに替わります。すべての PG がactive+clean
状態になるまで待機します。
- PG カウントが足りないすべてのプールで上記のステップを繰り返します。
osd max backfills
、osd_recovery_max_active
、およびosd_recovery_op_priority
をデフォルト値に設定します。# ceph tell osd.* injectargs '--osd_max_backfills 1 --osd_recovery_max_active 3 --osd_recovery_op_priority 3'
簡易および詳細なスクラブを有効にします。
# ceph osd unset noscrub # ceph osd unset nodeep-scrub
その他の参照先
- 「Nearfull OSDs」
- Red Hat Ceph Storage 2 の Administration Guide に記載の Monitoring Placement Group States のセクション。