ClickHouse の運用: コミュニティによるデバッグインサイト
このガイドは、コミュニティミートアップから得られた知見を集約したコレクションの一部です。より多くの実運用に基づく解決策や知見については、特定の問題別に閲覧できます。 高い運用コストにお悩みですか?コスト最適化に関するコミュニティのインサイトガイドを参照してください。
重要なシステムテーブル
これらのシステムテーブルは、本番環境でのデバッグに不可欠です。
system.errors
ClickHouse インスタンス内で現在発生しているすべてのエラーを表示します。
system.replicas
クラスターの健全性を監視するためのレプリケーション遅延およびステータス情報を含みます。
system.replication_queue
レプリケーション関連の問題の診断に役立つ詳細情報を提供します。
system.merges
現在実行中のマージ処理を表示し、ハングしているプロセスを特定できます。
system.parts
パーツ数の監視や断片化の問題を特定するうえで不可欠です。
本番環境でよく起きる問題
ディスク容量の問題
レプリケーション構成でディスク容量が枯渇すると、連鎖的な問題が発生します。あるノードの空き容量がなくなると、他のノードは同期を続けようとするため、ネットワークトラフィックのスパイクや原因が分かりにくい症状が発生します。コミュニティメンバーの一人は、単なるディスク容量不足だった問題の調査に 4 時間費やしました。特定のクラスター上のディスクストレージを監視するには、この クエリ を参照してください。
AWS ユーザーは、デフォルトの汎用 EBS ボリュームには 16TB の上限があることに注意してください。
too many parts エラー
小さなデータを高頻度で挿入すると、パフォーマンス問題が発生します。コミュニティでは、1 秒あたり 10 回を超える挿入レートでは、多くの場合 ClickHouse がパーツを十分な速度でマージできないために「too many parts」エラーが発生することが確認されています。
解決策:
- 30 秒または 200MB をしきい値としてデータをバッチ処理する
- 自動バッチ処理のために async_insert を有効にする
- サーバー側でのバッチ処理に buffer テーブルを使用する
- バッチサイズを制御するために Kafka を構成する
公式推奨: 挿入 1 回あたり最小 1,000 行、理想的には 10,000 ~ 100,000 行。
不正なタイムスタンプの問題
任意のタイムスタンプを付与してデータを送信するアプリケーションは、パーティションの問題を引き起こします。その結果、1998 年や 2050 年のような非現実的な日時のデータを含むパーティションが作成され、予期しないストレージの挙動につながります。
ALTER 操作のリスク
マルチテラバイトのテーブルに対する大規模な ALTER 操作は、多くのリソースを消費し、データベースをロックする可能性があります。コミュニティの事例では、14TB のデータ上で Integer 型を Float 型に変更したところ、データベース全体がロックされ、バックアップからの再構築が必要になりました。
高コストな mutation の監視:
まずは小規模なデータセットでスキーマ変更を検証してください。
メモリとパフォーマンス
外部集約
メモリ使用量の大きい処理に対しては、外部集約を有効化してください。ディスクへのスピルが発生するため処理は遅くなりますが、メモリ不足によるクラッシュを防止できます。これは max_bytes_before_external_group_by を設定することで有効化できます。これにより、大規模な GROUP BY 処理時のメモリ不足によるクラッシュを防ぐのに役立ちます。この設定の詳細はこちらを参照してください。
非同期インサートの詳細
非同期インサートは、小さなインサートをサーバー側で自動的にバッチ化してパフォーマンスを向上させます。ディスクへの書き込み完了を待ってから応答を返すかどうかを設定できます。即時に返す方が高速ですが、永続性は低くなります。最近のバージョンでは、バッチ内の重複データを処理するための重複排除もサポートされています。
関連ドキュメント
Distributed テーブルの設定
デフォルトでは、Distributed テーブルは単一スレッドでインサートを実行します。並列処理とシャードへの即時データ送信のために insert_distributed_sync を有効にします。
Distributed テーブルを使用する場合は、一時データの蓄積を監視してください。
パフォーマンス監視のしきい値
コミュニティ推奨の監視しきい値:
- パーティションあたりのパーツ数: 望ましくは 100 未満
- 遅延インサート: 0 を維持すること
- インサートレート: 最適なパフォーマンスのため、おおよそ 1 秒あたり 1 回に制限する
関連ドキュメント
クイックリファレンス
| 課題 | 検知 | 解決策 |
|---|---|---|
| ディスク容量 | system.parts の合計バイト数を確認 | 使用量を監視し、スケーリングを計画 |
| パーツ数過多 | テーブルごとのパーツ数をカウント | バッチ挿入を行い、async_insert を有効化 |
| レプリケーション遅延 | system.replicas の遅延を確認 | ネットワークを監視し、レプリカを再起動 |
| 不正データ | パーティションの日付を検証 | タイムスタンプ検証を実装 |
| ミューテーションが進まない | system.mutations のステータスを確認 | まずは小さなデータでテスト |