Skip to content

WebSocket イベントハブとテレメトリのスケーリング

Cockpit はリアルタイムのイベントセンターを搭載しており、サーバーの更新状況をブラウザに直接ストリーミングします。これにより、Web ページを手動で再読み込みすることなく、状態の変化を確認できます。


イベントハブの仕組み 📢

💡 たとえ話:つなぎっぱなしの電話と内線放送

  • つなぎっぱなしの電話 (WebSockets): 通常の Web ページは手紙を送るように動作します(リクエストを送って、返事を待つ)。それに対し、WebSocket は電話を繋いだまま話している状態です。ブラウザで Cockpit を開くと、Cockpit のイベントハブ回線(/api/v1/events)へ電話がつながり、切断するまでサーバーからリアルタイムでデータが届き続けます。
  • 内線メガホン (pg_notify): 信頼性を高めるために複数の Cockpit サーバーを動かしている場合、管理者ごとに接続先の Cockpit サーバーが異なることがあります。もし物理サーバーから Cockpit 1号機へ更新データが届くと、1号機はデータベースの内線メガホン pg_notify を使い、「ホストAが接続されました!」と大声で叫びます。それを聞いた2号機が、手元のブラウザ回線に向けて同じ情報を伝達します。

リアルタイム更新の流れは以下の通りです:

┌──────────────┐     電話接続       ┌──────────────┐    内線メガホン    ┌──────────────┐     電話接続       ┌──────────┐
│  Vapor Host  │───────────────────►│  Cockpit #1  │───────────────────►│  Cockpit #2  │───────────────────►│ Browser  │
│ (物理サーバー)│    (WebSocket)     │(データを取得)│    (pg_notify)     │   (待機側)   │    (WebSocket)     │ (ブラウザ)│
└──────────────┘                    └──────────────┘                    └──────────────┘                    └──────────┘

メッセージの封筒フォーマット ✉️

WebSocket を通じてやり取りされるデータは、郵便の封筒のような決まったフォーマットで包まれています:

json
{
  "type": "<message_type>",   // 封筒の表に書く「速達」「返信」などのメッセージ種別
  "payload": {
    "kind": "<channel_name>", // 宛先となる部署名(チャンネル)
    "data": { ... }            // 手紙の本文(実際のデータ)
  }
}
  • あなたが送るアクション (封筒の表書き):
    • auth: 自分のサインイン資格(トークン)を同封して、身元を証明します。
    • subscribe: 購読の開始です。「VM 1号機のデータを受信したい」と Cockpit に伝えます。
    • unsubscribe: 購読の終了です。そのチャンネルの受信を止めます。
  • あなたが受け取るメッセージ:
    • auth: サインインの認証成功を通知します。
    • event: 購読したチャンネルから送られてきたリアルタイムデータを届けます。
    • error: 権限不足などでデータが受信できない場合にエラーを通知します。

配信チャンネル:ラジオの周波数を合わせる 📻

💡 たとえ話:ラジオの選局

リアルタイムデータを受け取るために、ブラウザは特定の「チャンネル」を購読します(好きな音楽番組を聞くために、ラジオの周波数をダイヤルで合わせるようなものです)。

提供されている標準チャンネルは以下の通りです:

周波数 (チャンネル名)放送内容
host-metrics:<host_id>指定した物理サーバーの CPU、メモリ、ディスク速度などのライブ稼働データ。
vm-events:<host_id>仮想マシンの状態変化(例:「VM 1 が停止した」「VM 2 がクラッシュした」)。
vm-metrics:<host_id>そのホスト上で動作しているすべての VM の稼働データをまとめたもの。
vm-volume-migration-events:<uuid>:<disk>ディスク移動の進捗インジケーター(0%〜100%の進捗ゲージ)。
task-eventsバックアップ作成やシステムアップデートなど、時間のかかる作業の進行状況。