我在 Kubernetes 上运行一些频繁使用的 LAMP 堆栈 Web 应用程序。我努力实现这些应用程序的最高可用性。这就是为什么我为我的 apache 和 php-fpm pod 使用具有多个副本的部署。作为数据库,我们使用 mariadb galeraclusters。
因此这些组件可以随时轻松更新而不会中断服务。滚动更新将始终确保我的应用程序保持响应。即使在硬件节点故障的情况下,它也不会打扰应用程序,因为副本具有节点反亲和性规则,因此它们总是同时被调度到不同的节点上。
但是,我的设置中仍然存在一个单点故障。这就是 php 会话。如何使 php 会话高可用?
现在,我只有一个独立的 redis pod,所有 php-fpm pod 都在其中存储它们的会话。它有一个 pvc 来持久地将会话信息存储到磁盘。但是如果这个 redis pod 需要更新,或者如果我需要更新它的硬件节点,我将不得不将 redis pod 移动到另一个节点,这将花费我大约 45 秒的停机时间,导致烦人的会话丢失和客户在前端注销。
前一段时间,我认为 redis-cluster 可以提供帮助。但我错了,因为 redis-cluster 不是关于高可用性和故障转移,而是更多关于将更大的数据库分解成更小的部分,也就是分片。
然后我想,redis-sentinel 可能是我的选择。但是阅读更多有关该方法的信息,我发现如果没有停机时间,那里的故障转移也将无法工作: https://github.com/bitnami/charts/tree/main/bitnami/redis#master-replicas-with-sentinel 此外,redis-sentinel 没有可用的 php 会话处理程序。它与默认的 redis php 会话处理程序不兼容,因为它需要先询问当前的作者。如果必须将读取发送到与写入不同的服务,我还需要重新设计现有的应用程序。
所以我开始寻找更多的选择,但我似乎迟早会卡在任何技术上。到目前为止我的结果:
所以目前看来,couchbase 似乎是最有前途的做法。以前有人用这种方式处理 php 会话吗?
如果我开始寻找它,我会找到 10 年前及更早的文章,如下所示:https://github.com/daschl/blogposts/blob/master/content/post/How-to-store-PHP- sessions-in-Couchbase.md - 这方面最近没有发展吗?
或者也许有一种完全不同的方法/技术,我在上面的列表中缺少它?您如何处理 Kubernetes 中的 php 会话或通常在多服务器环境中?