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 の表示
決めること
- active の決め方(A / B / C)
- クライアントを向ける方法(VIP / BGP / DNS)と、IPv4・IPv6 の両方で要るか
- 台数(2 台か、3 台以上もあるか)
- standby が転送先へのヘルスチェックなどを行ってよいか(「基本 active から送信」の範囲)
- Kubernetes(将来の本命)での動かし方との関係(Deployment + Lease で C に寄せるか)
rproxy を複数台(VM など)で動かし、1 台が止まっても転送が続くようにする。まだ実装はしない。形(設定・API・DB)を決めてから、次のマイナー(v0.4.0)でまとめて入れる。
オーナーの要望
設計の案(たたき台)
1. どの台が active か(リーダーの決め方)
2. クライアントを active に向ける方法
ip addr addと gratuitous ARP / 非請求の NA)。rproxy が自分で付け外しするか、keepalived に任せるIP_FREEBINDで VIP に先に bind しておき、受け付けを始めないだけにする(切り替えを速くするため)3. 設定の同期
RPROXY_CONFIG):全台に同じファイルを配る(今の再読み込みで反映)。rproxy 自身で配るかは要検討forward_rules_log)を各台が追いかける/active が standby に API で送るglobal(CrowdSec・trusted_proxies など)とトークン・証明書のファイルの扱い4. 切り替えのとき
GET /cluster(台・役割・最後の同期)、ログevent=cluster.role、UI の表示決めること