直到最近,我们的设置由 4 个 Web 服务器共享会话到运行 memcache 的单个服务器组成。我们的服务器托管在 Amazon 云上,连续两天在高峰负载时崩溃。问题是 memcache 服务崩溃了(我们网站的负载一直在稳步增加)。
因此,我们采取了以下措施:
1)增加了2台用于存储会话的服务器
2)在所有 Web 服务器上的 php ini 文件中设置以下变量
session.save_handler = memcache
session.save_path = tcp://ip1.port, tcp://ip2.port, tcp://ip3:port
memcache.hash_strategy = consistent
memcache.allow_failover = 1
现在一切运行正常。为了确保可用性,我们尝试通过随机关闭我们的一个会话服务器进行测试,网站仍在运行(一些用户被注销,目前从业务角度来看这是可以接受的)。
但有一个主要问题。我期望 memcache 服务器上的负载大致均匀分布。但事实并非如此!
如果我查看 CloudWatch 中的“最大网络输出(字节)”,则可以看到负载大致为 10:5:1。换句话说,就网络输入和输出带宽而言,第一台服务器的负载是第三台服务器的 10 倍。而第二台服务器的负载是第三台服务器的 5 倍。
有任何想法吗?
答案1
更改 memcache IP 的参数顺序session.save_path
可能会改变 memcache 服务器上的会话分配率。例如,在第一个 Web 服务器上:
session.save_path = tcp://ip1.port, tcp://ip2.port, tcp://ip3:port
在第二个 Web 服务器上:
session.save_path = tcp://ip2.port, tcp://ip3.port, tcp://ip1:port
在第三个 Web 服务器上:
session.save_path = tcp://ip3.port, tcp://ip1.port, tcp://ip2:port
在第 4 个 Web 服务器上:
session.save_path = tcp://ip1.port, tcp://ip3.port, tcp://ip2:port