还有其他的线索,但我还有一个问题。
我们即将在工作中扩展网站以拥有多台服务器。 我们需要共享服务器之间的会话。
我们一直在研究不同的解决scheme,一个在memcached中 ,另一个在Memcached中用sessionhandler。 这可能会奏效。
这个想法是在每台机器上运行memcached,并让所有的web服务器访问所有其他服务器的memcached服务器,然后我们已经在机器之间共享会话,耶。 (我们没有资源来设置粘滞会话,这是一个稍后的项目,我们需要这个运行,现在我们需要这个运行,而且我们会用一个初始的DNS进行负载平衡)
但是,然后…如果我想要一个服务器,维护,或服务器崩溃,或任何原因。 我不希望用户放松会议,必须从头开始…这就是为什么我们需要某种Memcached不支持的复制。
然后我发现http://repcached.lab.klab.org/ – 它有memcached多主复制,这是伟大的,是我想要的。 但它是否适用于> 2台机器? 说3,5,10? 为了将来扩展。
我也研究过Redis的http://redis.io/ – 这看起来也很棒,但是对于php-session-handler支持来说更加“不稳定”,并且没有多主复制。
问题是我喜欢使用memcached,但是我希望能够在不丢失一半会话的情况下closures两个盒子中的一个。 有什么build议么?
您可能需要查看一下使用memcache API实现复制密钥存储的couchdb。 它也比大多数的memcache实现更有效地处理内存存储的溢出(在故障转移期间可能的结果)。 我必须承认,我不熟悉它如何实现复制的细节。
我所见过的“粘性”会话的所有实现都将请求绑定到一个显式设备上 – 这并不能实现良好的故障转移 – 而对于PHP,会话亲和性只与存储底层相关(与Java通常需要的在逻辑层)。 所以在HTTP层使用粘性会话是无关紧要的。
由于复制延迟和单线程写入操作,在基板中使用asynchronousMySQL复制当然不是微不足道的 – 我使用PHP中的连接代理(实现故障转移期间的首选项和块)来解决此问题。 虽然MySQL并不是最有效的会话处理解决scheme,但是如果您的应用程序已经依赖高可用性关系数据库,那么将其用于会话存储就非常有意义。 有MySQL的多主复制实现 – 例如Percona。
MongoDB也使用asynchronous复制,但没有MySQL的单线程依赖。
你将不得不花一些时间思考你如何围绕节点。 虚拟地址接pipe(如果正确实施)应该使操作透明,但是IME可能会很棘手,需要接pipeARP地址以及IP地址,以避免在故障转移期间出现大的停顿。
说3,5,10? 为了将来扩展
如果你打算扩大到这个范围,那么你应该考虑多个数据中心 – 这意味着一个同步方法,可以应付低带宽/更高的延迟,即不是共享文件系统。
我build议数据库会话处理程序而不是memcached。 无论如何,您可能会使用数据库,如果您的数据库closures了,那么您的站点也会closures,因此您不会添加新的失败模式。
Memcached不处理故障转移。 在任何系统的这种多主环境中caching失效要么是缓慢且复杂的(同步的),要么是不可靠的(asynchronous的)。 所以你会遇到在一台服务器上设置了一些会话variables的情况,并且下一个请求会转到另一个服务器,这个服务器具有这个variables的旧值。