redis集群的密码信息存在哪?是如何更新的?
问题: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

最低0.47元/天 解锁文章
5694





