Open Source · 2010–2014

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.

Open full-size SVG
GeoServer · three independent responsibilitiesOGC traffic reaches two serving nodes, while a designated authoring node propagates configuration via JMS. Spatial data has a separate management strategy. GeoServer · three independent responsibilities Documented private-directory topology · designated configuration writer 01 REQUEST PLANE Clients and authorized administration OGC clients Queries and map requests Traffic distribution Active/Active serving Administrator UI / REST configuration queries config edit 02 CONFIGURATION PLANE GeoServer instances and JMS channel Serving replica Apply catalog changes Authoring + serving Designated config writer ActiveMQ / JMS Configuration messages queries queries publish deliver configuration 03 DATA MANAGEMENT Separate from configuration messages Replica data directory Persist configuration Writer data directory Spatial sources persist persist spatial reads spatial reads Spatial files and databases need their own sharing or synchronization strategy. Conceptual request distribution; this drawing does not assert a particular load-balancer implementation. 01 REQUEST PLANE Clients and authorized administration 02 CONFIGURATION PLANE GeoServer instances and JMS channel 03 DATA MANAGEMENT Separate from configuration messages Request / integration Message / asynchronous work Persistence / data access

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.

Open full-size SVG
GeoServer · a configuration change crosses boundariesAn authorized edit is persisted on the writer and sent through JMS. The replica consumes configuration, applies it in memory and persists locally. The publish/persist atomicity is not established. GeoServer · a configuration change crosses boundaries Architecture-level flow · not a source trace through a particular listener AUTHORING RESPONSIBILITY One designated writer UI / REST edit Authorized catalog change GeoServer configuration Catalog and service objects Local data directory Writer persistence apply change persist DELIVERY RESPONSIBILITY Broker and subscription configuration JMS publication Configuration objects ActiveMQ channel VirtualTopic / broker routing Subscription Durable if set publish route deliver REPLICA RESPONSIBILITY Configuration state; spatial data excluded Registered consumer Receive config messages Replica catalog Apply in-memory state Replica directory Persist configuration deliver configuration apply persist No inspected evidence establishes one transaction across writer persistence and broker publication. Durability is a delivery configuration; duplicate effects, ordering and writer failover need separate review. AUTHORING RESPONSIBILITY One designated writer DELIVERY RESPONSIBILITY Broker and subscription configuration REPLICA RESPONSIBILITY Configuration state; spatial data excluded Request / integration Message / asynchronous work Persistence / data access

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 section
What 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 section
What 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 section

Sources & scope