ホスト同期とクラスター管理
Cockpit は、複数の物理的な Vapor サーバーを一元管理します。各物理サーバーで動作している仮想マシンやネットワーク、ストレージの状態を中央のデータベースに定期的に複製し、ダッシュボード上にひとつの画面としてまとめます。
1. 物理サーバーの管理権(アドバイザリーロック)
信頼性を高めるために複数の Cockpit サーバーを同時に動かす場合(高可用性)、同じ物理サーバーに対して複数の Cockpit サーバーが同時に操作を命令すると混乱が生じます(例:2台の管理サーバーが同時に同じ VM を起動しようとするなど)。
- 💡 たとえ話:図書室の貸出カード 物理サーバーを、図書室にある「一冊の本」に例えてみましょう。同時に何人も本にメモを書き込んでしまわないように、データベース内にチェックアウト用の貸出カード(PostgreSQL のアドバイザリーロック)を用意します。この貸出カードに自分の名前をスタンプした管理サーバーだけが、その本(物理サーバー)への命令権を手にします。
管理権を獲得する流れ:
- 見回り: Cockpit のバックグラウンド実行プロセス(コレクターサービス)が、データベースを定期的にチェックして登録されているサーバーを探します。
- スタンプ(ロック獲得): 見つけたサーバーに対して、データベースの貸出カードに自分の名前を書き込もうと試みます。
- 接続: 書き込みに成功したらそのサーバーの管理権を「獲得」し、リアルタイムの通信回線(WebSocket)を開き、ダッシュボード上でステータスを
connected(接続中)にします。 - 引き継ぎ: もし通信を担当している管理サーバーの回線が切れたりクラッシュしたりすると、貸出カードのスタンプは自動的に消去されます。待機していた別の Cockpit サーバーが即座にカードに名前を書いて管理権を引き継ぎ、サーバー監視を継続します。
2. データのリアルタイム同期(同期パイプライン)
サーバーに接続した後、Cockpit は手元のダッシュボード画面と物理サーバーの実際の状態を常にぴったり一致させる必要があります。これは以下の2ステップで行われます:
ステップ 1: 全体スナップショットのダウンロード (Get Sync Snapshot)
「現在動いている仮想マシンやネットワークの一覧カタログをすべてダウンロード」
│
▼
ステップ 2: 変更点だけのリアルタイム配信 (Get Sync Events + Sync Cursor)
「以降は、VMの起動や停止といった『変化したイベント』だけを受信」パート A: 全体スナップショット (映画丸ごとのダウンロード)
新しくサーバーが接続されたときや、長期間のオフラインから復帰したとき、Cockpit はサーバーの全構成情報を要求します。
- 💡 たとえ話: ディレクトリ名簿の全体をダウンロードするようなものです。物理サーバー上で現在動いているすべての仮想マシン、仮想スイッチ、および接続されているハードディスクのリストを一気に取得します。
パート B: 変更点だけのリアルタイム配信 (動画のしおり機能 - sync_cursor)
最初の全体スナップショットを保存した後は、通信データの量を抑えるために、全体を何度も取得することはしません。以降は、何かが発生した瞬間(VMが起動した、など)に変更履歴(イベント)だけをストリームで受信します。
- 💡 たとえ話:動画のしおり (
sync_cursor) すべての変更イベントには通し番号が付いています。Cockpit は、最後に処理した通し番号をデータベースに「しおり」として記録しておきます。- ネットの回線が10秒間途切れても、全体カタログを再ダウンロードする必要はありません。
- 接続が戻ると、Cockpit は「しおり」を確認して「通し番号 105 番まで処理したから、106 番以降の変更を送ってください」と要求し、抜け漏れや処理の重複なくすぐにデータを同期させます。
- あまりにも長期間 Cockpit が停止していて、物理サーバー側に過去の変更履歴が残っていない場合は、自動的に最初から全体スナップショットを再ダウンロードします。