Skip to main content
RunBook Academy

CephXLVIII · RGW TroubleshootingRGW Troubleshooting

Load balancer failures in front of RGW

Advanced⏱ ~17 mincephcurl

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

Not yet marked complete on this device.

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

FailureSymptomResponse
Balancer process diestotal outageVIP fails over to the standby
Balancer host diestotal outageVIP fails over
VIP failover failstotal outage, both balancers upcheck keepalived and VRRP
Weak health checkintermittent errors from one bad gatewayfix the check
Health check too aggressivegateways flapping in and outraise thresholds
Backend exhaustion503 with healthy gatewaysraise connection limits
Timeout too lowlarge uploads failraise 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
ParameterEffect
intercheck interval
fallfailed checks before removing a backend
risesuccessful 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

  1. Q1. The virtual IP appears on both load balancer hosts simultaneously. What is happening?

  2. Q2. A keepalived pair can serve traffic correctly for months and still fail to move the virtual IP when the active instance stops.

  3. 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.

  4. 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