GCP MemoryStore 上的 Redis 主/从
Posted
技术标签:
【中文标题】GCP MemoryStore 上的 Redis 主/从【英文标题】:Redis master/slave on GCP MemoryStore 【发布时间】:2022-01-12 08:19:47 【问题描述】:在我们当前的架构中,我们使用 MemoryStore 中的 Redis,作为一个简单的快速缓存和发布-订阅系统。
对于我们的一项服务,我们需要为复制服务提供一个非常快速的本地缓存。该服务将托管在 GKE(Google Kubernetes Engine)上。我们的想法是每个节点都有一个 Redis 从属节点,这将是我们服务的任何 pod 的端点。
是否可以将我们的 MemoryStore Redis 用作该系统的主控?如果是,是否有相应的文档或示例?或者我们应该在我们的 K8S 集群上有一个主 Redis 实例?
【问题讨论】:
【参考方案1】:不确定您是否可以使用 MemoryStore。据我所知,它的托管服务不提供这样的功能。
一般来说,我看到和使用的是 Redis HA Kubernetes Deployment 和 Sentinel。
掌舵:https://docs.bitnami.com/tutorials/deploy-redis-sentinel-production-cluster/
什么是哨兵?
将其视为管理 Master 和 Slave 连接的 sidecar 代理。如果您向它发送请求,它将返回主 IP 和从 IP。
默认情况下,Redis 的 helm 会部署带有 2 个从 POD 的 Master POD 和作为 sidecar 的 sentinel。
当你说,
The idea would be to have a Redis slave per node which would be the endpoint of any pod of our services.
注意在每个节点上部署 Redis 从站可能很容易配置,但是将 POD 直接连接到同一 节点 上的那个 从站会很奇怪,因为所有流量都使用 Kubernets 服务。
是的,您可以在每个节点上保留从站,但不确定您的服务将如何连接到那些 从站?
您的应用程序将与 Single Kubernetes 服务 通信,该服务将返回 Current 的 IP Masters 和 Slave 根据哨兵文件。
哨兵文档:https://redis.io/topics/sentinel
额外说明(集群与哨兵):
Redis 集群是分布式选项,而哨兵有利于 HA 和复制,因为新的 Master 将始终准备好处理。
这是 Python 中的一个应用示例:
from redis import Sentinel
sentinel = Sentinel([('<**Single K8s service Name**>', 26379)], socket_timeout=0.1)
sentinel.discover_master('mymaster')
('127.0.0.1', 6379)
sentinel.discover_slaves('mymaster')
[('127.0.0.1', 6380)]
参考:https://github.com/redis/redis-py#sentinel-support
【讨论】:
感谢您的明确答复。但是,您确定不能强制与同一节点上的从站通信吗?我会说可以为从站使用 NodePort 类型? 为了使用 NodePort,您将沿端口使用 Node IP 对吗?或带有节点端口的服务名称? 我认为最好的解决方案是第一个:在每个节点上部署一个 pod(我知道这是可能的,例如 Datadog 为它的代理做的),然后暴露一个端口并与之交谈通过节点 DNS 名称和端口。我错了吗? 是的,如果一切正常,你可以试试复制备份和所有。以上是关于GCP MemoryStore 上的 Redis 主/从的主要内容,如果未能解决你的问题,请参考以下文章
为啥 GCP“Memorystore for Redis”不允许添加公共 IP 的选项?