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.
$ 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
$ systemctl list-unit-files --type=service | grep -E '^(isc-dhcp-server|dhcpd)\.service' isc-dhcp-server.service disabled enabled
$ 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.
$ 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.
$ sudo pcs resource create dhcp_service systemd:isc-dhcp-server op monitor interval=30s
Use systemd:dhcpd when that unit is present.
Related: How to create a Pacemaker resource
$ 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.
$ sudo pcs status resources
* Clone Set: dhcp_service-clone [dhcp_service]:
* Started: [ node-01 node-02 ]
$ 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.