Собственно я не хотел бы привязываться в ответе к конкретным реализациям (nginx, apache, etc), т.к. сам сейчас работаю в основном с Windows Azure (по нему могу и конкретно с реализацией подсказать).
По задачам:
1. Нужно, чтобы какой-то из серверов откликнулся на запрос, даже при отказе одного из них — это делается
фокусами с DNS
2. Нужно, чтобы копия UGC, была доступна с других серверов например — загруженных файлов, особенно если они большие.
Вот тут я бы делал примерно следующее: сервер получивший файл, сообщает другим серверам, что у него есть новый файл. Те складывают это знание себе в базу. При запросе пользователем этого файла с другого сервера — осуществляется загрузка файлика на сервер, ставим отметку, что фай2л у нас теперь есть и отдаем его пользователю.
Если речь идет, допустим, о блог записях — то проще при получение записи сразу реплицировать ее на другие сервера.