CephXLVIII · RGW TroubleshootingRGW Troubleshooting
Load balancer failures in front of RGW
What you'll learn
- Identify load balancer failure modes
- Design balancer redundancy
- Configure health checks that detect real failures
- Diagnose balancer-related symptoms
Prerequisites
None — start here.
Verified against Ceph Tentacle 20.2.x · Ceph Squid 19.2.x (supported previous) · cephadm matches the verified Ceph release · podman 4.x · csi-rbd and csi-cephfs current · RBD / CephFS / RGW current (matches Ceph release) · Linux kernel 5.15+ (5.10 minimum) · Ubuntu 24.04 LTS (Ceph host baseline) · Debian 12 (Bookworm) (Ceph host baseline) · Rocky Linux / RHEL / AlmaLinux 9.x (Ceph host baseline) · Proxmox VE 9.x (cross-course integration) · Kubernetes 1.31+ (cross-course integration) · 2026-08-18
Why this matters in production
Adding a load balancer to protect against gateway failure introduces a component whose failure takes out everything. Getting its redundancy and its health checking right is what makes the addition a net gain.
Failure modes
| Failure | Symptom | Response |
|---|---|---|
| Balancer process dies | total outage | VIP fails over to the standby |
| Balancer host dies | total outage | VIP fails over |
| VIP failover fails | total outage, both balancers up | check keepalived and VRRP |
| Weak health check | intermittent errors from one bad gateway | fix the check |
| Health check too aggressive | gateways flapping in and out | raise thresholds |
| Backend exhaustion | 503 with healthy gateways | raise connection limits |
| Timeout too low | large uploads fail | raise timeouts |
Redundancy
ceph orch apply ingress --service-id rgw.default \
--placement="count:2 label:lb" \
--frontend-port 443 --monitor-port 8999 \
--virtual-ip 10.20.0.100/24
ceph orch ps --service-name ingress.rgw.default
Two instances with a virtual IP managed by keepalived. Verify the failover actually works rather than assuming:
# on the active balancer host
systemctl stop haproxy
# from a client, confirm requests continue
Untested failover is the most common reason a redundant balancer does not help.
Health checks
option httpchk GET /
http-check expect status 403
inter 5s fall 3 rise 2
| Parameter | Effect |
|---|---|
inter | check interval |
fall | failed checks before removing a backend |
rise | successful checks before returning it |
Too aggressive and a gateway briefly slow is removed, reducing capacity and possibly cascading. Too lenient and a broken gateway serves errors for a long time.
Diagnosing balancer symptoms
# is the VIP where it should be?
ip addr show | grep 10.20.0.100
ssh lb-02 ip addr show | grep 10.20.0.100
# backend state
echo "show stat" | socat stdio /var/run/haproxy.sock | \
awk -F, '{print $1, $2, $18}'
# is the balancer or a gateway the problem?
curl -s -o /dev/null -w '%{http_code} %{time_total}\n' https://rgw.example.com/
for h in rgw-01 rgw-02 rgw-03; do
curl -s -o /dev/null -w "$h %{http_code} %{time_total}\n" "http://$h:8080/"
done
The VIP appearing on two hosts simultaneously is a split-brain in keepalived and produces intermittent failures that depend on ARP resolution — worth checking explicitly when symptoms are inconsistent.
Quiz
Knowledge check · 4 questions
Q1. The virtual IP appears on both load balancer hosts simultaneously. What is happening?
Q2. A keepalived pair can serve traffic correctly for months and still fail to move the virtual IP when the active instance stops.
Q3. Design and verify RGW front-end availability.
A new RGW deployment will use two HAProxy instances with keepalived. The team has configured them and confirmed that requests reach the gateways through the virtual IP.
Q4. What is the trade-off in health check aggressiveness?
Passing score: 75%. Answers are checked in this browser.
Production discipline
Test balancer failover and gateway removal explicitly during commissioning; both failure paths are silent until exercised and neither is proven by normal operation. Check for the VIP on more than one host whenever symptoms are intermittent with no pattern — split brain produces exactly that.
Cross-course references
- Kubernetes: verifying that a Service actually removes an unready pod is the same test
- Linux: any VRRP or cluster-manager failover needs the same explicit exercise