Overview
A trading platform held reference data and positions in GemFire partitioned regions on bare-metal servers. Several times a week, around market open, a member was declared dead and the cluster spent a long time rebalancing while order latency climbed.
Challenge
Logs said the member had unexpectedly left the distributed system, but the process was still running and memory looked fine. Raising member-timeout had hidden the symptom for a while and then made real failures slower to detect. Each departure triggered redundancy recovery and rebalancing at exactly the time the cluster was busiest.
Environment
GemFire 9.15 on bare-metal Linux servers: 6 data members, 3 locators on separate hosts, 64 GB heaps with the G1 collector, partitioned regions with one redundant copy, a Java order service as the main client.
Approach
AceMQ engineers lined up GC logs, locator suspect-processing entries and host network counters on a single timeline and found that every departure matched a full GC pause longer than the failure-detection window. They then worked on the heap rather than the timeout: smaller heaps, off-heap for the largest regions, and resource manager thresholds that shed load before a collection became pathological.
Solution
- Correlated GC logs, locator logs and network counters on one timeline to separate pauses from network faults
- Reduced heap per member and moved the largest regions off-heap so object count stayed manageable for the collector
- Set eviction and critical heap thresholds, with overflow to disk for regions that must not lose entries
- Returned member-timeout to a deliberate value instead of the inflated one
- Staggered rebalancing so a departure no longer triggered a full rebalance in the middle of the open
- Added alerts on pause length and heap after collection, so drift shows up before a member leaves
Outcome
In the two months after the change the cluster recorded no unexpected member departures during trading hours. Pause length became a graph the team watched, and member-timeout stopped being a number someone raised whenever the cluster complained.