Я создаю веб-приложение Python / Pylons, которое до сих пор обслуживалось одним сервером, теперь я хочу исследовать, как оно будет масштабироваться между несколькими серверами с каким-то балансировщиком нагрузки впереди.
Основная проблема, конечно, на стороне сервера. Он включает в себя данные сеанса пользователя, данные, загруженные пользователем (изображения и т.п.), и кэш. Я хочу, чтобы серверы приложений разделяли кеш, поэтому одному серверу не нужно выполнять дополнительную работу, если другой уже сделал это. Масштабирование, вероятно, не будет проблемой в ближайшее время, но это кажется большим архитектурным решением, так что лучше вначале сделать его почти правильным.
Для сеансов я мог бы использовать сеансы на основе файлов cookie: http://beaker.groovie.org/sessions.html#cookie-based
Для пользовательских данных и кеша (которые в настоящее время хранятся в локальной файловой системе) мне нужен другой подход, и я не уверен, какой из них лучше всего подойдет. Некоторые из вариантов, которые я рассмотрел:
- Распределенная файловая система
- В частности, Amazon S3, поскольку я нацеливаюсь на Amazon в качестве облачного провайдера. Тем не менее, я бы хотел, чтобы мой код не становился слишком специфичным для поставщика, поэтому позднее возможно изменение поставщика облака.
- [распределенное] хранилище значений ключей, потребовало бы переписать / абстрагировать части моего кода, которые предполагают, что все данные отправляются в файловую систему
- Каким-то образом вообще избегать совместного использования данных, балансировщик нагрузки может быть очень умен, чтобы направлять запросы на узлы, которые имеют необходимые пользовательские данные / кэш локально. Подождите, это называется шардингом, верно?
- Доступная по сети файловая система, в частности NFS: каталог NFS экспортируется на один (возможно выделенный) узел, все остальные монтируют его. Возможные проблемы, о которых я могу думать:
- Пропускная способность хоста NFS может стать узким местом
- Условия гонки, когда несколько клиентов пытаются получить доступ к одним и тем же файлам одновременно
В настоящее время я думаю о переходе на NFS - кажется, это самое простое решение, которое могло бы сработать. Но опять же, может быть, есть еще предостережения, о которых я не знаю, принимая это близорукое решение? Каков ваш опыт, какие формы хранения и обмена данными вы использовали для приложений, размещенных в облаке и которые, как ожидается, будут масштабироваться горизонтально?