使用 [email protected] 运行多个 redis 实例

使用 [email protected] 运行多个 redis 实例

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 不会将相同插槽的主服务器和从服务器放在同一个节点上(违背目的)。
  • 如何确保 PIDfile 可访问(默认情况下会出现访问被拒绝消息,因为用户 redis 无权访问目录中的 pidfile,例如redis-2)。

现在的进展

我复制cp /etc/redis/redis-server.conf /etc/redis/redis-server-2.confchown 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,998 毫秒时间内不会出现任何消​​息,之后 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

答案1

450 秒的延迟是由于 systemd 在错误的目录中查找 pid 文件导致的。

当由于权限错误而无法访问文件时,Redis 的错误消息质量很差。它没有明确说明尝试写入/读取的位置。它似乎还会忽略某些配置并使用自己的 CWD 进行操作,这意味着为了运行,Redis 需要对此目录具有读/写访问权限。

这导致了这个问题:[email protected]脚本现在是错误的,它使用不存在的 systemd 默认工作目录。要解决此问题,请在标题下添加以下行[service]

WorkingDirectory=/var/lib/redis

最后,您需要明确说明 redis-2 应该在哪里寻找它的内容:

除了和pidfile参数之外logfiledbfilenamecluster-config-file也需要更改,因为它们被第一个 Redis 进程锁定,如果无法访问它们,则会产生类似的错误消息。的正确配置redis-2.conf是:

port 6380 
pidfile /var/run/redis-2/redis-server.pid 
logfile /var/log/redis/redis-server-2.log 
dbfilename dump-2.rdb
cluster-config-file nodes-6380.conf

相关内容