在 memcache 数组上分配 php-session 负载

在 memcache 数组上分配 php-session 负载

直到最近,我们的设置由 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

相关内容