如何在 Kubernetes 环境中使 php 会话高可用

问题描述 投票:0回答:0

我在 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 会话处理程序不兼容,因为它需要先询问当前的作者。如果必须将读取发送到与写入不同的服务,我还需要重新设计现有的应用程序。

所以我开始寻找更多的选择,但我似乎迟早会卡在任何技术上。到目前为止我的结果:

  • files:如果你有多个 php-fpm pod(不,我不想使用像 NFS 或 cephfs 这样的共享文件系统)
  • mysql:如果您有高流量和许多会话,并且速度很重要,则不是一个选择
  • redis-standalone:我目前的解决方案,但不适合作为高可用性解决方案
  • redis-cluster:不适合,因为不是高可用性解决方案
  • redis-sentinel:没有用于 php 的本机会话处理程序、应用程序返工、故障转移显然不是没有停机时间
  • memcache:不适合,因为缺少会话锁,这可能会在多个调用可能同时发生的场景中弄乱会话数据(例如 AJAX 请求)
  • memcached:会话锁定有效,但没有选项可以同时将数据写入多个 memcached-servers,或同步 memcached 实例
  • hazelcast:没有实现会话锁定
  • membase / couchbase:从我目前阅读的内容来看,这可能是一种方法。最初有一些 memcache 兼容性,但现在似乎已被弃用。 memcached 兼容性将使集成到 php 变得容易,因为可以使用现有的 php 会话处理程序。

所以目前看来,couchbase 似乎是最有前途的做法。以前有人用这种方式处理 php 会话吗?

如果我开始寻找它,我会找到 10 年前及更早的文章,如下所示:https://github.com/daschl/blogposts/blob/master/content/post/How-to-store-PHP- sessions-in-Couchbase.md - 这方面最近没有发展吗?

或者也许有一种完全不同的方法/技术,我在上面的列表中缺少它?您如何处理 Kubernetes 中的 php 会话或通常在多服务器环境中?

php session redis couchbase redis-cluster
© www.soinside.com 2019 - 2024. All rights reserved.