マージ異常は、テスト環境でよく見られる問題の一つです。マージ異常は、クエリの遅延、ディスク容量の異常な使用、DDLの無効化、Checksumエラーなどの問題を引き起こす可能性があります。
皆様が迅速に問題の根本原因を特定し、効率的に解決できるようにするため、本記事では明確で実用的なマージ異常のトラブルシューティングプロセスをまとめました。このプロセスは、明確な操作手順を提供し、問題処理の効率を向上させ、業務への影響を可能な限り軽減することを目的としており、日常的な運用保守作業を強力にサポートします。
マージ異常のトラブルシューティングプロセスは以下の図のとおりです。
手順の紹介
システムテーブルとRS層での並列実行状況を確認します。
テナントのメジャーコンパクション状態を確認します。システムテナント内で、
CDB_OB_MAJOR_COMPACTIONビューを参照し、各テナントのメジャーコンパクション状態を確認します。obclient(root@sys)[oceanbase]> SELECT * FROM oceanbase.CDB_OB_MAJOR_COMPACTION;クエリ結果に基づき、
LAST_SCN = GLOBAL_BROADCAST_SCNの場合、前回のメジャーコンパクションが完了したバージョン番号と現在のメジャーコンパクションのバージョン番号が同じであり、このラウンドのメジャーコンパクションは終了していることを意味します。それ以外の場合は、他のフィールドに基づいてさらに確認する必要があります:IS_SUSPENDED列がTrueの場合、メジャーコンパクションが手動で一時停止されたことを意味します。復元するには、SQLステートメントALTER SYSTEM RESUME MERGE TENANT tenant_name;を実行する必要があります。STATUSが継続的にCOMPACTINGの場合、メジャーコンパクションが停止していることを意味します。さらに調査する必要があります。IS_ERRORがNULLではない場合、さらに調査する必要があります。IS_ERRORの値がCHECKSUM_ERRORの場合、そのテナントでチェックサム検証の不整合が発生したことを意味します。
現在のテナントのすべてのtabletのメジャーコンパクション進捗状況を照会し、指定バージョンにメジャーコンパクションされていないレコードをフィルタリングします。
メジャーコンパクション終了の判定ロジックは、そのテナントのすべてのTablet(要件を満たさない一部のTabletを除外)が指定バージョン番号までメジャーコンパクションされているかどうかを確認することです。いずれか1つのTabletが指定バージョンにメジャーコンパクションされていない場合、そのテナントのメジャーコンパクションは終了しません。次に、そのテナント内で指定バージョンにメジャーコンパクションされていないTabletがどのようなものかを確認する必要があります。
CDB_OB_TABLET_REPLICASおよびCDB_OB_MAJOR_COMPACTIONビューを照会します。tenant_id = 1004を例にします。obclient(root@sys)[oceanbase]> SELECT t.svr_ip, t.svr_port, t.tenant_id, t.ls_id, t.tablet_id, t.compaction_scn AS tablet_version, m.global_broadcast_scn AS target_version FROM oceanbase.CDB_OB_TABLET_REPLICAS t, oceanbase.CDB_OB_MAJOR_COMPACTION m WHERE t.tenant_id = m.tenant_id AND t.tenant_id = 1004 AND m.global_broadcast_scn > 0 AND (t.compaction_scn < m.global_broadcast_scn) ORDER BY t.compaction_scn;クエリ結果に基づき:
クエリ結果がNullの場合、RSの検証段階にあり、メジャーコンパクションが正常であることを意味します。
クエリ結果がNullでない場合、クエリ結果が指定バージョンにメジャーコンパクションされていないTabletです。
ここで、
compaction_scnフィールドはCDB_OB_TABLET_REPLICASビューから取得し、現在のTabletがメジャーコンパクションを完了した最大SCNを示します。global_broadcast_scnフィールドはCDB_OB_MAJOR_COMPACTIONビューから取得し、このラウンドのメジャーコンパクションのターゲットバージョンを示します。compaction_scn < global_broadcast_scnの場合、Tabletのメジャーコンパクションが完了していないことを意味し、さらに調査する必要があります。
Tabletのメジャーコンパクションが完了していない場合、メジャーコンパクションタスクを実行しているTabletがあるかどうかを確認する必要があります。
GV$OB_TABLET_COMPACTION_PROGRESSビューを照会します。tenant_id = 1004を例にします。obclient(root@sys)[oceanbase]> SELECT * FROM oceanbase.GV$OB_TABLET_COMPACTION_PROGRESS WHERE tenant_id = 1004 AND type = "MAJOR_MERGE" AND status LIKE "%RUNNING%";クエリ結果に基づき、メジャーコンパクションを実行しているTabletがある場合、メジャーコンパクションの完了を待機できます。しばらく待っても、実行中のTabletがなく、
CDB_OB_TABLET_REPLICASおよびCDB_OB_MAJOR_COMPACTIONビューで確認した未完了メジャーコンパクションのTablet数が減少しない場合、メジャーコンパクション診断ビューを照会して、問題をさらに特定します。
メジャーコンパクション診断ビューを照会し、診断情報を取得します。
メジャーコンパクション診断ビューには、メジャーコンパクションプロセス中のさまざまな異常エラー情報が含まれており、トラブルシューティングの補助に利用できます。
tenant_id = 1004でメジャーコンパクションが完了していないTabletのTablet_ID = 200001を例にします。obclient(root@sys)[oceanbase]> SELECT * FROM oceanbase.GV$OB_COMPACTION_DIAGNOSE_INFO WHERE TENANT_ID = 1004 AND TABLET_ID = 200001\Gdiagnose_infoフィールドに表示される情報に基づいて、次の処理を行います:weak read ts is not readyまたはslave_read_version is less than freeze_ts, can not merge:スタンバイマシンがメジャーポイントを読み取っていないため、メジャーコンパクションに異常が発生したことを意味します。サポートチームに連絡し、対応を依頼してください。memtable can not minor merge:MemTableがダンプ条件に達していないため、Mini Compactionが遅延し、clogの回収が遅く、メモリが枯渇していることを意味します。サポートチームに連絡し、対応を依頼してください。sstable count is not safe:SSTableの数が多すぎるため、Mini compactionができず、clogの回収が遅く、メモリが枯渇していることを意味します。サポートチームに連絡し、対応を依頼してください。同時に、
diagnose_infoにはSSTableの数が多すぎる原因も表示されます:SNAPSHOT_FOR_MAJOR:Major CompactionSNAPSHOT_FOR_DDL:テーブルのDDL、例えばインデックスの作成。SNAPSHOT_FOR_MULTI_VERSION:マルチバージョンデータが多すぎ、undo_retentionの値が大きすぎる。
dag may hang:DAGが一定時間更新されておらず、停止している可能性があります。10分以上この状態が続く場合、サポートチームに連絡し、対応を依頼してください。freeze_info is invalid:freeze_infoがフラッシュされていないため、メジャーコンパクションに異常が発生したことを意味します。サポートチームに連絡し、対応を依頼してください。memtable rec_log_ts not stable:ログストリームのフリーズプロセス中に、連続する最大コールバック(再生)ポイントが、対応するTabletのMemTableのrec_log_tsを深く押し上げていないことのより根本的な原因は、コールバック(再生)が遅いことです。サポートチームに連絡し、対応を依頼してください。traverse_trans_to_submit_redo_log failed:redo logの送信に失敗したことを意味します。サポートチームに連絡し、対応を依頼してください。trans table has not merged, can not schedule minor merge:V3.2.xバージョンでは、トランザクション状態テーブルのダンプが成功した後に、データテーブルのダンプを開始できるため、データテーブルがダンプされない可能性があります。サポートチームに連絡し、対応を依頼してください。memtable not ready for flush:ログストリームのフリーズプロセス中に、MemTableが長時間ダンプ条件に達していないため、ダンプのタイムアウトやメモリの枯渇が発生する可能性があります。サポートチームに連絡し、対応を依頼してください。memtable no destroy after release:MemTableがリリースされた後、長時間Destroyされていないことを意味します。主な原因はMemTableの参照カウントのリークです。サポートチームに連絡し、対応を依頼してください。memtable can not create dag successfully:MemTableがダンプ条件に達した後、長時間ダンプタスクを正常に開始できないことを意味します。サポートチームに連絡し、対応を依頼してください。compaction has finished in storage:ストレージ層でのメジャーコンパクションは終了したが、RSの後続処理が完了していないことを意味します。サポートチームに連絡し、対応を依頼してください。there is too many tablets. tablet count xxx:診断時に走査するパーティションが多すぎるため、そのLSの診断をスキップしました。
メジャーコンパクション診断ビューのエラー情報に基づいて問題を分類し、具体的な問題については関連ドキュメントや典型的なケースを参照してトラブルシューティングを行います。
典型的なケース
以下のケースでは、モードは区別しません。
OceanBaseデータベースV4.3バージョンでクラスタのメジャーコンパクションが停止し、一部のTabletのコンパクションで
-4016異常が発生した場合。テーブル数がハイウォーターマークを超えると、配列に新しいSSTableを追加できなくなり、その結果、Mini Mergeが実行できない可能性があります。
locality変更プロセス中に、localityを
z1,z2からz1,z2,z3に変更し、新しく追加されたz3上のZoneログストリームがLeaderになった場合、データコンパクション操作が停止する可能性があります。各Zoneのコンパクションが完了してidle状態になった後も、クラスタのメジャーコンパクション状態が
mergingのままの場合。クラスタのメジャーコンパクションが停止し、コンパクション中に帯域幅がフルに使われている場合。