PHP сессии в redis – масштабируем

При работе веб-приложения на нескольких серверах одновременно, приходится решать проблемы с балансировкой нагрузки и производительностью. Камнем преткновения в такой ситуации являются пользовательские сессии, которые обычно приходится привязывать к одному из серверов (sticky-sessions).

Такая ситуация может привести к тому, что со временем один из серверов будет загружен, а второй – будет простаивать. Решением является синхронизация сессий, которые в PHP создаются по-умолчанию в виде файлов вида sess_lb7ip32a877g2oih9f1ubqum92. Можно делать синхронизацию, записывая данные не в файлы, а в базу MySQL и осуществляя репликацию. Но, к сожалению, механизмы репликации в MySQL далеки не то чтобы от совершенства, а от уровня стабильности, который позволил бы использовать её в продакшн системах..

А вот у nosql redis c master-slave репликацией и масштабируемостью проблем я не видел – на нём и реализуем хранилище сессий. Проблема существует только для master-to-master репликации – тут придётся подождать выхода Redis Cluster. Или держать соединения не только со своим редисом, но также и с редисом на другом сервере, чтобы вносить правки одной транзакцией (считаем хопы, господа), но это уже грабли на уровне приложения. Так что пока придётся менеджером сессий принудительно назначать один из серверов.

Говорят, что master-master репликация хорошо работает в PostgreSQL – возможно, там уже сейчас просто реализовать вышеописанный функционал полностью и без косяков.

клонируем и собираем PHPredis

phpize
./configure
make && make install

хотя конечно лучше просто собрать пакет в debian:

dpkg-buildpackage

В php.ini добавляем что-то типа:

extension=redis.so

session.save_handler = redis
session.save_path = "tcp://localhost:6379/"

Теперь осталось настроить только репликацию в редис

Leave a Reply

Your email address will not be published. Required fields are marked *