Skip to content

複数台で動かす:active / standby と設定の同期 #114

Description

@max3584

rproxy を複数台(VM など)で動かし、1 台が止まっても転送が続くようにする。まだ実装はしない。形(設定・API・DB)を決めてから、次のマイナー(v0.4.0)でまとめて入れる。

オーナーの要望

  • active / standby などの役割を持たせる
  • 設定は全台で同期する
  • 転送(クライアントの受け付けと転送先への送信)は基本的に active だけが行う

設計の案(たたき台)

1. どの台が active か(リーダーの決め方)

案 仕組み 利点 注意
A. DB のリース 共有の MariaDB に「active の台と期限」の行を置き、active が数秒ごとに延長する。期限切れなら standby が取る 追加のソフトが要らない(DB は既にある) DB が止まると役割を決められない(その間は今の active を続ける)
B. 台どうしの合意(Raft など) 3 台以上で多数決 DB に依存しない 3 台以上が要る。実装が重い
C. 外部に任せる keepalived(VRRP)や Kubernetes の Lease が決め、rproxy は通知を受けて役割を切り替える 実績のある仕組みを使える keepalived などの設定が別に要る

2. クライアントを active に向ける方法

案 仕組み 注意
a. 仮想 IP(VIP) active だけが VIP を持つ(ip addr add と gratuitous ARP / 非請求の NA)。rproxy が自分で付け外しするか、keepalived に任せる 同じ L2 のセグメントが要る。IPv6(GUA)も対応が要る
b. BGP / 上流のルータ active だけが経路を広告する ルータ側の設定が要る
c. DNS active の IP を返す 切り替えに TTL の分だけ時間がかかる
  • standby は、待ち受けを閉じておくか、IP_FREEBIND で VIP に先に bind しておき、受け付けを始めないだけにする(切り替えを速くするため)
  • 転送先への送信(ヘルスチェック・CrowdSec の LAPI・DNS の再解決を含む)を active だけにするか、standby もヘルスチェックだけはするかを決める

3. 設定の同期

  • 設定ファイル(RPROXY_CONFIG):全台に同じファイルを配る(今の再読み込みで反映)。rproxy 自身で配るかは要検討
  • API・UI で作ったルール(DB):今は起動時にしか DB を読まないので、変更を全台に反映する仕組みが要る
    • 案:DB の変更の履歴(forward_rules_log)を各台が追いかける/active が standby に API で送る
  • UI はどの台に話しかけるか:active(VIP)か、全台に送るか
  • global(CrowdSec・trusted_proxies など)とトークン・証明書のファイルの扱い

4. 切り替えのとき

  • 開いている TCP の接続は切れる(ユーザー空間のプロキシなので、接続を引き継げない)。UDP のセッション・rate_limit の数・CrowdSec の判定は作り直し
  • 両方が active になる(split-brain)のを防ぐ方法(リースの期限・フェンシング)
  • 状態の見え方:GET /cluster(台・役割・最後の同期)、ログ event=cluster.role、UI の表示

決めること

  1. active の決め方(A / B / C)
  2. クライアントを向ける方法(VIP / BGP / DNS)と、IPv4・IPv6 の両方で要るか
  3. 台数(2 台か、3 台以上もあるか)
  4. standby が転送先へのヘルスチェックなどを行ってよいか(「基本 active から送信」の範囲)
  5. Kubernetes(将来の本命)での動かし方との関係(Deployment + Lease で C に寄せるか)

Activity

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Labels

    area: control-plane制御 API・レジストリ・停止/変更area: ops運用・デプロイ・環境構築enhancementNew feature or request

    Projects

    No projects

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions