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 | バックアップ作成やシステムアップデートなど、時間のかかる作業の進行状況。 |