使用 K8S 实现高可用的有状态会话

Highly available stateful session implementation with K8S

如何用K8S实现内存state/session复制?例如,网络购物车系统通过网络在集群节点之间复制用户 HTTP 会话,这样如果一个节点出现故障,另一个节点中的进程可以接管用户会话。

我认为K8S有StatefulSet,它使用磁盘存储来保证状态的持久性。如果 pod 关闭,重新启动的 pod 会接管磁盘的状态。但是,将内存中的用户会话持久保存到磁盘的开销很高,而且速度可能不够快。

我想解决方案可能是使用内存缓存服务器或类似 etcd 的系统。这是惯例吗?我的理解是,K8S适合大规模无状态处理,引入StatefulSet是为了解决有状态的情况,但不确定是否适合需要快速状态切换的情况。

请指教

How to implement memory state/session replications with K8S? For instance, a web shopping cart system replicates the user HTTP sessions among cluster nodes over the network so that if a node is down, a process in another node can take over the user sessions.

要存储状态,最好使用 Redis 或内存数据库。

K8S has StatefulSet which uses the disk storages to assure the state persistency, I think. If a pod is down, the restarted pod takes over the state form the disk. However, the overhead of persisting in-memory user sessions to disk is high and may not be fast enough.

你是对的,但也许你以前没有尝试过,我一直在 K8s 中使用 Redis 进行生产,有数百万用户,但从未遇到过问题。如果部署在 K8s 上,Redis 有两个备份密钥的选项。

RDB and Append only-AOF,到现在都没遇到过Redis crashed 左右,但只会因 Out of Memory 而崩溃,因此请确保您的 Key policy 设置正确,例如 LRU[=40] =]左右。

In my understanding, K8S is good for stateless processing in scale

你是对的,但人们一直在使用 Deployment 和 Statefulsets for 运行 Redis 集群和 K8s 中的 Elasticsearch 集群,还具有所有备份和扩展选项。

使用 K8s 配置和管理 DB 很容易,而使用 VM 可扩展性不高。

我们已经 运行 有状态集 RedisElasticsearchRabbitMQ 长期以来在 Prod 中并没有看到很多问题。确保将 SSD 高 IOPS 磁盘连接到 POD,一切顺利。

很好的例子:https://github.com/loopbackio/loopback4-example-shopping/blob/master/kubernetes/README.md