![DigitalOcean 负载均衡器健康检查充斥着我的 CodeIgniter 会话](https://linux22.com/image/726398/DigitalOcean%20%E8%B4%9F%E8%BD%BD%E5%9D%87%E8%A1%A1%E5%99%A8%E5%81%A5%E5%BA%B7%E6%A3%80%E6%9F%A5%E5%85%85%E6%96%A5%E7%9D%80%E6%88%91%E7%9A%84%20CodeIgniter%20%E4%BC%9A%E8%AF%9D.png)
我已经尝试解决这个问题一段时间了,但到目前为止还没有成功。在联系了 DigitalOcean 支持几次之后,我更加迷茫了。
我有以下设置:域指向 DO 负载均衡器,它位于两个应用程序 droplet 前面,托管我在 codeigniter 上构建的应用程序。第三个 droplet 有我的数据库服务器。应用服务器是 PHP7,带有 php+fpm
由于应用程序 droplets 是负载平衡的,因此我可以处理数据库上的会话,从用户的角度来看,这很好用。
LB 健康检查配置为每 10 秒在 HTTP 上运行一次,目标是 codeigniter 生成的页面。
到目前为止的总结:由于健康检查每 10 秒(每分钟 6 次)针对 2 个 droplet,我预计每分钟总共进行 12 次健康检查。鉴于 DO 默默地具有自动故障转移功能,我们可以假设该数字实际上是每分钟 24 次检查(如果他们还从故障转移 LB 发送检查),因此每小时 1440 次。“双重”检查实际上是现实,因为我的会话表有来自私有范围内两个不同且连续的 IP 的相同数量的流量。
问题:实际上,我看到的会话数量恰好是我预期负载均衡器会话数量的 4 倍(不是每小时约 1440 个,而是每小时约 5760 个会话)。DigitalOcean 无法弄清楚。
会话数量并不是一个真正的问题,因为我有一个垃圾收集器(因为没有更好的名字),它每天清除几次空会话以保持表较小,但我对此感到困惑。我知道我可以稍微间隔一下健康检查,或者将检查指向不启动会话处理程序库的 URL,但这两种缓解措施都达不到目的。
有人见过这样的行为吗?有什么想法吗?我已经追踪这个问题大约一个月了。
答案1
如果不详细了解负载均衡器的内部工作原理:
我怀疑 health-cecks 是代表每个入口点、负载均衡器中定义的每个服务执行的。
如果您同时拥有 HTTP 和 HTTPS 入口点,并且都转到同一个后端,那么将导致两次单独的健康检查,从而使您看到的请求数量加倍。