なぜ SQL Server から ClickHouse にデータをストリーミングするのか?
- 本番アプリに負荷をかけない社内レポート
- 高速で、常に最新の状態を保つ必要がある顧客向けダッシュボード
- 分析のためにユーザーアクティビティログを常に最新に保つようなイベントストリーミング
始める前に必要なもの
前提条件
- 稼働中の SQL Server インスタンス
- このチュートリアルでは AWS RDS for SQL Server を使用しますが、最新の SQL Server インスタンスであれば問題なく使用できます。AWS SQL Server をゼロからセットアップする
- ClickHouse インスタンス
- セルフホストまたはクラウドに対応しています。ClickHouse をゼロからセットアップする
- Streamkap
- このツールは、データストリーミングパイプラインの中核を担います。
接続情報
- SQL Server のサーバーアドレス、ポート、ユーザー名、パスワード。Streamkap が SQL Server データベースにアクセスするための専用のユーザーとロールを作成することを推奨します。設定については、こちらのドキュメントをご覧ください。
- ClickHouse server のアドレス、ポート、ユーザー名、パスワード。ClickHouse の IP Access List では、どのサービスが ClickHouse データベースに接続できるかを制御します。こちらの手順に従ってください。
- ストリーミングしたいテーブル。まずは 1 つから始めてください
ソースとして SQL Server を設定する
ステップ 1: Streamkap で SQL Server ソースを作成する
- Streamkap を開き、Sources セクションに移動します。
- 新しいソースを作成します。
- わかりやすい名前を付けます (例: sqlserver-demo-source) 。
- SQL Server の接続情報を入力します。
- Host (例: your-db-instance.rds.amazonaws.com)
- Port (SQL Server のデフォルトは 3306)
- Username と Password
- データベース名
裏側で何が起きているか
ClickHouseの宛先を作成する
ステップ 2: Streamkap で ClickHouse の宛先を追加する
手順:
- Streamkap の宛先セクションに移動します。
- 新しい宛先を追加し、宛先タイプとして ClickHouse を選択します。
- ClickHouse の情報を入力します。
- ホスト
- ポート (デフォルトは 9000)
- ユーザー名とパスワード
- データベース名
Upsert モードとは?
- これにより、SQL Server 側で変更が発生しても、宛先テーブルが重複データで埋まらないようにできます。
スキーマ進化への対応
- 朗報です。Streamkap は基本的なスキーマ進化に対応しています。つまり、SQL Server に新しいカラムを追加すると、そのカラムは ClickHouse 側にも反映されます。
ストリーミングパイプラインの構築
ステップ 3: Streamkap でパイプラインを設定する
パイプラインの設定
- Streamkap の Pipelines タブを開きます。
- 新しいパイプラインを作成します。
- SQL Server ソース (sqlserver-demo-source) を選択します。
- ClickHouse の宛先 (clickhouse-tutorial-destination) を選択します。
-
ストリーミングしたいテーブルを選択します。ここでは
eventsとします。 - CDC (変更データキャプチャ) 用に設定します。
- 今回は新しいデータをストリーミングします (最初は履歴データの投入はスキップして、CDC イベントに集中するとよいでしょう) 。
バックフィルは必要ですか?
ストリーミングの動作:想定される内容
ステップ 4: データストリームを確認する
- SQL Server のソーステーブルに新しいデータが入ると、Streamkap のパイプラインがその変更を捉えて ClickHouse に送信します。
- ClickHouse は (ReplacingMergeTree とパーツマージにより) これらの行を取り込み、更新をマージします。
- スキーマも追随します。SQL Server でカラムを追加すると、ClickHouse にも反映されます。
内部では何が起きているのか: Streamkap は実際に何をしているのか?
- Streamkap は SQL Server のバイナリログ (レプリケーションにも使われるログ) を監視します。
- テーブルで行が挿入、更新、または削除されると、Streamkap はそのイベントを即座に検知します。
- そのイベントを ClickHouse が理解できる形式に変換して送り込み、分析 DB に変更を即時反映します。
詳細オプション
Upsert モードと Insert モード
- Insert モード: 新しい行はすべて追加されるため、更新であっても重複が発生します。
- Upsert モード: 既存の行への更新はその内容を上書きするため、分析データを常に最新かつ整った状態に保つのに適しています。
スキーマ変更への対応
- 運用テーブルに新しいカラムを追加した場合は? Streamkap がそれを検出し、ClickHouse 側にも追加します。
- カラムを削除した場合は? 設定によっては移行が必要になることもありますが、追加のほとんどはスムーズに反映されます。
実運用での監視: パイプラインの状態を把握する
パイプラインの状態を確認する
- パイプラインの遅延を確認する (データはどの程度新しいか)
- 行数とスループットを監視する
- 何か異常があればアラートを受け取る
確認すべき主要なメトリクス
- 遅延: ClickHouse が SQL Server に対してどれくらい遅れているか
- スループット: 1 秒あたりの行数
- エラー率: ほぼゼロであるべき
本番運用: ClickHouse のクエリ
次のステップと詳細ガイド
- フィルタリングしたストリームの設定 (一部のテーブル/カラムのみを同期)
- 複数のソースを1つの分析用DBにストリーミング
- これをS3/データレイクと組み合わせてコールドストレージに活用
- テーブル変更時のスキーマ移行の自動化
- SSLとファイアウォールルールによるパイプラインの保護
よくある質問とトラブルシューティング
まとめ
- upsert と insert の違いと、それぞれの細かなポイント
- エンドツーエンドの latency: 最終的な分析ビューをどれだけ速く得られるか
- パフォーマンスチューニングと スループット
- このスタック上での実運用ダッシュボード