根据官方文档翻译版(http://redisdoc.com/topic/cluster-tutorial.html)最小配置启动redis时报错,在源码中找到了错误的代码部分,具体问题及解决部分如下
1.redis目录结构如下,一共6个节点。其中的redis-server.sh脚本是通过GitHub检出的代码进行make的,GitHub地址:https://github.com/antirez/redis,下边有如何编译的过程,比较简单不再赘述
.
└── cluster-test
├── 7000
│ └── redis.conf
├── 7001
│ └── redis.conf
├── 7002
│ └── redis.conf
├── 7003
│ └── redis.conf
├── 7004
│ └── redis.conf
├── 7005
│ └── redis.conf
├── redis-cli
├── redis-server
└── redis-trib.rb
2.redis.conf配置文件内容为官方提供的最小内容,内容如下
port 7000 #端口号每个节点需要调整
cluster-enabled yes
cluster-config-file nodes.conf
cluster-node-timeout 5000
appendonly yes
3.启动是报错,错误内容如下
➜ cluster-test ./redis-server ./7000/redis.conf
10269:C 24 Oct 2018 17:50:04.397 # oO0OoO0OoO0Oo Redis is starting oO0OoO0OoO0Oo
10269:C 24 Oct 2018 17:50:04.398 # Redis version=999.999.999, bits=64, commit=54e8dd11, modified=0, pid=10269, just started
10269:C 24 Oct 2018 17:50:04.398 # Configuration loaded
10269:M 24 Oct 2018 17:50:04.399 * Increased maximum number of open files to 10032 (it was originally set to 7168).
10269:M 24 Oct 2018 17:50:04.400 # Can't open the append-only file: Permission denied
4.分析问题是权限问题,对应的源码代码是server.c中的一部分代码,用来设置AOF文件的代码
/* Open the AOF file if needed. */
if (server.aof_state == AOF_ON) {
server.aof_fd = open(server.aof_filename,
O_WRONLY|O_APPEND|O_CREAT,0644);
if (server.aof_fd == -1) {
serverLog(LL_WARNING, "Can't open the append-only file: %s",
strerror(errno));
exit(1);
}
}
源码中server.aof_filename对应的是server.h头文件中声名的#define CONFIG_DEFAULT_AOF_FILENAME "appendonly.aof",这段代码中open函数的第一个参数为文件名或者文件的绝对路径,这里很显然是一个文件名。open第一个参数为文件名时,默认在当前路径下执行读取/创建文件操作,但是这时发现当前文件读写权限不够造成报错。给第一步中提到的所有目录设置读写权限,问题解决。