使用 Sentinel 发现服务的最佳实践

最后更新于 2024 年 4 月 18 日

问题

采用 Redis Enterprise Sentinel 发现服务的最佳实践是什么?

答案

Redis Enterprise 提供了一个与 Redis Sentinel API 兼容的发现服务。使用此 API,可以**仅使用数据库名称**连接到所需的数据库,而无需端口。Sentinel 发现服务是应用程序**不依赖于 DNS**解析服务的替代方案,它是一种基于 IP 地址的连接方法。从[文档](https://redis.ac.cn/docs/latest/operate/rs/databases/durability-ha/discovery-service/)了解有关发现服务的更多信息。以下是如何获取到数据库连接的示例。必须对端口`8001`上的发现服务进行连接。

高可用性

发现服务可在集群的每个节点上进行查询,侦听端口 8001,因此可以提供**更多 IP 地址**以确保发现服务的可用性(尤其是在没有 DNS 解析可用的情况下)。

from redis.sentinel import Sentinel

sentinel_list = [
('10.10.1.15', 8001),
('10.10.1.16', 8001),
('10.10.1.17', 8001)
]

# change this to the db name you want to connect
db_name = 'primarydb'

sentinel = Sentinel(sentinel_list, socket_timeout=0.1)
r = sentinel.master_for(db_name, socket_timeout=0.1, password='')
r.set('foo', 'bar')
print(r.get('foo'))

也可以检索连接到的 IP 地址和端口

print(sentinel.discover_master(db_name))

请参考[Sentinel](https://redis-py.pythonlang.cn/en/stable/connections.html#redis.sentinel.Sentinel) 对象文档以了解更多有关 API 的信息。

数据库端点

Sentinel(按设计)返回正好一个主端点,无论代理策略如何;因此,所有客户端都倾向于连接到同一节点,即使代理策略是`all-master-shards`或`all-nodes`也是如此。这是因为 SENTINEL MASTERS 将始终为给定的数据库名称返回一个 IP。

对于可能适合单个集群节点的小型数据库,基于 Sentinel 的发现不会因单个节点和代理的使用而导致不平衡。当 DNS 方法不可用时,无论是由于公共 IP 要求还是禁止运行内部 DNS 服务,Sentinel 发现服务可能比更常见但更昂贵的负载均衡器方法更具优势。

安全注意事项

Sentinel 端点是未经身份验证的,它将列出所有数据库和相应的 IP 地址。它没有 TLS,如果在框架客户端库级别(例如 Spring Data)为数据库启用了 TLS,这将进一步增加复杂性。

参考资料

了解 Sentinel 发现服务