@romanpostovalov
Developer

Как загружать и хранить медиа данные юзеров на разных серверах?

Двигаюсь в сторону изучения и применения методов разработки для High load проектов. Возникают несколько вопросов.

Есть некоторое приложение на PHP, nginx, postgresql с таблицей юзеров. Каждый юзер может загружать некоторый медиа контент, такой как картинки, видео, документы. Сейчас это сохраняется все в одной папке на сервере, каждому файлу дается уникальное имя по хешу и по разным папкам на основе id юзера.

1. Для хранения файлов выделяется 2 сервера, мне нужно загрузку файлов распределить по ним и соотствественно для каждого файла надо знать на каком сервере он хранится? Как сделать разбиение и по какому признаку? Нужен ли для отдачи медиа данных балансировщик или просто при сохранении файлов писать полный путь с сервером?

2. Как реализовать запуск 2 веб серверов с одинаковыми версиями приложений и балансировать между ними? Можно ли обойтись nginx или нужен HAproxy? Правильно я понимаю, что для подключения 3 сервера потребуется также развернуть на нем такую же версию приложения, а если 10 серверов нужно добавить будет и балансировать между ними?

3. Вопрос про горизинтальное масштабирование, предположим что база будет расти, и надо будет распределить нагрузку между отдельными серверами баз данных?

И тут вопросы, писать самому балансировщик, чтобы создание новых юзеров раскидывать по базам или использовать PgBouncer в связке с PgPool? А какие еще варианты есть?
  • Вопрос задан
  • 320 просмотров
Пригласить эксперта
Ответы на вопрос 1
@maxtm
Make money, not job
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 выполняются на разных машинах остальные запросы сразу на всех машинах.
Ряд нод работает с одной БД, другая - с другой, при этом данные у них одинаковы.

Либо шардирование. "Ручное" распределение данных между несколькими серверами.

Прежде чем думать о создании нескольких нод базы данных, определите что именно этот участок приложения является узким горлышком.
Куда проще прикруть кэш, чем организовывать работу с несколькими БД.
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы