Para o MySQL, use a replicação para manter o servidor de backup em sincronia com o primário. Consulte a documentação e lembre-se de que a replicação é assíncrona e pode ficar atrasada até mesmo moderada carga.
PHP e Apache são serviços sem estado que não precisam ser sincronizados, além de suas configurações.
Se você não quiser um balanceador de carga, pode usar pulsação para gerenciar um IP virtual entre os dois servidores. Se o servidor principal ficar inativo, o secundário atribuirá o IP e continuará a atender o tráfego. Note que isto apenas monitorará os heartbeats entre os dois serviços de heartbeat, não o estado de execução do mysql / apache / etc.
o que hospedaria a parte que decide qual servidor será usado?
Os clientes do servidor Web se conectariam ao IP virtual ou a um nome de host que resolvesse esse IP, para que o tráfego atingisse apenas o servidor que possui esse vip e o outro servidor seria apenas de espera.
Configure o PHP nos dois servidores para conectar ao MySQL no host local, assim, se o primeiro servidor morrer, o segundo assumirá esse IP e continuará. Tenha em mente, porém, que a replicação regular do MySQL unidirecional significa que, assim que você começar a escrever para o escravo, o mestre original estará sempre desatualizado e precisará ser reconstruído. Você pode usar a replicação master-master ou o Percona XtraDB Cluster, mas esses são mais complicados de serem configurados.