GeoServer Active/Active: separate serving from authoring
Original plugin developer and author at GeoSolutions
I developed the original GeoServer JMS clustering plugin and related articles at GeoSolutions. The central distinction is between serving queries on several instances and controlling who changes the configuration those instances share.
Problem: several servers, one coherent publishing setup
A GeoServer installation has more than geospatial data. Its catalog, service settings and styles tell the server how to expose that data. Adding query-serving instances creates a second coordination problem: carrying configuration changes to those instances.
The extension addressed internal configuration propagation. It did not make shapefiles, raster files or databases replicate through JMS. That boundary matters because a replica with the right catalog can still point at missing or different spatial data.
Architecture: two planes with different responsibilities
GeoServer instances use Java, Spring and JMS messaging through ActiveMQ. An authoring instance persists configuration and publishes changes; subscribing instances apply received configuration to their in-memory catalog and persist it locally. Multiple instances can serve OGC queries concurrently.
The topology drawn here is a documented design with private data directories and a designated configuration writer. It is an original reconstruction of the published architecture, not a deployment inventory. A broker can be standalone or embedded; the training also describes broker networks.
Durable subscriptions support delivery of changes missed while a registered replica is offline. They concern the configuration message channel. Spatial sources and accompanying files still need their own sharing or synchronization arrangements.
Serving, configuration and spatial data
Read traffic can enter either GeoServer node. Administrative changes enter the designated writer, pass through the configuration message channel and are persisted at the replica. Both nodes obtain spatial data through a separate data-management lane. Solid arrows show requests; dashed arrows show JMS messages; ochre arrows show persistence.
Decisions: make the configuration writer explicit
Active/Active query service does not imply safe concurrent catalog editing. The documentation warns about concurrent writes to shared directories and recommends directing frequent configuration changes through one authoring node with failover. A pure replica should not receive REST or UI configuration edits.
Private directories avoid treating a shared filesystem as a concurrent configuration database, but place catch-up responsibility on messaging and replica persistence. A shared-directory topology has different operational constraints, including separate instance configuration locations.
A retrospective alternative is a declarative configuration rollout: distribute a versioned artifact and reload serving instances through a controlled procedure. That can improve auditability but trades immediate fine-grained propagation for rollout coordination. It is an alternative I would evaluate today, not a claim that it was implemented in this work.
Configuration change and replica responsibility
This flow separates authoring, message delivery and replica application. Durability can bridge an offline interval, but the inspected documentation does not establish a single transaction across local persistence and broker publication, conflict resolution for concurrent authors, or exactly-once effects.
Outcomes: an enduring community extension
I was the sole developer of the original plugin and author of the related articles during 2010–2014. The original work was committed in SVN and later migrated to Git. The current community module includes subsequent maintenance by others; its present contents should not all be attributed to me.
The public documentation remains available and explains configuration propagation and deployment choices. This case claims a delivered extension and documented architecture, without converting that evidence into a throughput, availability or customer-count result.
Learning: availability has more than one state
The most useful design lesson is to name what is consistent: a catalog object, a style, an external graphic and a dataset are different things. A service can remain available for queries while a replica is temporarily behind on publishing configuration.
For a new implementation, I would test a configuration edit while the broker is unavailable, a crash between persistence and publication, a replica reconnecting to a durable subscription, mutable catalog objects across serialization, duplicate/reordered events and safe writer failover. Those are reliability questions raised by this architecture, not invented incidents from its history.
Questions & discussion
Does Active/Active mean every node can safely edit the catalog?
No. Query traffic can be served by several nodes, while configuration authoring is deliberately constrained. The documented warnings around shared directories and pure replicas rule out describing this as conflict-free multiwriter consensus.
Read the relevant sectionWhat happens when a replica is offline?
A configured durable subscription can deliver missed configuration messages on reconnection. Spatial-file synchronization remains separate. The delivery and application semantics need examination before claiming any stronger end-to-end guarantee.
Read the relevant sectionWhat did you personally build?
I developed the original plugin and related articles at GeoSolutions during 2010–2014. Community maintenance continued afterward; current module authorship is shared across its history.
Read the relevant sectionSources & scope
- GeoServer JMS clustering documentation
Current community documentation, inspected October 2026; GeoServer community
- GeoSolutions clustering topology training
Training documentation, inspected October 2026; GeoSolutions; training material is CC BY-NC-SA. Diagrams here are original reconstructions, not copied artwork.
- Advanced clustering with GeoServer
Historical article; GeoSolutions; original authorship described in my confirmed account
- GeoServer JMS extension source
Historical authorship retained in source; module maintained by the community; Original contribution by Carlo Cancellieri and later community contributions