redis集群的密码信息存在哪?是如何更新的?关于requirepass和masterauth的问题


问题:redis集群的密码信息存在哪?是如何更新的?
在使用redis集群做测试的时候,因为之前的集群加过密码,后面新加的节点没有加上密码,忘了之后又做了什么操作的,导致密码错误,集群密码一直报错,用不了。

之后经过这种折腾还是不行,只好手动重启各个节点,然后密码就失效了,不用输密码就能正常使用redis集群了。

事后分析应该是因为之前设置redis密码的时候并没有rewrite保存到配置文件中,所以重启之后失效了。

所以借这个机会,百度之后又看了一下源码,稍微深入的看了一下redis集群的密码认证原理。

一、关于requirepass和masterauth的问题

这是重启各个节点,能正常使用集群之后,尝试输入密码报的错误:

10.172.18.26:32495> auth 123456
(error) ERR Client sent AUTH, but no password is set
(1ms)
10.172.18.26:32495> auth
(error) ERR wrong number of arguments for 'auth' command
(1ms)

好像 AUTH 和 password 还不一样?
百度之后发现,requirepass和masterauth是不一样的,requirepass是配置在主节点的,masterauth是配置在从节点的,两边配置要一样从节点才能和主节点连接上进行主从复制。

出现 (error) ERR Client sent AUTH, but no password is set报错是因为客户端想输入密码,但是服务端并不需要密码验证。

参考别人的博客,其归纳如下:

  • 1、是否只设置requirepass就可以?masterauth是否需要同步设置?
    答:redis启用密码认证一定要requirepass和masterauth同时设置。
    如果主节点设置了requirepass登录验证,在主从切换,slave在和master做数据同步的时候首先需要发送一个ping的消息给主节点判断主节点是否存活,再监听主节点的端口是否联通,发送数据同步等都会用到master的登录密码,否则无法登录,log会出现响应的报错。也就是说slave的masterauth和master的requirepass是对应的,所以建议redis启用密码时将各个节点的masterauth和requirepass设置为相同的密码,降低运维成本。当然设置为不同也是可以的,注意slave节点masterauth和master节点requirepass的对应关系就行。
  • 2、requreipass和master的作用?
    masterauth作用:主要是针对master对应的slave节点设置的,在slave节点数据同步的时候用到。
    requirepass作用:对登录权限做限制,redis每个节点的requirepass可以是独立、不同的。

在看了别人的归纳之后,觉得基本已经回答了我的疑问。但是还是想看看源码,从源码方面了解一下这个过程,可能在之后跟人家讨论的时候能更好的沟(zhuang)通(bi)。

二、查看源码

2.1 requirepass的使用

在客户端读入一个完整的命令时要做什么操作?

int processCommand(redisClient *c) {
   
   
    /* The QUIT command is handled separately. Normal command procs will
     * go through checking for replication and QUIT will cause trouble
     * when FORCE_REPLICATION is enabled and would be implemented in
     * a regular command proc. */
    // 特别处理 quit 命令
    if (!strcasecmp(c->argv[0]->ptr,"quit")) {
   
   
        addReply(c,shared.ok);
        c->flags |= REDIS_CLOSE_AFTER_REPLY;
        return REDIS_ERR;
    }

    /* Now lookup the command and check ASAP about trivial error conditions
     * such as wrong arity, bad command name and so forth. */
    // 查找命令,并进行命令合法性检查,以及命令参数个数检查
    c->cmd = c->lastcmd = lookupCommand(c->argv[0]->ptr);
    if (!c->cmd) {
   
   
        // 没找到指定的命令
        flagTransaction(c);
        addReplyErrorFormat(c,"unknown command '%s'",
            (char*)c->argv[0]->ptr);
        return REDIS_OK;
    } else if ((c->cmd->arity > 0 && c->cmd->arity != c->argc) ||
               (c->argc < -c->cmd->arity)) {
   
   
        // 参数个数错误
        flagTransaction(c);
        addReplyErrorFormat(c,"wrong number of arguments for '%s' command",
            c->cmd->name);
        return REDIS_OK;
    }

    /* Check if the user is authenticated */
    // 检查认证信息
    if 
<think>好的,用户想知道如何在Redis哨兵模式集群中设置密码,并确保应用连接时需要密码验证。我需要结合之前提供的引用内容来回答这个问题。 首先,回忆一下引用里的信息。引用[3]提到了在哨兵配置文件中使用`sentinel auth-pass mymaster 123456`,这说明主节点密码的设置方法。同时,引用[2]中有关于Redis节点的配置,比如`protected-mode no`,但可能密码相关的是`requirepass`参数,不过用户的问题里引用中没有直接提到,但根据Redis的知识,主从节点哨兵都需要配置密码。 接下来,用户需要设置密码,应该分几个步骤:首先是Redis主从节点的密码配置,然后是哨兵服务的配置,最后是应用连接时的设置。 在Redis的主从配置中,每个节点的redis.conf文件需要设置`requirepass``masterauth`,这样主节点有密码,从节点也能连接到主节点。同时,哨兵的配置文件需要`sentinel auth-pass`来指定主节点的密码,这样哨兵可以监控有密码保护的主节点。 然后应用连接时,比如在Java的Spring Boot中,配置文件中需要添加密码参数,例如`spring.redis.password=123456`。这样应用在连接Redis集群时就能通过认证。 还需要注意,所有节点的密码必须一致,否则会导致主从同步失败或哨兵无法监控。此外,重启服务以应用配置改,以及测试连接是否成功,这些步骤都是必要的。 可能用户会遗漏某个步骤,比如忘记设置`masterauth`导致从节点无法连接主节点,或者哨兵配置中没有正确添加auth-pass,导致故障转移失败。需要提醒用户检查所有相关配置,并确保一致性。 最后,生成相关问题,帮助用户深入理解,比如如何监控哨兵集群,或者如何处理密码改后的同步问题。</think>### Redis哨兵模式集群密码设置指南 #### 一、Redis节点密码配置 1. **主从节点配置** 在每台Redis服务器的`redis.conf`中增加以下配置: ```bash requirepass 123456 # 设置Redis服务密码 masterauth 123456 # 从节点访问主节点时使用的密码 ``` *示例参考引用[2]中的`protected-mode`配置逻辑,密码需与访问控制配合使用* 2. **验证节点配置** 重启Redis服务后,连接时需使用`-a`参数认证: ```bash redis-cli -h 127.0.0.1 -p 6379 -a 123456 ``` #### 二、哨兵服务密码配置 1. **哨兵配置文件** 在每个哨兵实例的`sentinel.conf`中添加: ```bash sentinel auth-pass mymaster 123456 # 监控的主节点密码[^3] sentinel auth-user mymaster default # Redis 6.0+需指定用户名(如未启用ACL可忽略) ``` 2. **保护哨兵通信** 建议补充配置: ```bash requirepass "哨兵专用密码" # 哨兵进程间通信密码(需所有哨兵一致) ``` #### 三、应用连接配置 1. **连接字符串格式** 根据引用[1]的配置示例扩展: ```properties spring.redis.sentinel.master=mymaster spring.redis.sentinel.nodes=192.168.100.21:26379,192.168.100.22:26379 spring.redis.password=123456 ``` 2. **主流客户端示例** Jedis连接池配置: ```java JedisClientConfiguration config = JedisClientConfiguration.builder() .connectTimeout(Duration.ofSeconds(5)) .password("123456") // 核心认证参数[^1] .build(); ``` #### 四、一致性检查清单 | 组件 | 必须配置项 | 关联影响 | |------------|-----------------------------|--------------------------| | Redis节点 | requirepass/masterauth | 主从复制、数据访问 | | 哨兵 | sentinel auth-pass | 故障转移能力 | | 应用客户端 | password参数 | 业务系统连接可靠性[^1] |
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值