Redis Sentinel简介
Redis Sentinel为开源Redis提供主从实例监控、故障告警、自动故障切换等服务,很多使用本地自建Redis数据库并且对可靠性要求较高的业务场景都用到了Sentinel。为了给这类场景中的Redis数据库迁移上云提供方便,阿里云开发了Sentinel兼容模式。开启Sentinel兼容模式后,您可以使用如下的Sentinel相关命令:
命令 | 说明 |
SENTINEL sentinels | 查询master的Sentinel实例列表以及这些Sentinel实例的状态。使用方式: SENTINEL sentinels <任意名称>
|
SENTINEL get-master-addr-by-name | 查询master的IP地址和端口号。使用方式: SENTINEL get-master-addr-by-name <任意名称>
|
关于Sentinel相关命令在各版本中的支持度,请参见Tair命令支持与限制。
前提条件
已将客户端的IP地址(ECS实例的内网IP地址或本地主机的外网IP地址)加入Tair白名单。
操作步骤
访问Tair实例列表,在上方选择地域,然后单击目标实例ID。
在实例信息页的左侧导航栏中,单击参数设置。
根据实例架构,通过修改对应的参数开启Sentinel兼容模式,具体操作请参见设置实例参数。
开启后,您可以连接实例,执行SENTINEL sentinels test
命令进行测试,执行成功表示实例已开启Redis Sentinel兼容模式。Sentinel兼容模式不提供额外的连接地址,您可以直接通过原连接地址(例如r-********.redis.rds.aliyuncs.com:6379
)进行连接。
Sentinel连接示例
开启Sentinel兼容模式后,有两种方式连接Tair实例:若实例开启专有网络免密访问,您可以通过Sentinel模式免密连接Tair实例;若未开启免密访问,您需要在连接时配置验证信息。
Sentinel免密连接
阿里云Tair Sentinel兼容模式连接代码配置示例如下。
Spring Data Redis
本示例的Spring Data Redis版本为2.4.2。
@Bean
public JedisConnectionFactory connectionFactory() {
RedisSentinelConfiguration sentinelConfig = new RedisSentinelConfiguration()
.master("testmaster")
.sentinel("r-bp10noxlhcoim2****.redis.rds.aliyuncs.com", 6379);
JedisPoolConfig poolConfig = new JedisPoolConfig();
...
JedisConnectionFactory connectionFactory = new JedisConnectionFactory(sentinelConfig, poolConfig);
return connectionFactory;
}
参数说明:
master:自定义名称,可保持默认,例如testmaster
。
sentinel:Tair实例的专有网络连接地址与端口号,用英文逗号(,)分隔,例如"r-bp10noxlhcoim2****.redis.rds.aliyuncs.com", 6379
。
redis-py
本示例的Python版本为3.9、redis-py版本为4.3.6。
from redis.sentinel import Sentinel
SENTINEL_HOST = "r-bp10noxlhcoim2****.redis.rds.aliyuncs.com"
SENTINEL_PORT = 6379
SENTINEL_MASTER_NAME = "testmaster"
sentinel = Sentinel([(SENTINEL_HOST, SENTINEL_PORT)])
r = sentinel.master_for(SENTINEL_MASTER_NAME, db=0)
r.set('foo', 'bar')
print(r.get('foo'))
参数说明:
Sentinel密码连接
阿里云Tair Sentinel兼容模式连接代码配置示例如下
Java
本示例以Java客户端的最低版本为例,客户端版本要求如下:
String masterName = "any-name";
Set<String> sentinels = new HashSet<>();
sentinels.add("r-bp10noxlhcoim2****.redis.rds.aliyuncs.com:6379");
GenericObjectPoolConfig poolConfig = new GenericObjectPoolConfig();
String dbPassword = "testaccount:Rp829dlwa";
String sentinelPassword = "testaccount:Rp829dlwa";
JedisSentinelPool jedisSentinelPool =
new JedisSentinelPool(masterName, sentinels, poolConfig,
2000, 2000, dbPassword,
0, null, 2000, 2000,
sentinelPassword, null);
参数说明:
masterName:自定义名称,可保持默认,例如testmaster
。
sentinels.add:设置为Tair实例的专有网络连接地址和端口号,格式为r-bp10noxlhcoim2****.redis.rds.aliyuncs.com:6379
。
dbPassword与sentinelPassword:设置为Tair实例账号的密码。根据选取账号的不同,密码的填写格式有一定区别。如果忘记密码,您可以重置密码。具体操作,请参见修改或重置密码。
redis-py
本示例的Python版本为3.9、redis-py版本为4.3.6。
from redis.sentinel import Sentinel
SENTINEL_HOST = "r-bp10noxlhcoim2****.rds.aliyuncs.com"
SENTINEL_PORT = 6379
SENTINEL_MASTER_NAME = "redis_master" # 注意:此名称不可更改
SENTINEL_REDIS_PWD = "testaccount:Rp829dlwa"
conf = {
'password': SENTINEL_REDIS_PWD,
}
sentinel = Sentinel([(SENTINEL_HOST, SENTINEL_PORT)], sentinel_kwargs=conf)
r = sentinel.master_for(SENTINEL_MASTER_NAME, db=0, **conf)
r.set('foo', 'bar')
print(r.get('foo'))
参数说明:
SENTINEL_HOST与SENTINEL_PORT:Tair实例的专有网络连接地址与端口号。
SENTINEL_MASTER_NAME:SENTINEL名称,此名称不可更改,固定为redis_master
。
SENTINEL_REDIS_PWD:Tair实例账号的密码。
常见问题
Q:原来使用自建Redis Sentinel模式,切换至Tair Sentinel后,遇到NOAUTH Authentication required
错误该怎么处理?
A:您可以启用#no_loose_sentinel-password-free-access参数(设置为yes),即可在不开启VPC免密功能的情况下,在VPC连接地址中实现Sentinel免密连接。
若实例为Redis 6.0以下,请升级您的客户端,并修改部分代码用以添加Sentinel认证密码,再进行重试。更多信息,请参见本文中的Sentinel密码连接。