Redis:在最终目标上移动临时数据库文件时出错:操作不允许

Redis:在最终目标上移动临时数据库文件时出错:操作不允许

我安装了一个 nodeBB,它依赖 Redis 作为数据存储。目前这只是一个测试安装,我正在解决所有问题。Redis 实例运行了几天,但后来崩溃了,日志中出现了以下错误:

3693:C 01 Dec 03:34:22.056 # Error moving temp DB file on the final destination: Operation not permitted
7089:M 01 Dec 03:34:22.155 # Background saving error
7089:M 01 Dec 03:34:28.067 * 1 changes in 900 seconds. Saving...
7089:M 01 Dec 03:34:28.068 * Background saving started by pid 3699
3699:C 01 Dec 03:34:28.069 # Error moving temp DB file on the final destination: Operation not permitted
7089:M 01 Dec 03:34:28.168 # Background saving error
7089:M 01 Dec 03:34:34.080 * 1 changes in 900 seconds. Saving...
7089:M 01 Dec 03:34:34.081 * Background saving started by pid 3700
3700:C 01 Dec 03:34:34.083 # Error moving temp DB file on the final destination: Operation not permitted
7089:M 01 Dec 03:34:34.181 # Background saving error

使用以下命令在 Centos 6.7 上以 root 身份安装 Redis(默认 yum 包太旧了)跟随方法

tar xzf redis-3.0.x.tar.gz
cd redis-3.0.1
make
make test
make install
cd utils
chmod +x install_server.sh
./install_server.sh

工作目录设置为/etc/redis/6379.conf

# The filename where to dump the DB
dbfilename dump.rdb

# The working directory.
#
# The DB will be written inside this directory, with the filename specified
# above using the 'dbfilename' configuration directive.
#
# The Append Only File will also be created inside this directory.
#
# Note that you must specify a directory here, not a file name.
dir /var/lib/redis/6379

有人能建议是什么原因造成的,以及如何最好地解决这个问题吗?Redis 将尝试在哪里保存临时文件,它将使用哪个用户,哪些权限可以安全地解决此问题?

同样令人感兴趣的是监控 Redis 实例的免费方法,这样我就能知道它是否/何时崩溃。

6359.conf:

daemonize yes

pidfile /var/run/redis_6379.pid

port 6379

tcp-backlog 511

timeout 0

tcp-keepalive 0

loglevel notice

logfile /var/log/redis_6379.log


databases 16

save 900 1
save 300 10
save 60 10000

stop-writes-on-bgsave-error yes

rdbcompression yes

rdbchecksum yes

dbfilename dump.rdb

dir /var/lib/redis/6379


slave-serve-stale-data yes

slave-read-only yes

repl-diskless-sync no

repl-diskless-sync-delay 5

repl-disable-tcp-nodelay no

slave-priority 100


appendonly no


appendfilename "appendonly.aof"


appendfsync everysec


no-appendfsync-on-rewrite no


auto-aof-rewrite-percentage 100
auto-aof-rewrite-min-size 64mb

aof-load-truncated yes


lua-time-limit 5000


slowlog-log-slower-than 10000

slowlog-max-len 128

latency-monitor-threshold 0

notify-keyspace-events ""

hash-max-ziplist-entries 512
hash-max-ziplist-value 64

list-max-ziplist-entries 512
list-max-ziplist-value 64

set-max-intset-entries 512

zset-max-ziplist-entries 128
zset-max-ziplist-value 64

hll-sparse-max-bytes 3000

activerehashing yes

client-output-buffer-limit normal 0 0 0
client-output-buffer-limit slave 256mb 64mb 60
client-output-buffer-limit pubsub 32mb 8mb 60

hz 10

答案1

检查您是否已启用 SELinux sestatus。如果已启用(建议启用),请通过 将其置于宽容模式setenforce 0

之后再次检查您的系统,我猜错误会消失,检查安全日志以查看 SELinux 阻止了什么,在您的策略中启用它并将 SELinux 重新置于强制模式(当然,如果您想让您的服务器受到 SELinux 的保护)

答案2

OP 不清楚在错误出现之前后台保存是否成功,但我发现这个错误与磁盘空间问题有关——为了说明显而易见的问题,请检查df是否空间不足。

重要的- 您附加的配置表明您的服务器未使用密码验证(指令requirepass),未重命名管理命令,并且未绑定到特定接口(bind指令)。这是一个潜在的安全风险 - 更多信息请访问http://antirez.com/news/96

答案3

Redis 非常适合数据备份,因为您可以在数据库运行时复制 RDB 文件:RDB 一旦生成就永远不会被修改,并且在生成时会使用临时名称,并且仅在新快照完成时使用 rename(2) 以原子方式重命名为最终目标。我认为 redis 或系统不健康,上述过程不需要任何额外权限,除非 redis 配置不正确或出现系统问题。

相关内容