システムテーブルの概要
システムテーブルの概要
システムテーブルは次の情報を提供します:
- サーバーの状態、プロセス、および環境。
- サーバーの内部プロセス。
- ClickHouseバイナリがビルドされたときに使用されたオプション。
システムテーブル:
system
データベースに配置されています。- データを読み取る専用です。
- 削除や変更はできませんが、切り離すことはできます。
ほとんどのシステムテーブルはデータをRAMに格納します。ClickHouseサーバーは起動時にこれらのシステムテーブルを作成します。
他のシステムテーブルとは異なり、システムログテーブル metric_log、 query_log、 query_thread_log、 trace_log、 part_log、 crash_log、 text_log および backup_log は MergeTree テーブルエンジンによって提供され、デフォルトではファイルシステムにデータを格納します。ファイルシステムからテーブルを削除すると、ClickHouseサーバーは次回のデータ書き込み時に空のテーブルを再作成します。新しいリリースでシステムテーブルのスキーマが変更された場合、ClickHouseは現在のテーブルの名前を変更し、新しいものを作成します。
システムログテーブルは、 /etc/clickhouse-server/config.d/
にテーブルと同名の設定ファイルを作成するか、 /etc/clickhouse-server/config.xml
に対応する要素を設定することでカスタマイズできます。カスタマイズできる要素は次のとおりです:
database
: システムログテーブルが属するデータベース。このオプションは非推奨です。すべてのシステムログテーブルはデータベースsystem
にあります。table
: データを挿入するテーブル。partition_by
: PARTITION BY 表現を指定します。ttl
: テーブル TTL 表現を指定します。flush_interval_milliseconds
: ディスクへのデータフラッシュの間隔。engine
: パラメータを伴う完全なエンジンの表現(ENGINE =
で始まる)を提供します。このオプションはpartition_by
およびttl
と競合します。一緒に設定された場合、サーバーは例外を発生させて終了します。
例:
デフォルトでは、テーブルの成長は無制限です。テーブルのサイズを制御するには、古いログレコードを削除するために TTL 設定を使用できます。また、 MergeTree
エンジンテーブルのパーティショニング機能を使用することもできます。
システムメトリクスのソース
システムメトリクスを収集するためにClickHouseサーバーは次を使用します:
CAP_NET_ADMIN
権限。- procfs(Linux のみ)。
procfs
ClickHouseサーバーに CAP_NET_ADMIN
権限がない場合、ProcfsMetricsProvider
にフォールバックしようとします。 ProcfsMetricsProvider
はCPUおよびI/Oのためのクエリごとのシステムメトリクスを収集することを可能にします。
procfs がシステムでサポートされ有効になっている場合、ClickHouseサーバーは次のメトリクスを収集します:
OSCPUVirtualTimeMicroseconds
OSCPUWaitMicroseconds
OSIOWaitMicroseconds
OSReadChars
OSWriteChars
OSReadBytes
OSWriteBytes
OSIOWaitMicroseconds
は、Linuxカーネルのバージョン 5.14.x 以降でデフォルトで無効です。これを有効にするには、sudo sysctl kernel.task_delayacct=1
を使用するか、 /etc/sysctl.d/
に kernel.task_delayacct = 1
を含む .conf
ファイルを作成します。
ClickHouse Cloudのシステムテーブル
ClickHouse Cloud のシステムテーブルは、セルフマネージドデプロイメントと同様に、サービスの状態とパフォーマンスに関する重要な洞察を提供します。一部のシステムテーブルはクラスタ全体で操作され、特に分散メタデータを管理するKeeper ノードからデータを派生するものです。これらのテーブルはクラスタの集合的な状態を反映し、個々のノードでクエリされたときに一貫している必要があります。例えば、 parts
はクエリを実行するノードに関係なく一貫であるべきです:
逆に、他のシステムテーブルはノード特有のものであり、例えばメモリ内で動作するか、MergeTree テーブルエンジンを使用してデータを永続化します。これは、ログやメトリクスなどのデータに典型的です。この永続性により、履歴データは分析のために利用可能なまま維持されます。これらのノード特有のテーブルは、本質的に各ノードに固有です。
一般的に、システムテーブルがノード特有であるかどうかを判断する際に適用されるルールは次のとおりです:
_log
サフィックスを持つシステムテーブル。- メトリクスを公開するシステムテーブル(例:
metrics
、asynchronous_metrics
、events
)。 - 進行中のプロセスを公開するシステムテーブル(例:
processes
、merges
)。
さらに、システムテーブルの新しいバージョンは、アップグレードやスキーマの変更の結果として作成されることがあります。これらのバージョンは、数値サフィックスを使用して命名されます。
例えば、ノードによって実行された各クエリの行を含む system.query_log
テーブルを考えてみましょう:
複数バージョンのクエリ
これらのテーブルを使用して、 merge
関数を使用してクエリを実行できます。例えば、以下のクエリは、各 query_log
テーブルに対してターゲットノードに送信された最新のクエリを特定します:
テーブルの数値サフィックスはデータの順序を示唆することができますが、決して依存すべきではありません。このため、特定の日付範囲を対象とするときは、常にマージテーブル関数を使用し、日付フィルタを組み合わせて使用する必要があります。
重要なことに、これらのテーブルは 各ノードにローカル です。
ノードを越えたクエリ
クラスタ全体を総合的に表示するために、ユーザーは clusterAllReplicas
関数を merge
関数と組み合わせて活用できます。 clusterAllReplicas
関数は、"default" クラスター内のすべてのレプリカでシステムテーブルをクエリできるようにし、ノード特有のデータを統一された結果に統合します。 merge
関数と組み合わせることで、クラスタ内の特定のテーブルに対するすべてのシステムデータをターゲットにすることができます。
このアプローチは、クラスタ全体の操作を監視し、デバッグするために特に価値があります。これにより、ユーザーはClickHouse Cloudデプロイメントの健康状態とパフォーマンスを効果的に分析できます。
ClickHouse Cloud は、冗長性とフェールオーバーのために複数のレプリカのクラスターを提供します。これにより、動的なオートスケーリングとゼロダウンタイムのアップグレードなどの機能が有効になります。ある時点で、新しいノードがクラスターに追加されるか、クラスターから削除されるプロセスにある可能性があります。これらのノードをスキップするには、以下のように clusterAllReplicas
を使用するクエリに SETTINGS skip_unavailable_shards = 1
を追加します。
例えば、分析にしばしば重要な query_log
テーブルをクエリするときの違いを考えてみましょう。
ノードとバージョンを越えたクエリ
システムテーブルのバージョンにより、これは依然としてクラスター内の完全なデータを表すわけではありません。上記を merge
関数と組み合わせることで、特定の日付範囲の正確な結果を得ることができます: