ホスト同期とクラスター管理
Cockpit は、複数の物理的な Vapor ホストサーバーを一元的に調整します。各ホストで動作している仮想マシン、仮想ネットワーク、およびストレージプールの同期されたレジストリを中央データベースに維持し、単一のコントロールペインからの統合管理を可能にします。
1. ホストの所有権管理と高可用性
複数の Cockpit インスタンスが動作する高可用性(HA)環境では、特定の物理 Vapor ホストに対して同時に通信する Cockpit サーバーを常に1台のみに制限する調整が必要です。これにより、競合状態や命令の競合(重複する電源操作など)を防止します。
PostgreSQL トランザクションアドバイザリーロック
Cockpit は、PostgreSQL トランザクションアドバイザリーロックを使用して、重複するホスト管理の競合を防ぎます。ロックメカニズムは以下のようにホストの割り当てを動的に調整します。
- 検出(スイーピング): Cockpit のバックグラウンドサービス(コレクターサービス)が、登録されているアクティブなハイパーバイザーホストがないかデータベースを定期的にポーリングします。
- ロックの取得: 検出された各ホストに対して、Cockpit インスタンスは PostgreSQL データベース内の対応するホストレコードに関連付けられたアドバイザリーロックの取得を試みます。
- 接続の確立: アドバイザリーロックの取得に成功すると、該当する Cockpit インスタンスは Vapor ホストエージェントとの間に安全な WebSocket 接続を確立し、システム状態内のホストステータスを
connected(接続中)に更新します。 - フェイルオーバーの実行: アクティブな Cockpit インスタンスでネットワークの切断やクラッシュが発生すると、アドバイザリーロックは自動的に解放されます。待機中(standby)の別の Cockpit インスタンスが即座にロックを取得し、WebSocket 接続を引き継いで、サービスを中断することなくホストの管理を継続します。
2. 状態同期パイプライン
Vapor ホストに接続すると、Cockpit は中央データベースの状態を物理ハイパーバイザーのリアルタイム構成と同期させます。この同期は以下の2フェーズのパイプラインで実行されます。
フェーズ 1: フル状態スナップショット (Get Sync Snapshot)
稼働中の仮想マシン、仮想ネットワーク、および
ストレージプールの完全なインベントリ情報をダウンロードします。
│
▼
フェーズ 2: リアルタイムイベントストリーミング (Get Sync Events + Sync Cursor)
WebSocket経由で増分状態の更新を受信し、イベントを監視します。フェーズ A: フル状態スナップショット
初期接続時または長期間のネットワーク切断からの復旧時、Cockpit は完全なリコンシリエーションを実行します。Vapor ホストエージェントに対して、完全な構成カタログを要求します。このスナップショットにより、すべての仮想マシン、仮想ネットワーク、およびストレージプールのアクティブな状態が中央データベースに読み込まれます。
フェーズ B: 増分イベントストリーミングとカーソルトラッキング
初期スナップショットの処理完了後、ネットワークオーバーヘッドを最小限に抑えるため、Cockpit は増分同期モードに移行します。ホストから送信されるリアルタイムのイベントストリーム(例: vm_started、network_created、storage_pool_updated)を WebSocket 経由で監視します。
- シーケンス ID トラッキング (
sync_cursor): 各イベントには、単調増加するシーケンス番号が含まれています。Cockpit は、最後に処理成功したシーケンス番号をsync_cursorとしてデータベースに保存します。 - ネットワーク切断からの復旧: 一時的に接続が切断された場合、再接続時にフルスナップショットを再要求することはありません。代わりに、保存されている
sync_cursorをホストエージェントに送信し、そのシーケンス番号以降に発生したすべてのイベントを要求します。これにより、イベントの順序を保証し、重複処理やメトリックの欠落を防ぎます。 - フルフォールバック: Cockpit インスタンスの切断期間がホスト側のイベントログ保持ウィンドウを超えた場合、同期パイプラインは自動的にフェーズ A にフォールバックし、最新のフル状態リコンシリエーションを再実行します。