使用 Sentinel Discovery 服务的最佳实践

上次更新时间:2024 年 4 月 18 日

问题

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

回答

Redis Enterprise 提供了一个与 Redis Sentinel API 兼容的发现服务。 使用此 API 可以**仅使用数据库名称**连接到所需的数据库,而无需端口。 Sentinel 发现服务是应用程序**不依赖 DNS** 解析服务的替代方案,它是一种基于 IP 地址的连接方法。 从文档中了解有关发现服务的更多信息。 以下是获取数据库连接的示例。 与发现服务的连接必须针对端口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 对象文档,以了解有关 API 的更多信息。

数据库端点

Sentinel(按设计)只返回一个 master 端点,而不管代理策略如何;因此,即使代理策略是 all-master-shardsall-nodes,所有客户端也会倾向于连接到同一个节点。 这是因为 SENTINEL MASTERS 始终为给定的数据库名称返回一个 IP。

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

安全注意事项

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

参考资料

了解有关 Sentinel Discovery Service 的信息。