This is just notes on how we built one. Both of our routers are virtuals, running under the KVM hypervisor. That allowed a bunch of shortcuts, such as defining vlans at the hypervisor levels and replicating a running router for the second one. We used two separate machines; the hypervisor was mainly so we could put some additional low resource virtuals on the same physical machine.
We'll need one share IP for each interface, so one IP for each router, and one shared one, so a total of 3 IP's set aside for the set.
You should now have two virtually identical installations, with only the name, IP's and MAC addresses different.
I did NOT set up as recommended with an additional interface only for CARP. Instead, I used the LAN interface for that.
One thing you can do with this setup is perform maintenance, with a fallback if something goes bump.