課題:データベースを「死んだ倉庫」にしないために
午前3時、電話が鳴り止みません。本番環境のサーバーがディスク容量不足で突然ダウンしてしまいました。翌朝ログを確認すると、InfluxDBには4時間前から容量の急増が記録されていました。しかし、単にデータを保存するだけで能動的な監視メカズムがなかったため、静かに進行していたトラブルに全く気づけませんでした。
Kapacitorを知る前、私はPythonスクリプトを5分おきにcron実行してInfluxDBにクエリを投げ、しきい値(threshold)をチェックしていました。この方法はリソースを大量に消費し、常に大きな遅延が発生します。Kapacitorはこの状況を打破するために登場しました。それは、データがデータベースに流れ込んだ瞬間に処理を行い、即座にアクションをトリガーすることを可能にします。
Kapacitorとは?
TICK Stack(Telegraf, InfluxDB, Chronograf, Kapacitor)の中で、Kapacitorは「中央処理ステーション」の役割を担います。InfluxDBがストレージなら、Kapacitorは分析を行う脳です。このツールは、主に3つの能力に優れています:
- Stream Processing: リアルタイムのデータフローを監視し、即座にアラートを発信。
- Batch Processing: 大規模な履歴データに対して複雑な計算クエリを実行。
- 多様な出力先: Telegram、Slack、メールへのアラート送信、またはWebhookを呼び出してサーバーの自動スケールアップを実行。
PrometheusのAlertmanagerと比較して、Kapacitorは独自の言語であるTICKscriptのおかげで非常に柔軟性が高く、プログラマーのように複雑なアラートロジックを記述できます。
ステップ1:UbuntuへのInfluxDBとKapacitorのインストール
このガイドでは、従来のTICKscriptとの最高の互換性を確保するため、Ubuntu 22.04とInfluxDBバージョン1.8を使用します。
# InfluxDataの公式リポジトリを追加
wget -q https://repos.influxdata.com/influxdata-archive_compat.key
echo '393e8779c8945d31955614b03973f3510af1022fe4440455b2395634179739a5 influxdata-archive_compat.key' | sha256sum -c && cat influxdata-archive_compat.key | gpg --dearmor | sudo tee /etc/apt/trusted.gpg.d/influxdata-archive_compat.gpg > /dev/null
echo 'deb [signed-by=/etc/apt/trusted.gpg.d/influxdata-archive_compat.gpg] https://repos.influxdata.com/debian stable main' | sudo tee /etc/apt/sources.list.d/influxdata.list
# InfluxDBとKapacitorのコンボをクイックインストール
sudo apt update && sudo apt install influxdb kapacitor -y
# システムサービスを有効化
sudo systemctl enable --now influxdb
sudo systemctl enable --now kapacitor
kapacitor version コマンドを入力して確認します。ターミナルにバージョン(例:1.6.x)が表示されれば、インストールは成功です。
ステップ2:接続設定
デフォルトでは、Kapacitorは localhost:8086 でInfluxDBを探します。データベースを別のサーバーに分ける場合は、以下の設定ファイルを編集してください:
sudo nano /etc/kapacitor/kapacitor.conf
[[influxdb]] ブロックを探し、正しいURLに更新します:
[[influxdb]]
enabled = true
urls = ["http://127.0.0.1:8086"]
timeout = "0s"
保存後、サービスを再起動します:sudo systemctl restart kapacitor。
ステップ3:CPUアラート用のTICKscriptを作成
CPU指標を監視するスクリプトを作成しましょう。1分間の平均CPU使用率が80%を超えた場合にログを記録するように設定します。
cpu_alert.tick ファイルを作成します:
stream
|from()
.database('telegraf')
.retentionPolicy('autogen')
.measurement('cpu')
.where(lambda: "cpu" == 'cpu-total')
|window()
.period(1m)
.every(1m)
|mean('usage_user')
|alert()
.crit(lambda: "mean" > 80)
.log('/tmp/cpu_alerts.log')
このスクリプトの仕組みは非常にシンプルです。window() 関数によって60秒間のデータをグループ化して平均を算出します。これは、一時的なCPUのスパイク(急上昇)による誤報を防ぐために非常に重要です。
ステップ4:タスクのデプロイ
スクリプトを実際に実行するには、定義(define)と有効化(enable)の2つのステップを経てKapacitorに読み込ませる必要があります。
# 新しいタスクを定義
kapacitor define cpu_high_alert -tick cpu_alert.tick -dbrp telegraf.autogen
# タスクを有効化
kapacitor enable cpu_high_alert
kapacitor show cpu_high_alert コマンドでステータスを確認できます。各ノードを通過するデータポイント(points)の数を示すテキスト形式のチャートが表示されます。
ステップ5:Telegramと連携して即座に通知を受け取る
ファイルへのログ記録だけでは不十分です。スマートフォンの通知でアラートを受け取るには、/etc/kapacitor/kapacitor.conf を開き、[telegram] セクションを探します:
[telegram]
enabled = true
url = "https://api.telegram.org/bot"
token = "123456789:ABCDefGhIJK..." # BotFatherから取得したトークン
chat-id = "987654321"
TICKscriptのalertノードを更新します:
|alert()
.crit(lambda: "mean" > 80)
.telegram()
その後、再度 kapacitor define cpu_high_alert -tick cpu_alert.tick を実行して、Kapacitorに新しい構成を反映させます。
500ノード以上のシステム運用から得た実践的な経験
大規模なIoTや監視システムを長年運用してきた中で、3つの重要な注意点を見出しました:
- 大規模データにはBatchを優先: 秒間数千のセンサーがデータを送信している場合、
streamを使用するとRAMを使い果たします。5〜10分周期でデータをクエリするbatch処理に切り替えましょう。 - Deadman’s Switch: これは「命綱」のような機能です。デバイスが突然沈黙した場合(ネットワーク遮断や故障)、Kapacitorがデータの欠落を検知して即座にアラートを出します。
- Retention Policyの確認: TICKscript内でデータベース名やリテンションポリシーの宣言を間違えると、タスクは決して実行されません。常にInfluxDBの設定値と照らし合わせて確認してください。
おわりに
Kapacitorは単なるアラートツールではなく、強力なデータ処理エンジンです。InfluxDBとKapacitorを組み合わせ、データベースからビジネスメトリクスを直接監視することで、受動的な対応から完全な能動的監視へと移行できます。システムは単にデータを保存するだけでなく、自ら考え、トラブルに即座に反応できるようになります。
