使用Sentinel兼容模式连接实例

云数据库 Tair(兼容 Redis)采用自研的高可用服务HA组件,无需依赖Sentinel(哨兵)。但为了提高实例的兼容性,减少用户的代码改动,云数据库 Tair(兼容 Redis)提供Sentinel兼容模式。开启该功能后,您可以像连接开源Redis Sentinel一样连接Tair(以及Redis开源版实例。

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相关命令在各版本中的支持度,请参见Redis开源版命令支持

前提条件

  • 实例的版本为兼容Redis 4.0及以上。

  • 实例的网络类型为专有网络。

    说明

    如果实例为经典网络,切换方法请参见切换为专有网络VPC

  • 已将客户端的IP地址(ECS实例的内网IP地址或本地主机的外网IP地址)加入实例白名单

操作步骤

  1. 访问实例列表,在上方选择地域,然后单击目标实例ID。

  2. 实例信息页的左侧导航栏中,单击参数设置

  3. 根据实例架构,通过修改对应的参数开启Sentinel兼容模式,具体操作请参见设置参数

    • 若实例为集群架构代理模式或读写分离架构:将sentinel_compat_enable参数的值修改为1

    • 若实例为标准架构:将#no_loose_sentinel-enabled参数的值修改为yes

    说明
    • 您可以在实例详情页确认实例的架构信息。

    • 集群架构直连模式使用开源Redis Cluster进行负载均衡,无需Sentinel组件,也不支持设置Sentinel参数。

  4. (可选)开启后,您可以连接实例,执行SENTINEL sentinels test命令进行测试,执行成功表示实例已开启Redis Sentinel兼容模式。

    Sentinel兼容模式不提供额外的连接地址,您可以直接通过原连接地址(例如r-********.redis.rds.aliyuncs.com:6379)进行连接。

    说明
    • 如需设置SENTINEL命令免密,您可以将#no_loose_sentinel-password-free-access参数设置为yes,使用SUBSCRIBESENTINEL命令订阅、监听+switch-master通道免密

    • 如需更多免密命令,您可以在开启上述免密参数后,通过#no_loose_sentinel-password-free-commands参数额外添加免密的命令列表。

Sentinel连接示例

开启Sentinel兼容模式后,有两种方式连接实例:若实例开启专有网络免密访问,您可以通过Sentinel模式免密连接实例;若未开启免密访问,您需要在连接时配置验证信息。

Sentinel免密连接

说明

开启专有网络免密访问的具体操作,请参见开启专有网络免密访问

阿里云Redis 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:实例的专有网络连接地址与端口号,用英文逗号(,)分隔,例如"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_HOSTSENTINEL_PORT:实例的专有网络连接地址与端口号。

  • SENTINEL_MASTER_NAME:自定义名称,可保持默认,例如testmaster

Sentinel密码连接

阿里云Redis Sentinel兼容模式连接代码配置示例如下

Java

本示例以Java客户端的最低版本为例,客户端版本要求如下:

  • Jedis为3.6.0版本及以上。

  • Lettuce为5.3.0.RELEASE版本及以上。

  • Spring Data Redis为2.5.1版本及以上,同时需要配置spring.redis.sentinel.password参数。

说明

强烈建议您升级最新稳定版本客户端,最新版本请搜索MVN Repository

        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:设置为实例的专有网络连接地址和端口号,格式为r-bp10noxlhcoim2****.redis.rds.aliyuncs.com:6379

  • dbPasswordsentinelPassword:设置为实例账号的密码。根据选取账号的不同,密码的填写格式有一定区别。如果忘记密码,您可以重置密码。具体操作,请参见修改或重置密码

    说明
    • 默认账号(即以实例ID命名的账号):直接填写密码即可。

    • 新创建的账号:密码格式为<user>:<password>,默认账号也支持此认证方式。例如自定义账号为testaccount,密码为Rp829dlwa,密码需填写为testaccount:Rp829dlwa

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_HOSTSENTINEL_PORT:实例的专有网络连接地址与端口号。

  • SENTINEL_MASTER_NAME:SENTINEL名称,此名称不可更改,固定为redis_master

  • SENTINEL_REDIS_PWD:实例账号的密码。

常见问题

  • Q:原来使用自建Redis Sentinel模式,切换至Redis Sentinel兼容模式后,遇到NOAUTH Authentication required错误该怎么处理?

    A:您可以启用#no_loose_sentinel-password-free-access参数(设置为yes),即可在不开启VPC免密功能的情况下,在VPC连接地址中实现Sentinel免密连接。

    若实例为Redis 6.0以下,请升级您的客户端,并修改部分代码用以添加Sentinel认证密码,再进行重试。更多信息,请参见本文中的Sentinel密码连接

  • Q:Redis倚天版实例支持Sentinel兼容模式吗?

    A:支持。