1. Для хранения файлов выделяется 2 сервера, мне нужно загрузку файлов распределить по ним и соотствественно для каждого файла надо знать на каком сервере он хранится? Как сделать разбиение и по какому признаку? Нужен ли для отдачи медиа данных балансировщик или просто при сохранении файлов писать полный путь с сервером?
1. Если физически файлов много, либо к ним большой трафик, то разносите так как вы написали.
Разбивайте по признаку "один сюда, другой сюда", то есть 50/50%.
Балансировщик нужен тогда, когда у Вас один вид контента одновременно находится на многих сервера, и Вы распределяете между ними нагрузку.
А тут у Вас уникальный контент на каждом сервере, соответственно балансировать нечего.
Просто обращайтесь напрямую к этому сервер (s1.example.com, s2.example.com)
2. Как реализовать запуск 2 веб серверов с одинаковыми версиями приложений и балансировать между ними? Можно ли обойтись nginx или нужен HAproxy? Правильно я понимаю, что для подключения 3 сервера потребуется также развернуть на нем такую же версию приложения, а если 10 серверов нужно добавить будет и балансировать между ними?
2. nginx отлично справится с балансировкой.
Да, добавляя новую ноду обеспокойтесь чтобы там была абсолютная копия приложения.
Обычно это делается через эталонный image-сервера, и при создании новой ноды просто выбирается этот образ компьютера - и вуаля, у вас уже готовая нода.
Будь у вас 2 сервера, или 20 - nginx отлично сделает балансировку в соответствии с Вашими желаниями.
3. Вопрос про горизинтальное масштабирование, предположим что база будет расти, и надо будет распределить нагрузку между отдельными серверами баз данных?
3. С постгри имею не большой опыт. Могу по опыту MySQL сказать.
В последних версиях mariadb есть galera cluster, это полнофункциональный кластер из мастер-мастер mysql-нод.
Возможно, у pg есть аналог.
Суть в том, что трафик по бд раскидывается по нодам, записи типа SELECT выполняются на разных машинах остальные запросы сразу на всех машинах.
Ряд нод работает с одной БД, другая - с другой, при этом данные у них одинаковы.
Либо шардирование. "Ручное" распределение данных между несколькими серверами.
Прежде чем думать о создании нескольких нод базы данных, определите что именно этот участок приложения является узким горлышком.
Куда проще прикруть кэш, чем организовывать работу с несколькими БД.