Failover clustering, as you mention, is probably your best bet here. You need a minimum of 2 servers (not 3, thankfully).
Your best options would be either to:
- Individually cluster the services running atop the 2 physical servers (i.e. install AD,DHCP,DNS on each of the physical servers and make them aware of one another using their native functionality) or my preferred option:
- Build a Windows Failover Cluster atop your two physical servers, and then create clustered roles on that Failover Cluster (either directly, or inside of VMs). This approach has a number of advantages (I advise you to research it in more detail), but automated failover and live migration are two of my favourites.
The latter option will require you to have (among other pre-requisites), a shared storage medium, and identical server hardware, as well as multiple NICs, etc.
The MS docs on the topic are dense, but very helpful - I highly recommend that you read through them.
As an aside - most of the roles you've mentioned are actually best deployed as pairs (or more) such as AD-DS, DNS, DHCP, etc - rather than having an active/backup relationship - but I still recommend that you familiarise yourself with failover clustering as an option.