並行運用戦略
- リスクを最小限に抑えられる: 両方のシステムを同時に運用することで、ClickStack の検証を進めたり、ユーザーに新しいシステムへ慣れてもらったりする間も、既存のデータやダッシュボードに引き続きアクセスできます。
- データが自然に期限切れになる: オブザーバビリティデータの多くは保持期間が限られており (通常は 30 日以下) 、Elastic 上のデータが期限切れになるのに合わせて自然に移行できます。
- 移行を簡素化できる: システム間で過去データを移動するための複雑なデータ転送ツールやプロセスは必要ありません。
データの移行Elasticsearch から ClickHouse へ重要なデータを移行する方法については、“データの移行” のセクションで紹介しています。ただし、これは大規模なデータセットには推奨されません。Elasticsearch のエクスポート効率に制約があり、対応フォーマットも JSON のみのため、十分な性能が得られないことがほとんどです。
実装手順
二重インジェストを設定する
データ収集パイプラインを設定し、Elastic と ClickStack の両方へ同時にデータを送信します。具体的な方法は、現在収集に使用しているエージェントによって異なります。“Migrating Agents” を参照してください。保持期間を調整する
Elastic の有効期限 (TTL) 設定を、希望する保持期間に合わせて構成します。ClickStack 側でも、同じ期間データを保持するように 有効期限 (TTL) を設定します。検証と比較を行う
- 両方のシステムに対してクエリを実行し、データの整合性を確認する
- クエリのパフォーマンスと結果を比較する
- ダッシュボードとアラートを ClickStack に移行する。現在、これは手動で行う必要があります。
- 重要なダッシュボードとアラートがすべて ClickStack で期待どおりに動作することを確認する
段階的に移行する
- Elastic のデータが自然に期限切れになるにつれて、ClickStack への依存度は徐々に高まります
- ClickStack への信頼性を確認できたら、クエリとダッシュボードの切り替えを開始できます
長期保持
- Elastic 内のすべてのデータが期限切れになるまで、両方のシステムを並行して稼働し続けます
- ClickStack の階層型ストレージ機能は、長期データを効率的に管理するのに役立ちます。
- materialized viewの利用を検討し、集約済みまたはフィルタリング済みの履歴データを保持しつつ、生データは期限切れにできるようにします。
移行スケジュール
- 30日間保持: 移行は1か月以内に完了できます。
- より長い保持期間: データが Elastic から期限切れで削除されるまで、並行運用を継続してください。
- 履歴データ: どうしても必要な場合は、特定の履歴データをインポートするために データの移行 の利用を検討してください。
設定の移行
推奨設定
- ClickHouse Cloud: デフォルトで、単一分片・複数レプリカのアーキテクチャを採用しています。ストレージとコンピュートを独立してスケールできるため、取り込みパターンの予測が難しく、読み取り負荷の高いオブザーバビリティのユースケースに最適です。
- ClickHouse OSS: セルフマネージド環境では、次を推奨します。
- 単一の分片から開始する
- CPU と RAM を追加してスケールアップする
- 階層型ストレージを使用して、ローカルディスクを S3互換のオブジェクトストレージで拡張する
- 高可用性が必要な場合は、
ReplicatedMergeTreeを使用する - 耐障害性の観点では、オブザーバビリティ workloads では通常、各分片に 1 レプリカ で十分です。
分片化が必要な場合
- データ取り込みレートが単一ノードの処理能力を超える場合 (通常は 500K 行/秒超)
- テナントの分離やリージョンごとのデータ分離が必要な場合
- オブジェクトストレージを使用していても、総データ量が単一サーバーでは収まらない場合
保持期間と有効期限 (TTL)
- 有効期限が切れたデータを自動的に削除する
- 古いデータをコールドオブジェクトストレージに移動する
- 高速ディスク上には、最近のよくクエリされるログのみを保持する
データの移行
- データのエンリッチメントに使用する小規模なルックアップテーブル (例: ユーザーマッピング、サービスカタログ)
- Elasticsearch に保存されている業務データのうち、オブザーバビリティデータと相関付ける必要があるもの。ClickHouse の SQL 機能と BI インテグレーションにより、Elasticsearch のより限定的なクエリオプションと比べて、データの維持管理やクエリが容易になります。
- 移行後も保持する必要がある設定データ
スキーマの移行
Elasticsearchから移行する索引に対応するテーブルをClickHouseに作成します。ElasticsearchのタイプをClickHouseの対応するタイプにマッピングできます。または、ClickHouseのJSONデータ型を利用する方法もあります。この場合、データが挿入されると適切な型のカラムが動的に作成されます。syslog データを含むインデックスに対する以下の Elasticsearch マッピングを確認してください。Elasticsearchのマッピング
Elasticsearchのマッピング
ClickHouse スキーマ
ClickHouse スキーマ
- ドット記法ではなく、タプルを使用してネストした構造を表します
- マッピングに基づいて、適切なClickHouseの型を使用しました:
keyword→Stringdate→DateTimeboolean→UInt8long→Int64ip→Array(Variant(IPv4, IPv6))。このフィールドにはIPv4とIPv6が混在するため、ここではVariant(IPv4, IPv6)を使用します。object→JSON。これは、構造が一定でない syslog オブジェクトに使用します。
- カラム
host.ipとhost.macは、すべての型が配列として扱われる Elasticsearch とは異なり、明示的にArray型です。 - timestamp と hostname を用いた
ORDER BY句が追加され、時系列クエリを効率化します - ログデータに最適なエンジンタイプとして
MergeTreeが使用されます
- データ検証 – 特定の構造を除いて、厳格なスキーマを適用することで、カラム数の爆発的な増加を防げます。
- カラム爆発のリスクを回避: JSON 型は、サブカラムを専用カラムとして保存することで、潜在的には数千ものカラムまでスケールできますが、その一方で、過剰な数のカラムファイルが作成される「カラムファイル爆発」を招き、パフォーマンスに影響する可能性があります。これを軽減するため、JSON の基盤となる Dynamic 型 では
max_dynamic_pathsパラメーターを提供しており、個別のカラムファイルとして保存される一意のパス数を制限できます。しきい値に達すると、追加のパスはコンパクトにエンコードされた共有カラムファイルに保存されるため、柔軟なデータのインジェストをサポートしながら、パフォーマンスとストレージ効率を維持できます。ただし、この共有カラムファイルへのアクセスは、専用カラムほど高性能ではありません。なお、JSON カラムは 型ヒント と組み合わせて使用することもできます。“ヒント付き” カラムは、専用カラムと同等のパフォーマンスを発揮します。 - パスと型のより簡単なイントロスペクション: JSON型は、推論された型とパスを特定するためのイントロスペクション関数をサポートしていますが、静的な構造のほうが、たとえば
DESCRIBEを使って調べる際には簡単な場合があります。
あるいは、
JSON カラムを1つ持つテーブルを単純に作成することもできます。JSON 定義では、
host.name と timestamp のカラムに型ヒントを指定しています。これらをソート順/主キーで使用するためです。これにより、ClickHouse はこのカラムが NULL にならないことを把握でき、どのサブカラムを使うべきかも判断できるようになります (型ごとに複数存在する場合があるため、そうしないと曖昧になります) 。JSON を使用してください。スキーマでのJSON型の使用方法と効率的な適用方法の詳細については、ガイド “スキーマの設計” を参照してください。elasticdump をインストールする
Elasticsearch からデータをエクスポートするには、elasticdump の使用を推奨します。このツールには node が必要で、Elasticsearch と ClickHouse の両方にネットワーク的に近いマシンにインストールする必要があります。ほとんどのエクスポートでは、少なくとも 4 コアと 16GB の RAM を備えた専用サーバーを推奨します。elasticdump には、データ移行において次のような利点があります。- Elasticsearch の REST API と直接やり取りするため、データを適切にエクスポートできます。
- Point-in-Time (PIT) API を使用して、エクスポート処理中のデータ整合性を維持します。これにより、特定時点の一貫したスナップショットが作成されます。
- データを JSON フォーマットに直接エクスポートでき、そのまま ClickHouse client にストリーミングして挿入できます。
elastic dump はすべて同じアベイラビリティゾーンまたはデータセンター内で実行することを推奨します。ClickHouse client をインストールする
elasticdump が配置されているサーバーに、ClickHouse がインストールされていることを確認してください。ClickHouse server は起動しないでください。この手順で必要なのは client のみです。データをストリーミング
Elasticsearch と ClickHouse 間でデータをストリーミングするには、elasticdump コマンドを使用し、その出力を ClickHouse client に直接パイプします。以下の例では、データを適切に構造化されたテーブル logs_system_syslog に挿入します。elasticdump では、次のフラグを使用している点に注意してください。type=data- レスポンスを Elasticsearch 内のドキュメント本体のみに限定します。input-index- Elasticsearch の入力インデックスです。output=$- すべての結果を stdout にリダイレクトします。sourceOnlyフラグ - レスポンスからメタデータのフィールドを除外します。searchAfterフラグ - 結果を効率的にページネーションするためにsearchAfterAPI を使用します。pit=true- point in time API を使用して、クエリ間で一貫した結果を得られるようにします。
ここでの ClickHouse クライアントのパラメータは次のとおりです (認証情報を除く) 。
max_insert_block_size=1000- ClickHouse クライアントは、この行数に達するとデータを送信します。値を大きくするとスループットは向上しますが、その分ブロックの生成に時間がかかるため、データが ClickHouse に現れるまでの時間も長くなります。min_insert_block_size_bytes=0- バイト数に基づくサーバー側のブロックのまとめる処理を無効にします。min_insert_block_size_rows=1000- サーバー側でクライアントからのブロックをまとめます。この例では、行がすぐに現れるようにmax_insert_block_sizeと同じ値に設定しています。スループットを向上させるには値を増やしてください。query="INSERT INTO logs_system_syslog FORMAT JSONAsRow"- データを JSONEachRow フォーマット として挿入します。これはlogs_system_syslog.のような明確に定義されたスキーマに送信する場合に適しています。
1 秒あたり数千行程度のスループットが見込めます。
単一の JSON 行への挿入単一の JSON カラムに挿入する場合 (前述の 詳細は “Reading JSON as an object” を参照してください。
syslog_json スキーマを参照) 、同じ insert コマンドを使用できます。ただし、フォーマットには JSONEachRow ではなく JSONAsObject を指定する必要があります。例:データの変換 (任意)
上記のコマンドは、Elasticsearch のフィールドと ClickHouse のカラムが 1:1 で対応していることを前提としています。多くの場合、ClickHouse に挿入する前に、Elasticsearch のデータをフィルタリングして変換する必要があります。これは、input テーブル関数を使って実現できます。この関数を使うと、標準出力に対して任意の SELECT クエリを実行できます。たとえば、先ほどのデータから timestamp フィールドと hostname フィールドだけを保存したいとします。ClickHouse のスキーマは次のとおりです。elasticdump からこのテーブルに挿入するには、input テーブル関数をそのまま使うだけです。JSON type を使って必要なカラムを動的に検出し、選択できます。なお、この SELECT クエリにはフィルターも簡単に含められます。@timestamp フィールド名はエスケープし、入力フォーマットには JSONAsObject を使用する必要がある点に注意してください。