Очень кратко про самые интересные тезисы из мастер-класса Алексея Рыбака (badoo.com 150 млн. пользователей)
Основы построения масштабируемых высоконагруженных веб-проектов
Конфигурация: nginx + php-fpm + mysql + eAccelerator + memcached.
- Memcached:
- zip data > 8k
- many gets -> mult-get
- server = crc32(key) % N or Ketama. Статья на хабре по теме: Кластеризация memcached и выбор ключа кэширования http://habrahabr.ru/post/42972/
- При изменении данных чистим кэши.
- NO common data via NFS (sessions, code) => local copies, sessions in memcached
- NO heavy writes into shared db real-time => if possible, async messages
- NO local cache => global cache
- Минимизировать работу с локальным диском (Например сессии php)
- SSD
- Закрытая статика: Проверка доступа через пхп, но отдача контента через X-Accel-Redirect (http://wiki.nginx.org/X-accel)
- URL-certificates: best practice, no scripting at all http://wiki.nginx.org/NginxHttpAccessKeyModule, http://wiki.nginx.org/HttpSecureLinkModule
- fastcgi_finish_request() //После ее вызова из скрипта, php-fpm получает сигнал о завершении запроса (т.е. отправляет ответ Web серверу), но сам скрипт не завершается. Т.е. вся логика, которая находится после вызова этой функции будет выполнена в фоне. http://highload.com.ua/index.php/2009/12/06/fastcgi_finish_request-asynchronous-requests/
- Использовать REQUEST_BODY_FILE для загрузки файлов.
http://php-fpm.org/wiki/Features
- Модуль ngx_http_memcached_module: nginx может читать данные напрямую из memcachedhttp://nginx.org/ru/docs/http/ngx_http_memcached_module.html
- MySQL:
- mysqli_prepare http://php.net/manual/ru/mysqli.prepare.php
- InnoDB (+локи на уровне строк), MyISAM - не дает выигрыша в высоконагруженных системах
- Деревья: хранить путь в упакованном виде (+ быстрый поиск и сортировка)
- Кешируем поисковые запросы в отдельных таблицах
- Часть primary key -> user_id (+ гарантия уникальности ключа)
- Отказ от NOW(), autoincrement, JOIN, ORDER BY, GROUP BY, сложных запросов
- Реплики дата центров (на каждый отдельно)
- Шардинг: юзер и все его данные на своем сервере.
- Сбор статистики производительности http://pinba.org/wiki/Main_Page
- Статистика загрузки страниц браузером js domReady - onLoad в куки, затем на сервер