一个 redis-cluster 至少包含 6 个 redis 实例。故障转移群集的合理最小大小是 3 个节点。因此,我想在同一个节点上运行 2 个 redis 实例(但从不在同一个节点上运行两次相同的 redis 数据桶)作为一个最小的工作示例。我在使用标准配置工具在 ubuntu 下进行此设置时遇到了一些麻烦。
我的 redis 设置还涉及/需要一些redis-sentinel
我认为也需要更改配置的东西。主要问题是:一个哨兵就足够了,还是我们需要两个redis-sentinels,两个redis-servers?(/lib/systemd/system/redis-sentinel@
似乎存在)。
开箱即用,ubuntu 提供了一个特殊的/lib/systemd/system/redis-server@
systemd 单元脚本,可以支持这些额外的服务器。我需要做什么才能拥有:
systemctl start redis-server@2
启动我的第二台服务器?
特别是:
- 我已将端口 6380 添加到配置文件中,作为第二台服务器侦听的端口。
- 如何克隆、编辑、指向配置文件以及哪些配置文件需要克隆。
- 如何配置哨兵。
- 如何保证redis不会把同一个slot的master和slave放在同一个节点上(达不到目的)。
- 如何确保 PIDfile 可访问(默认情况下,由于不允许用户 redis 访问 pidfile 等目录中的 pidfile,因此存在拒绝访问消息
redis-2
)。
现在的进展
我复制了cp /etc/redis/redis-server.conf /etc/redis/redis-server-2.conf
和chown redis.redis /etc/redis/redis-server-2.conf
,然后编辑了
port = 6380
pidfile /var/run/redis-2/redis-server.pid
logfile /var/log/redis/redis-server-2.log
到目前为止,第二台服务器仅在 450 秒后超时(有没有办法缩短这段时间?测试/弄清楚这一点需要很长时间......)在所述日志文件中找到相当不透明的消息/var/log/redis/redis-server-2.log
:
oO0OoO0OoO0Oo Redis is starting oO0OoO0OoO0Oo
Redis version=5.0.7, bits=64, commit=00000000, modified=0, pid=671078, just started
Configuration loaded
systemd supervision requested, but NOTIFY_SOCKET not found
Can't open nodes-6380.conf in order to acquire a lock: Read-only file system
前几条消息是即时的,而最后一条消息是在消息的其余部分之后不久打印的。它通常需要大约 2 毫秒才能弹出。之后,在分配给启动的剩余 89,998ms 时间内没有出现任何消息,之后 systemd 停止程序(可能是强制)并重试 4 次。(这就是每次尝试 450 秒的来源)。
这不可能Read-only file system
是真正的问题。nodes-6379.conf
服务可以轻松访问,该服务redis-server
启动时没有问题。
我尝试过的相关内容
一个可能有趣的观察是是否redis-server@2
会在主redis-server
节点停止时启动。这没有效果。无论前者是启动还是停止,redis-server@2
总是会以同样的速度失败并显示同样的神秘错误消息。
手动启动第二台服务器时,使用/usr/bin/redis-server /etc/redis/redis-2.conf
它运行的命令,甚至接受集群连接,因此似乎可以工作。问题似乎出在 systemd 上。
进一步看,通过将ExecStart
参数更改为
ExecStart=strace -f -o /var/log/redis/strace.out /usr/bin/redis-server /etc/redis/redis-%i.conf
并运行
touch /var/log/redis/strace.out
chown redis.adm /var/log/redis/strace.out
现在有该过程的 strace 输出。它产生了一个孩子,这个特定的行出错了:
811493 openat(AT_FDCWD, "nodes-6380.conf", O_WRONLY|O_CREAT, 0644) = -1 EACCES (Permission denied)
让我相信 systemd 在单元文件中使用了一个奇怪的 CWD 路径/lib/systemd/system/redis-server@
。openat
对于默认服务和手动启动,相同的调用成功。