系列文章目录
一、基础
二、常规命令
三、工作原理
四、主从切换
五、其他配置
前言
这里内容主要引自官方网站Redis sentinel,便于后期使用时查看。其相关内容主要涉及非核心模块功能。更多的是更全面的学习Sentinel知识。
一、IP地址和DNS名称
旧版本的Sentinel不支持主机名,并且需要在任何地方使用IP地址。从6.2版本开始,Sentinel提供了对主机名的可选支持。
默认情况下此功能处于禁用状态。如果要启用 DNS/主机名支持,请注意:
- Redis 和 Sentinel 节点上的名称解析配置必须可靠,并且能够快速解析地址。地址解析的意外延迟可能会对 Sentinel 产生负面影响。
- 应该在任何地方使用主机名,并避免将主机名和IP地址混合使用。要做到这一点,分别为所有Redis和Sentinel实例使用replica-announce-ip hostname ;sentinel announce-ip hostname
启用全局配置允许 Sentinel 接受主机名:resolve-hostnames
- 作为命令的一部分sentinel monitor
- 作为副本地址,如果复制副本使用replica-announce-ip
Sentinel将接受主机名作为有效输入并解析它们,但在宣布实例、更新配置文件等时仍会引用 IP 地址。
启用全局配置会使 Sentinel 改用主机名。这会影响对客户端的回复、写入配置文件中的值、向副本发出的 REPLICAOF 命令等。比如announce-hostnames
此行为可能与明确需要 IP 地址的所有 Sentinel 客户端不兼容。
当客户端使用TLS连接到实例并且需要名称而不是IP地址来执行证书ASN匹配时,使用主机名可能很有用。
二、副本优先级
Redis 实例具有一个名为replica-priority的配置参数。 此信息由 Redis 副本实例在其 INFO 输出中公开, Sentinel使用它是为了在可以用于故障转移主服务器:
- 如果副本优先级设置为 0,则永远不会将副本提升为主副本。
- 具有较低优先级编号的副本是 Sentinel 的首选。
可以参考前面文章中主从切换选主规则
例如,如果当前数据中心的同一数据中心中有一个副本 S1,以及另一个数据中心的另一个副本S2,可以设置优先级为1的 S10 和优先级为 2 的 S100,因此如果主节点失败,并且S1和S2都可用,S1将是首选。
三、身份认证Auth
1.Redis身份认证
从 Redis 6 开始,用户身份验证和权限通过访问控制列表 (ACL) 进行管理。
为了让哨兵在 Redis 服务器实例时连接到 Redis 服务器实例 配置了 ACL,哨兵配置必须包括 以下指令:
sentinel auth-user <master-name> <username>
sentinel auth-pass <master-name> <password>
用于访问实例的用户名和密码应具有最小控制权限的组的所有 Redis 实例上预置这些凭证。例如:username password
其中凭证之和是访问组实例的用户名和密码。这些凭证应该以最小的控制权限提供给组的所有Redis实例。
127.0.0.1:6379> ACL SETUSER sentinel-user ON >somepassword allchannels +multi +slaveof +ping +exec +subscribe +config|rewrite +role +publish +info +client|setname +client|kill +script|kill
在Redis6之前
sentinel auth-pass <master-name> <password>
2.Sentinel身份认证
Sentinel的身份验证配置应该应用于部署中的每个实例,并且所有实例都应该使用相同的配置。此外,ACL和仅密码身份验证不应该一起使用。
ACL认证
使用ACL保护Sentinel实例的第一步是防止任何未经授权的访问。为此,需要禁用默认的超级用户(或者至少给它设置一个强密码),并创建一个新的超级用户,并允许它访问Pub/Sub频道:
127.0.0.1:5000> ACL SETUSER admin ON >admin-password allchannels +@all
OK
127.0.0.1:5000> ACL SETUSER default off
OK
Sentinel使用默认用户连接到其他实例。可以使用以下配置指令提供另一个超级用户的凭据:
sentinel sentinel-user <username>
sentinel sentinel-pass <password>
要对传入的客户端连接进行身份验证,您可以创建 Sentinel 受限用户配置文件,如下所示:
127.0.0.1:5000> ACL SETUSER sentinel-user ON >user-password -@all +auth +client|getname +client|id +client|setname +command +hello +ping +role +sentinel|get-master-addr-by-name +sentinel|master +sentinel|myid +sentinel|replicas +sentinel|sentinels
仅密码
要使用带有密码认证的Sentinel,将requirepass配置指令添加到所有Sentinel实例中,如下所示:
requirepass "password"
当以这种方式配置时,sentinel将做两件事:
- 客户端需要密码才能向哨兵发送命令。这是显而易见的,因为这是这样的配置指令工作在一般的Redis。
- 此外,该Sentinel实例将使用用于访问本地Sentinel的相同密码,以验证它连接到的所有其他Sentinel实例。
这意味着必须在所有Sentinel实例中配置相同的requirepass密码。这样一来,每个哨兵都可以与其他哨兵交谈,而不需要为每个哨兵配置访问所有其他哨兵的密码。