コンテンツにスキップ

データ書き込み遅延の対処方法

概要

本ドキュメントでは、データ書き込みレイテンシが大きい問題を対象に、トラブルシューティングの考え方を整理します。

インフラストラクチャ設定の確認

1 時刻の確認

Guance関連サービス のマシン時刻が正常であることを確認します。遅延がある場合は、マシンのタイムゾーンと時刻を調整します。

2 データノード設定の確認

ストレージエンジンのデータノード 設定が、実際のリソース状況に応じて変更されているか確認します。

1)データノードのマシン構成を確認します

# サーバーのCPUおよびメモリ構成を確認
cat /proc/cpuinfo
free -g

2)ストレージエンジンの関連設定が、デプロイ時に変更されたか確認します。

3)変更されていない場合は、以下の設定ガイドに従って変更します。

上記の確認でリソース状況が 8c32g の場合を想定します。

        # 一般的にはlimitsの半分に設定
        ## リソースが十分に大きい場合、最大32gに設定します。超過分はリソースの無駄になります。
        - name: OPENSEARCH_JAVA_OPTS
          value: -Xmx14g -Xms14g
        # limitsは余裕を持たせ、他のプログラムやシステムにCPUとメモリの余力を残す必要があります
        REsources:
          limits:
            cpu: "7"
            memory: 28Gi
          requests:
            cpu: "7"
            memory: 7Gi

業務ロジックによるトラブルシューティング

以下はトラブルシューティングのロジックを示すマインドマップです。この図に従って、調査の順序を決定します。

1 kodo-x サービスの再起動頻度を確認

kubectl get pods -n forethought-kodo

2 Redis ミドルウェアの確認

Redis のパフォーマンスがボトルネックになっていないか確認します。CPU またはメモリの使用率が高い場合は、垂直スケーリングを実施します。

3 topic に基づいてストレージエンジンの種類を判断

1)middleware Namespace の nsqadmin サービスの service 設定を NodePort に変更します。

kubectl patch svc  nsqadmin -n middleware -p '{"spec": {"type": "NodePort"}}'

ブラウザで、node_IP + ポート形式でアクセスします。

2)topic 名に基づいて、ストレージエンジンの種類を特定します

df_metric_xxx で始まるものは時系列エンジン、それ以外の topic はすべてログエンジンのデータです。

3)データノードのパフォーマンスを確認

リソース消費が大きすぎる場合は、エンジン異常対応 の内容を参照してください。

4)対応するサービスのデータを確認

フィールド名 フィールド説明
Topic メッセージキューの名前
Depth 現在のトピックのメッセージキュー内の未処理メッセージ数
In-Flight 現在コンシューマーが取得したが、処理完了を確認していないメッセージ数
Deferred 再エンキューされた、または明示的に遅延配信するために配信されていないメッセージ数
Connections 現在の最大同時消費接続数

4 エンジン異常対応

4.1 単一ノードの負荷が高い場合

Guanceのすべてのインデックス設定はデフォルトで1シャードです。つまり、1つのデータノードのみが処理を行うため、ここでパフォーマンスのボトルネックが発生します。そのため、管理画面にログインし、インデックスのシャード数を調整して、データノードの並列処理能力を向上させる必要があります。

このとき、nsq 管理ページを頻繁にリフレッシュし、Channel の Depth の滞留数が大幅に減少していることを確認できれば、対応は成功です。

4.2 クラスター全体の負荷が高い場合

クラスター全体の負荷が高い場合は、水平スケーリングまたは垂直スケーリングを検討します。

ログエンジンの容量計画 を参照してください。

5 消費能力不足による kodo-x サービスのスケーリング

上記の方法でもデータ滞留の問題が解決しない場合、nsq 管理画面の Channel の connections 数が少なすぎて、大量のデータリクエストを処理しきれていない可能性があります。この場合は、kodo-x サービスの数をスケーリングします。

マシンリソースが十分な場合、通常は2倍ずつスケーリングします。上記の nsq 管理ページの Depth 滞留が明らかに減少するまで続けます。

kubectl scale -n forethought-kodo deployment kodo-x --replicas=<kodo-x * 2> 

フィードバック

このページは役に立ちましたか?