High availability and clustering
Design and build an XPLG cluster: the X8 Compose roles across servers, the V7 HA cluster on hosts you manage, load balancing, processor failover, geo-redundancy and what is not documented yet.
What you will do: choose a cluster shape, wire the nodes so they share one configuration, put an entry point in front of the UI, and know what happens when a node fails.
A cluster is the recommended model for production. It scales by adding nodes or processes, separates user-facing work (UI, queries, dashboards) from back-end work (ingestion, indexing, analytics, monitoring), and keeps running when a node or process fails because every node can take over core tasks and in-flight work is redistributed. Below about 10 GB/day a single process may do; above that, run processor and UI on dedicated instances — see Sizing and capacity planning. The per-host install steps are on Docker (X8) and Virtual machine and bare metal (V7); this page is the cluster layer on top of them.
Topology
| Element | X8 (8.2.0-Main, Compose) | V7 (7.9859, installer) |
|---|---|---|
| Roles | master (exactly one per cluster: configuration authority and job dispatch), ui, listener, processor, optional processor-1; one image, host networking | UI nodes; a management array of Master, Processors and Listeners; optionally a PortX instance in the cloud as a data gateway |
| Shared state | Ignite and Hazelcast between servers, host to host; the external configuration (/home/data, extConf) on a path that may be NFS; /node/data per role on local disk only | One EXTERNAL_CONFIGURATION_DIRECTORY on shared storage, mounted by every node with full read and write; hot and cold tiers on the same storage |
| Entry point | Traefik edge with sticky, health-checked pools, or your own load balancer on the role ports | A load balancer in front of the UI nodes when there is more than one |
| Smallest cluster | One server running master,server (all roles) | Two processes on one machine (XpoLog_Center_UI and XpoLog_Center_PROCESSOR) |
| Failure handling | The wiki documents the join rules and the verification; what happens when the master server is lost is not documented — pending engineering | One active processor; a UI node takes over after five minutes unless you disable it; an alert is sent when the active processor changes |
Rules that apply to both: every node NTP-synced; one data centre or region per cluster; Windows sources are read from a Windows node only (V7) or from an Agent Mode instance on Windows.
X8: Compose cluster
- Pick the layout. One server:
COMPOSE_PROFILES=master,server. Two servers:master,serveron the first,server-additional(processor and processor-1, no ui) on the second. Six servers: one role each (master,ui,listener,processor,processor-1). The same compose files go on every server; only.envdiffers. - Write the shared part of
.envonce and copy it to every server: the seed mapXPLG_SEED_1_IP…XPLG_SEED_6_IP,IGNITE_CMG_NODESandIGNITE_META_STORAGE_NODES(a fixed odd-numbered list of<alias>-<role>names),XPLG_HAZELCAST_MEMBERS(every member asalias:port— a port-less entry leaves that member standalone),XPLG_IGNITE_DISCOVERY_SEEDSandXPLG_JOBS_MASTER_CONN=http://xplg-seed-1:30308/logeye(without it processors never run jobs). Ignite initialisation is not a variable: themasterrole does it. - Set the per-server part:
SELF_ALIAS(xplg-seed-1,xplg-seed-2, …; a multi-server cluster must set it or two servers collide on node names and the join is refused) andCOMPOSE_PROFILES. - Storage.
XPLG_BASE_HOST_PATHon local NVMe or SSD on each server;XPLG_SHARED_HOST_PATHon one NFSv4 export mountedrw,hard,noatime,_netdevand exported withanonuid=30303,anongid=0, pre-owned30303:0with mode2775. - Preflight and ports on every server:
sudo ./xplg-preflight.sh ./.env(exit 0 = READY), thensudo ./xplg-open-ports.sh ./.env --source <cluster cidr>. Ignite discovery (13344–13348) and Hazelcast (11473–11477) must be reachable between all servers; see Networking and ports. - Start with
docker compose -f docker-compose.yml [-f docker-compose.traefik.yml] up -don each server and wait one to eight minutes;init-permsruns first and refuses to start the roles if the tree is not writable. - Edge. Run Traefik on one server, or on two or three as independent, equal entry points — never chained. Either list the servers per pool (
XPLG_TRAEFIK_UI_SERVERS,XPLG_TRAEFIK_MASTER_SERVERS,XPLG_TRAEFIK_LISTENER_SERVERS,XPLG_TRAEFIK_PROCESSOR_SERVERS) or let nodes register themselves: each server writes one<alias>-<role>.nodefile intoconf/registry/,traefik-initre-reads the folder every ten seconds and regeneratesconf/dynamic/xplg-routes.yml(never hand-edit it). PointXPLG_TRAEFIK_REGISTRY_PATHat the shared mount so every server's nodes join the pools; the lists and the registry are unioned. Add or remove a node by hand with a one-line.nodefile (ui xplg-seed-7 10.0.0.77:30304). - Verify with
./verify.sh: every role port answers, every Traefik entry answers 200 or 302, and repeated requests through the ui pool return the same sticky cookie.
A second cluster can share the same hosts: shift every port with the {ROLE}_{KIND}_PORT variables, give it its own COMPOSE_PROJECT_NAME and XPLG_BASE_HOST_PATH, and write the shifted ports into its XPLG_IGNITE_DISCOVERY_SEEDS and XPLG_HAZELCAST_MEMBERS so the two clusters never probe each other.
V7: HA cluster on hosts you manage
Preparation: decide Windows or Linux (Windows when Windows machines must be read directly); size the UI and processor machines from the sizing page; NTP everywhere; a shared storage device every node can read and write, with the fastest connectivity to the UI node. The wiki recommends consulting support before building a cluster.
- Install XPLG on every node with the installer and open
http://<node>:30303on each to confirm it runs. - Shared configuration. Create the
EXTERNAL_CONFIGURATION_DIRECTORYon the shared storage. On every node open Settings > General, select Use external configuration directory, enter the full path, select Cluster Mode, save — and do not restart yet. On the Mail tab set SMTP and the administrator address: the cluster mails an alert when the active processor changes. - Name and size each node. In
XpoLog.sh.lax(Linux) orXpoLog.lax(Windows), on thelax.nl.java.option.additionalline, set-Xmxper the memory rules and append-Dxpolog.uid.structure=<NODE_NAME>(PROCESSOR1,UI01, …). Restart, processor node first. - Cluster properties. On the processor node open
http://<processor>:30303/logeye/support, choose Advanced Settings and set:cluster.allowedMasters(the processor node names, comma-separated),htmlUtil.BaseUrl(http://<processor>:<port>/logeye/),htmlUtil.ui.BaseUrlandmail.link.baseUrl(the UI node, or the load balancer when there is one). With support only:cluster.shouldCheckForMaster=falsewhen UI nodes must never take over the processor role, andcluster.takeOverAttempts.notAllowedMaster(minutes, above 5) to let the processor stay down longer before a UI node takes over. - Dedicated listener node (optional): give it 2 GB, switch it to Agent Mode, add an empty
recycleCronExpression=line to itsxpologInit.propso it is never recycled, restart it, then on each listener account set Listening node to it and Indexing node to the master or a processor. - Verify. Settings > General on every node shows the external directory and Cluster Mode active, and
EXTERNAL_CONFIGURATION_DIRECTORY/conf/general/cluster/holds<PROCESSOR_NODE_NAME>.masterNodewithin two minutes.
Two processes on one machine: install into XpoLog_Center_UI and XpoLog_Center_PROCESSOR, rename server.xml.processor to server.xml in the processor's ServletContainer/conf/ so it listens on 30304 and 30444, then follow the configuration steps above. On Windows give each instance its own service name in the installer (or sc create <name> binpath= "<install dir>\XpoLog.exe -zglaxservice XpoLogCenter" start= auto); on Linux pin each process to a CPU range with cpus= in its runXpoLog.prop.
Load balancing the UI
- X8. The Traefik ui pool on
:80and:443is sticky and health-checked;:30303and:30443reach the master pool,:8304–:8308the per-role full-tree consoles. Traefik answers 503 until a member is healthy. - V7. The wiki's recipe is Apache httpd with
mod_jk: aworkers.propertieswithworker.balancer.type=lb,balance_workers=ui1,ui2,sticky_session=Trueand oneajp13worker per UI node;JkMount /* balancerinhttpd.conf; on each UI node the AJP connector port inServletContainer/conf/server.xmlset to the worker's port andjvmRoute="ui1"on theEngineelement; restart the UI nodes and httpd; users open the httpd address. On AWS, an Application Load Balancer with a target group on port 30303 does the same. - A load balancer, proxy or firewall is your infrastructure: XPLG support may ask you to bypass it to isolate a problem — see Support terms.
Failover and continuity
- Active processor (V7). One processor runs the system tasks; when it is down or loses the storage, a UI node takes over after five minutes (unless disabled, see step 4) and System Health raises "processor node has changed to …", then "changed back" when it recovers. Workloads are redistributed and in-flight ingestion, indexing, alerts and reports complete.
- Spot instances (AWS). Processors and UI nodes can run on persistent spot instances with stop-on-interruption and a disk that survives the stop; only the master is a reserved instance, and it can be small (4 CPUs, 8 GB) because it orchestrates and does not process; the external configuration sits on EFS mounted
nfs4,hard,_netdevfrom/etc/fstab. - Geo-redundancy. A secondary site receives the full configuration through the Inbox/Outbox synchronisation and takes over on a regional outage; raw data is replicated by your own storage tooling. The procedure is on Backup and restore.
- Licensing. One license covers the whole cluster, generated from any node; in dock, high availability is an add-on below the 100 GB/day tier and included from it — see How licensing works.
When a node will not join or the active processor keeps changing, see Clusters and performance.
Next: Networking and ports
Source: XPLG wiki, pages 1602584512, 1602584510, 1594132401, 1594133322, 1683849221, 1594753047, 3161587738, 1599570438, 1594132938, 3150774276, 3150544899, 3151659011, 3180101636, 1594132392, 1598685161 (https://xpolog.atlassian.net/wiki/spaces/XPOL/pages/1602584512). Pending from XPLG engineering: the X8 behaviour when the master server is lost (not documented).