Как масштабировать приложение PHP (серверы, mysql, memcache)
В настоящее время я создаю сайт для социального проекта в Швейцарии.
И перед переполнением пользователя я хочу подготовить приложение к масштабированию.
Я сам ответил на многие вопросы, но некоторые остались.
Я объясню, что я хочу делать.
Первая
в начале, приложение будет иметь только один сервер (короткое время) с DNS, PHP, Mysql, Data и memcache.
Второй
Тогда я разделим их на два
- DNS, Mysql, memcache
- Данные, PHP
Третий
Вот проблема, я не знаю, как это сделать именно здесь, чтобы приложение работало хорошо.
Я мог бы сделать:
- Фронт: балансировка нагрузки, memcache, DNS
- Web 1: PHP, DATA
- Web 2: PHP, DATA
- Mysql
Это будет схема, все сессии PHP хранятся в БД.
НО, как мне синхронизировать данные?
я запускаю Rsync, чтобы поддерживать их в актуальном состоянии.
я помещаю их на отдельный диск (сетевой диск), чтобы быть уверенным?
но в этом случае, как я могу сделать это при загрузке пользователя?
и если веб-сайт получит больше успеха, и нам нужно продолжить работу над большими структурами, не создаст ли он некоторое время на обновления?
или было бы неплохо перейти непосредственно к веб-сервисам amazon?
некоторая информация
Я использую codeigniter как Framework.
Я использую linux как web-сервер (дистрибутив не выбран сейчас, но должен быть Debian)
Заранее благодарим за ваши ответы.
Ответы
Ответ 1
Согласно Wikipedia, Швейцария имеет 4,6 миллиона немецких ораторов, 1,5 миллиона французов и 0,5 миллиона ораторов итальянского, римского и Другие языки. Поэтому я подозреваю, что вы обнаружите, что один сервер будет соответствовать вашим потребностям. Угадайте, какой процент населения посещает ваш сайт каждый месяц или каждый день, чтобы получить представление о том, насколько большой вы можете получить, прежде чем запускать проблемы масштабирования.
Итак, я не думаю, что вам нужно беспокоиться о масштабировании! Бонус: время, когда вы не беспокоитесь об этой проблеме, вы можете использовать для решения других проблем для своих пользователей.
Ответ 2
Есть несколько общих путей для масштабирования веб-сервисов, чтобы, по-видимому, использовать такие сайты, как Flickr и Facebook:
- Разделить серверы на основе концепций (API, логин, мультимедийные файлы, объявления, статические страницы, динамические страницы).
- Разделить базы данных на основе понятий, которые не должны быть объединены (логины, долгосрочная отчетность, данные страницы и т.д.).
- Скомпилируйте/оптимизируйте свой PHP и другие ресурсы (спрайты, скомпилированные css, zend)
- Добавить кеширование (передний конец, конец)
- Добавить делегацию (round robin и т.д.)
Но, прежде чем масштабировать, измерьте. Набор тестов, рассчитать свою емкость и не оптимизировать, прежде чем вам понадобится.
Ответ 3
Я вижу некоторые сомнительные вещи:
-
У вас есть один SQL-сервер, и вы храните сеансы в базе данных на сайте, где вы ожидаете чрезвычайно большой объем. Сколько запросов требуется для создания одной страницы, если кто-то вошел в систему и что ожидается, замедляется, когда вы в конечном итоге используете репликацию MySQL?
-
Если вы используете кластер FS, все синхронизируется. Вы не закончите со сборкой A на веб-сервере 1, пока будете строить B на веб-сервере 2 разрыва. Если вы действительно ожидаете, что много трафика, в то время, которое требуется для загрузки изменений, затем синхронизируйте все узлы, вы просто разозлили тысячи людей.
Я развертывал приложения, работающие на кластерах, используя OCFS2 с более чем 40 узлами без проблем, а OCFS2 - это не совсем "лучший" кластер FS. Проверьте Lustre и подумайте о том, чтобы держать сеансы на диске.
Ответ 4
Помните, что вы можете монтировать/совместно использовать папки.
Какие данные вы будете синхронизировать?
Вы можете рассмотреть возможность размещения данных на машине базы данных или другой машине. Обычно машина db является хорошей идеей, так как она, вероятно, имеет больше IO, чем обычный веб-сервер.
Вероятно, неплохо настроить SAN или подобное, чтобы ваши данные остались в одном месте. Множество копий данных - это боль, с которой приходится иметь дело. Переход по этому маршруту означает, что вы также можете поместить туда файлы db.