Configuring a Galera Arbitrator with garbd: Quorum Without Data

A Galera arbitrator (garbd) is a lightweight daemon that joins the group communication layer as a full voting member but stores no data — it exists to break ties, so two full data nodes in two availability zones can survive the loss of either zone without going read-only. This guide, part of Automated Failover & Quorum Recovery in Galera, shows exactly how to deploy garbd as a systemd service in a third failure domain, wire it into the Galera cluster on port 4567, weight its vote correctly, and verify it is counting toward quorum — plus the honest trade-off of when a garbd tie-breaker is the right call versus when you should just run a third full node.

Context: Why a Dataless Vote Solves the Two-Node Trap

Galera keeps the group writable only while the connected members hold a strict majority of the last-agreed weight. A two-node cluster has a total weight of 2, so a majority requires strictly more than 1 — meaning both nodes. Lose either one and the survivor is a minority of one, transitions to non-Primary, and refuses writes. That is the two-node trap: a Galera cluster that cannot tolerate a single failure, which is the exact opposite of why you clustered. The quorum arithmetic behind it is developed in the failover and quorum-recovery guide.

The classic fix is a third full node, giving a total weight of 3 where any two nodes form a majority. But a third full node means a third full copy of the data, a third machine sized for the workload, and a third SST donor to manage. garbd gives you the vote without the data: it participates in the group communication system and certification protocol, receives every write-set so it can vote on the primary component, but discards them instead of applying — it never runs InnoDB, never serves a query, and never acts as an SST donor. Placed in a third availability zone, it turns a symmetric two-AZ split into a decidable one: whichever data node can still see the arbitrator holds two votes of three and stays writable.

A garbd arbitrator as the tie-breaking third vote across three zones Availability zone A holds full Galera data node 1 and availability zone B holds full Galera data node 2, each carrying one vote and exchanging synchronous write-sets over TCP port 4567. Availability zone C holds a garbd arbitrator that carries one vote and receives write-sets to vote on quorum but stores no data. Total weight is three, so if the link between zone A and zone B breaks, whichever data node can still reach the arbitrator in zone C holds two votes of three and stays the writable primary component. AVAILABILITY ZONE A Data node 1 full InnoDB copy weight 1 · writable AVAILABILITY ZONE B Data node 2 full InnoDB copy weight 1 · writable AVAILABILITY ZONE C garbd arbitrator weight 1 · no data write-sets · TCP 4567 vote-only join · receives write-sets, discards them Total weight 3 → either data node + arbitrator = writable majority
The arbitrator adds a third vote from a third zone with none of the storage cost: whichever data node still reaches garbd keeps a two-of-three majority when the A–B link fails.

Solution: Deploy garbd as a Managed Service

Step 1 — Install the arbitrator package

garbd ships separately from the server. On the third-zone host (which needs no MariaDB server at all):

# Debian / Ubuntu
apt-get install -y galera-arbitrator-4
# RHEL / Rocky / Alma
dnf install -y galera-4-garbd

The host only needs outbound and inbound reachability to both data nodes on port 4567; it needs no data volume, no InnoDB tuning, and a fraction of the memory of a full node.

Step 2 — Write the arbitrator configuration

garbd reads a small INI-style file. The group must match the data nodes’ wsrep_cluster_name exactly, and address is the gcomm:// seed list of the real nodes:

# /etc/default/garb  (Debian) or /etc/sysconfig/garb (RHEL)
# The cluster this arbitrator votes in — MUST equal wsrep_cluster_name.
GALERA_GROUP="prod-galera-primary"

# gcomm:// seed list of the DATA nodes (not the arbitrator itself).
GALERA_NODES="10.0.1.11:4567 10.0.2.12:4567"

# Provider options: give the arbitrator a normal weight and log to a file.
GALERA_OPTIONS="pc.weight=1; gmcast.listen_addr=tcp://0.0.0.0:4567"

# Send garbd's own log somewhere durable.
LOG_FILE="/var/log/garbd.log"

Keep pc.weight=1 for a symmetric two-data-node design so the total weight is 3. Only raise the arbitrator’s weight (for example to 2) if you deliberately want the zone-C vote to dominate — useful when one data zone is your designated survivor, but a choice that makes the arbitrator a single point of quorum failure, so weight it up only with intent.

Step 3 — Run it under systemd

The packages ship a garb unit that sources the file above. Enable and start it, then confirm it stays up:

systemctl enable --now garb
systemctl status garb --no-pager

If you manage units directly, the effective service is simply the garbd binary invoked with the group and address, run as an unprivileged user and restarted on failure:

# /etc/systemd/system/garb.service (illustrative — the package unit is preferred)
[Unit]
Description=Galera Arbitrator (garbd)
After=network-online.target
Wants=network-online.target

[Service]
Type=simple
EnvironmentFile=/etc/default/garb
ExecStart=/usr/bin/garbd --group ${GALERA_GROUP} --address gcomm://10.0.1.11:4567,10.0.2.12:4567 --options ${GALERA_OPTIONS} --log ${LOG_FILE}
Restart=on-failure
RestartSec=5
User=nobody

[Install]
WantedBy=multi-user.target

Step 4 — Open the firewall between all three zones

garbd speaks the same group-communication protocol as the data nodes, so port 4567 (TCP, and UDP for the multicast path if you use it) must be open bidirectionally between the arbitrator and each data node. It never needs 4568 (IST) or 4444 (SST) because it never transfers state. The full port map and hardening rules are in Network Security & Firewall Rules for Galera.

Parameter Reference

Setting Where Purpose Recommended
GALERA_GROUP / --group garb config Cluster name the arbitrator votes in Exactly equal to the data nodes’ wsrep_cluster_name
GALERA_NODES / --address garb config gcomm:// seed list of the data nodes Both data-node IPs on :4567; never the arbitrator’s own address
pc.weight GALERA_OPTIONS The arbitrator’s quorum vote weight 1 for a symmetric 2+1 design; raise only to designate a survivor zone
gmcast.listen_addr GALERA_OPTIONS Interface/port garbd binds for group comms tcp://0.0.0.0:4567 (or bind to the inter-zone NIC)
LOG_FILE / --log garb config Durable log for view changes and votes A persistent path; garbd is silent by default
Port 4567 firewall Group communication + write-set traffic Open TCP (and UDP) between arbitrator and both data nodes

Verification

After starting garbd, confirm the data nodes actually count it. On either data node, the Galera cluster size should include the arbitrator:

SHOW GLOBAL STATUS LIKE 'wsrep_cluster_size';   -- 2 data nodes + garbd → 3
SHOW GLOBAL STATUS LIKE 'wsrep_cluster_status'; -- Primary

wsrep_cluster_size counting 3 while you run only two data nodes is the proof the arbitrator joined and is voting. Inspect the members to see the arbitrator explicitly:

SELECT NODE_NAME, NODE_INCOMING_ADDRESS
FROM information_schema.wsrep_membership;   -- one row shows the garbd node

Then confirm the daemon is healthy on the arbitrator host and logging view changes:

systemctl is-active garb
grep -E 'view\(|PRIM|NON_PRIM' /var/log/garbd.log | tail

The real test is a failure drill: stop MariaDB on one data node and confirm the other stays Primary with wsrep_cluster_size=2 (surviving data node + arbitrator) and continues accepting writes. Wire that assertion into the same health checks described in Automated Node Health Monitoring.

Edge Cases & Gotchas

  • The arbitrator must not share a failure domain with a data node. Running garbd in the same AZ, rack, or hypervisor as data node 1 means a single-zone outage takes down both a data node and the tie-breaker at once — you are back to a survivor that is a minority of one. The whole value is topological: it only breaks ties if it fails independently, which is why it belongs in a distinct third zone. Placement rules live in Designing Multi-Master Topologies.
  • garbd cannot be an SST donor or joiner. Because it holds no data, a joining node can never SST from the arbitrator, and the arbitrator never needs state itself. If your monitoring flags the garbd “node” as never reaching Synced, that is expected — it has no data state to sync; judge it by whether it appears in wsrep_cluster_size, not by a state comment.
  • A weighted arbitrator is a single point of quorum failure. Setting the arbitrator’s pc.weight above the data nodes’ concentrates quorum in the one process that stores nothing and is easiest to forget to monitor. If the weighted arbitrator dies, both data nodes can lose quorum simultaneously. Prefer equal weights unless you have a specific designated-survivor requirement, and if you do weight it, monitor the arbitrator as critically as a data node.