Как правильно построить отказоустойчивый кластер memcached для хранения сессий PHP?
=====================================================================================

 Есть много статей о том, как хорошо хранить сессии PHP в memcached. Именно к этому мы и идем.  
  

Но я так и не нашел вменяемого ответа на следующий вопрос: **Как правильно организовать инфраструктуру, чтобы она была отказоустойчивой, в случае падения одного из серверов, на котором крутится memcached?**  
  

Очевидно, что мы должны иметь как минимум два memcached сервера. Давайте сразу усложним задачу — мы их настроим 5 штук.  
  

Предположим, что в сессии хранится ID залогиненного клиента. Если сессия умирает/пропадает/стирается — клиент сервером не опознается, т.е. клиент разлогинивается и ему приходится повторно авторизоваться.  
  

Цель (напоминаю, что у нас 5 memcached серверов): в случае выхода из строя до 4-х серверов memcached клиенты не должны испытывать сложностей с авторизацией.  
  

Сейчас я изложу ход моих мыслей, а вы, пожалуйста, меня поправьте и направьте на путь истинный :)  
  
  

Т.к. система должна продолжать функционировать даже когда работает только один (любой из 5-ти) memcached серверов, то это означает, что хранимые в них данные должны быть задублированы.  
  

Вопрос: Как этого добиться?  
  

Покопался с memcached и нашел интересные ключи:  
  

-x <ip\_addr> hostname or IP address of peer repcached  
  

-X <num:num> TCP port number for replication. <listen:connect> (default: 11212)  
  

Таким образом я даже настроил два memcached сервера. -x настроил, чтобы они указывали друг на друга. И действительно — можно записать ключ на один сервер, а получить значение уже с другого. Не тестировал насколько быстро происходит репликация, но она действительно работает.  
  

Таким образом задача для двух серверов решается просто.  
  

А что делать, если серверов больше двух? Строить цепочку? Первый указывает на второй, второй на третий и т.п. Но ведь если второй упадет, то первый о третьем ничего не узнает?  
  
  

Вот в этом месте я и застрял :)  
  
  

Может быть я вообще копаю не в ту сторону?  
  
  

Напомню, что цель следующая: хранить сессии PHP на нескольких memcached серверах, чтобы, даже если остался жив только один из них, ни одна сессия не потерялась. 

 Handlersocket для MySQL [работает быстрее](http://yoshinorimatsunobu.blogspot.ru/2010/10/using-mysql-as-nosql-story-for.html), чем memcache. Используем [Galera Cluster for MySQL](http://codership.com/content/using-galera-cluster) для репликации данных и получаем искомый производительный отказоустойчивый кластер. 

 А почему бы не попробовать Redis? 

 Никак, кроме как дублировать данные на разные серверы на прикладном уровне.  

Либо использовать другой продукт (благо, альтернатив море).  

Почитайте [здесь](https://groups.google.com/forum/#!starred/memcached/Ag95xWpq0ng). 

[www.kutukupret.com/2011/06/14/memcached-replication-on-server-clusters/](http://www.kutukupret.com/2011/06/14/memcached-replication-on-server-clusters/) 

[www.couchbase.com](http://www.couchbase.com) 

 Есть замечательная серия статей по memcached на хабре ([1](http://habrahabr.ru/blogs/webdev/42607/), [2](http://habrahabr.ru/blogs/webdev/42972/), [3](http://habrahabr.ru/blogs/webdev/43282/), [4](http://habrahabr.ru/blogs/webdev/43540/), [5](http://habrahabr.ru/blogs/webdev/43539/), [6](http://habrahabr.ru/post/43735/)), среди них есть и про [построение отказоустойчивого кластера](http://habrahabr.ru/post/42972/).