Running ISC DHCP in an active-active pair keeps address assignment available during node maintenance or unexpected reboots, reducing the chance of clients failing to obtain or renew leases.

An active-active DHCP design relies on the dhcpd failover protocol so both servers can answer requests while coordinating lease ownership. pcs (Pacemaker) manages the DHCP systemd unit as a cloned resource so the daemon runs on every cluster node and is restarted when health checks fail.

Starting multiple DHCP servers without failover coordination risks duplicate leases and intermittent client connectivity. Ensure both nodes share the same pools and options, the failover peer relationship is stable, and inter-node traffic allows failover synchronization (commonly TCP port 647) before handing DHCP service control to pcs.

Steps to set up ISC DHCP active-active with PCS:

  1. Confirm the cluster is online with quorum.
    $ sudo pcs status
    Cluster name: clustername
    Cluster Summary:
      * Stack: corosync (Pacemaker is running)
      * Current DC: node-01 (version 2.1.6-6fdc9deea29) - partition with quorum
      * Last updated: Thu Jan  1 04:29:59 2026 on node-01
      * Last change:  Thu Jan  1 04:29:57 2026 by root via cibadmin on node-01
      * 3 nodes configured
      * 0 resource instances configured
    
    Node List:
      * Online: [ node-01 node-02 node-03 ]
    
    Full List of Resources:
      * No resources
    
    Daemon Status:
      corosync: active/enabled
      pacemaker: active/enabled
      pcsd: active/enabled
  2. Identify the ISC DHCP systemd service unit name.
    $ systemctl list-unit-files --type=service | grep -E '^(isc-dhcp-server|dhcpd)\.service'
    isc-dhcp-server.service                      disabled        enabled
  3. Validate the /etc/dhcp/dhcpd.conf syntax on each node.
    $ sudo dhcpd -t -cf /etc/dhcp/dhcpd.conf
    Internet Systems Consortium DHCP Server 4.4.3-P1
    Copyright 2004-2022 Internet Systems Consortium.
    All rights reserved.
    For info, please visit https://www.isc.org/software/dhcp/
    Config file: /etc/dhcp/dhcpd.conf
    Database file: /var/lib/dhcp/dhcpd.leases
    PID file: /var/run/dhcpd.pid

    No output indicates the configuration parsed successfully.

    Syntax errors prevent the daemon from starting and can trigger repeated restart attempts.

  4. Disable automatic DHCP service start outside Pacemaker on each node.
    $ sudo systemctl disable isc-dhcp-server.service
    Synchronizing state of isc-dhcp-server.service with SysV service script with /usr/lib/systemd/systemd-sysv-install.
    Executing: /usr/lib/systemd/systemd-sysv-install disable isc-dhcp-server
    Synchronizing state of isc-dhcp-server.service with SysV service script with /usr/lib/systemd/systemd-sysv-install.
    Executing: /usr/lib/systemd/systemd-sysv-install disable isc-dhcp-server
    Synchronizing state of isc-dhcp-server.service with SysV service script with /usr/lib/systemd/systemd-sysv-install.
    Executing: /usr/lib/systemd/systemd-sysv-install disable isc-dhcp-server

    Use dhcpd.service when that unit is present.

    Using --now can interrupt lease renewals if no other DHCP server is active.

  5. Create the ISC DHCP service resource.
    $ sudo pcs resource create dhcp_service systemd:isc-dhcp-server op monitor interval=30s

    Use systemd:dhcpd when that unit is present.

  6. Clone the ISC DHCP service resource across nodes.
    $ sudo pcs resource clone dhcp_service meta clone-max=2 clone-node-max=1

    Set clone-max to the number of nodes expected to run dhcpd.

  7. Verify the cloned resource status.
    $ sudo pcs status resources
      * Clone Set: dhcp_service-clone [dhcp_service]:
        * Started: [ node-01 node-02 ]
  8. Confirm the DHCP daemon is listening on UDP port 67 on each node.
    $ sudo ss -lunp | grep -E ':67[[:space:]]'
    UNCONN 0      0            0.0.0.0:67         0.0.0.0:*    users:(("dhcpd",pid=180019,fd=7))

    Port 67/udp serves DHCPv4, while DHCPv6 uses 547/udp.

  9. Update DHCP relays to forward client requests to all active nodes.
  10. Run a failover test with the traffic distribution in place.