ip helper-address lines configured in your VLAN take the DHCP broadcast from the client, add the router's (gateway) address into the UDP packet, then unicasts to the DHCP servers. [I'm sure the packet rewrite is only done once, then a copy sent to each DHCP server.] All the listed servers configured receive the DHCPDiscover packet by the router relay.
The redundancy of your DHCP servers not only depends on your OS, but the specific version! For Windows that was mentioned, your options range from a true split-scope in
Windows 2008 R2 to active-failover redundancy in Windows 2012. For not-so-robust DHCP servers (i.e., Windows 2003), you can manually configure a split-scope. Common recommendation is the 80/20 rule with 80% of the leases configured on what you (and you alone) consider your primary DHCP server and 20% and the secondary. Exclusions get added to each DHCP server as they have overlapping scopes.
As I'm not a fan of overlapping scopes in Windows 2003 as the exclusions tend to get hidden from view, I prefer to simply split the subnet in half for each DHCP server. A /24 block for client leases becomes two /25 blocks. They key is the subnet mask in the scope is still a /24. Your start and end IP addresses in the range configured in the scope follows the /25. Now I do recommend some exclusions for network devices like VLAN interface IP addr's and HSRP as well as some for static devices (e.g. printers) in the same subnet. So I exclude the first 16 (0-15) addresses -- zero address wouldn't be used, of course, anyway -- and exclude the top 16 (240-255) -- 255 broadcast, of course. You can actually get away with not configuring the exclusion by simply starting and ending the IP address appropriately.
The basic scope information in a manually configured 50/50 split-scope (2x/25=/24) is similar to:
Scope-lower: 192.0.2.0/24, start 192.0.2.16, end 192.0.2.127, no exclusions
Scope-upper: 192.0.2.0/24, start 192.0.2.128, end 192.0.2.239, no exclusions
Configure identical scopes (2x/24) with appropriate exclusions if you prefer this method:
Scope-full: 192.0.2.0/24, start 192.0.2.16, end 192.0.2.239, exclusions 1-15, 128-254
Scope-full: 192.0.2.0/24, start 192.0.2.16, end 192.0.2.239, exclusions 1-127, 240-254
As there is an every so slight delay with the duplicate DHCPDiscover packets unicast to each
ip helper-address, all else being equal, the first DHCP server listed will usually be the first to respond with a DHCPOffer, and the address chosen by the client when it makes its DHCPRequest -- no guarantee though. So place your primary DHCP server first in your SVI for the VLAN. A client typically receives multiple DHCPOffers and decides on the best which is usually the first one received. The assignment completes only after the client sends a DHCPRequest back to the server -- in case the server changed its mind about the lease or is no longer reachable or ??? -- and the server sends a DHCPACK.
desc svi for vl123 dhcp relay example
ip address 192.0.2.1
ip helper-address 18.104.22.168 ! Primary DHCP server
ip helper-address 22.214.171.124 ! Secondary DHCP server
Between your data and voice VLANs, you may want to alternate what you consider the primary DHCP server for a given VLAN. I do this to help spread the lease load out a bit.
If a DHCP server's scope is full, it won't reply with a DHCPOffer, so the offer would come from another DHCP server, assuming it's not also full. Keep in mind when troubleshooting that a Windows client will remember the IP they had leased last and attempt to get that again. Also keep in mind any reservations you do must be done on both servers and accounted in any ACLs you have such as in firewalls.
See Understanding and Troubleshooting DHCP in Catalyst Switch or Enterprise Networks for detailed explanation and sniffer traces of the DHCP relay process.