В моей компании есть клиентское веб-приложение, распределенное по нескольким серверам с целью балансировки нагрузки и отказоустойчивости. Приложение написано на Ruby (Rack, работает под управлением Passenger), а аутентификация в приложении осуществляется с помощью файлов cookie сеанса HTTP.
В настоящее время мы используем базу данных SQL для хранения данных сеанса (репликация ее как часть нашей стандартной репликации базы данных), однако это решение не идеально, поскольку наша база данных SQL - это Postgres и не поддерживает операции с несколькими мастерами (во время технического обслуживания на пользователи, вошедшие в главную базу данных, могут сравнивать свои сеансы с подчиненными, но новые пользователи не могут войти в систему). Накладные расходы на SQL-запросы при каждом обращении к странице также не оптимальны.
Я хотел бы знать, какие практические решения сейчас используются в продакшене.
В идеале мы ищем:
Общее хранилище сеансов
Пользователи вошли в систему Server A
должен иметь возможность прозрачно переходить на Server B
без повторного входа в систему.
Хорошая избыточность
Потеря одного сервера не должна приводить к потере состояния сеанса.
Низкие накладные расходы
Как минимум «менее интенсивно, чем запрос SQL для каждого попадания страницы».
На данный момент наиболее многообещающим решением, которое мы нашли, является rack-session-mongo
. Это, в сочетании с репликацией MongoDB, должно соответствовать требованиям как к общему хранилищу сеансов, так и к избыточности / аварийному переключению.
Мы начинаем тестирование, чтобы увидеть, соответствует ли он требованию "низких накладных расходов", но он кажется многообещающе и в этом отношении.