If there are multiple DHCP servers on the same physical network, the client will pick up an IP address from the first DHCP server that replies. This is unpredictable, however, there are two scenario’s witch are used in redundant environments.
Scenario 1 : Split up the DHCP range. For example, if you have 2 DHCP servers,
server 1 on 192.168.2.1 and
server 2 on 192.168.2.2, both subnet mask 255.255.255.0, assign the range to handout on
server 1 to 192.168.2.51 - 192.168.2.150, assign the range to handout on
server 2 to 192.168.2.151 - 192.168.2.250. This way, you will never have a problem with duplicate IP addresses, and you’re sure the client will always get an IP address. You will however never be sure of the IP address you’ll get.
Scenario 2: assign ALL IP addresses, based on the MAC address of the devices. you would for example assign 00:01:02:03:04:05 the IP address 192.168.2.3 on BOTH DHCP servers, this will ensure the device will always get the same IP address, regardless of the server that answers.
You can of course combine the two scenario’s, assign MAC based IP addresses for known devices (your own) and set up two different ranges on the individual DHCP servers for guests. Make sure the fixed and dynamic ranges don’t overlap.
fixed (based on MAC address) 192.168.2.3 - 192.168.2.50, defined on both
server 1 (dynamic - for guest devices) 192.168.2.51 - 192.168.2.150
server 2 (dynamic - for guest devices) 192.168.2.151 - 192.168.2.250
The upside of having 2 DHCP servers is redundancy, you will always get an IP address, unless both servers are down.
The downside of having 2 DHCP servers is that pihole will only be able to resolve the client names for witch it handed out the DHCP address, the others will show up with IP only. This can be solved by implementing this, section QA - Q: Why so many local requests?
Personally, I’m running DHCP on the pfsense box (router / firewall), using pihole for DNS only, with the solution for client name resolution on the pihole, as explained before.