前置知識:Redis最簡單的基本命令:
1. 系統終端
./redis-server 啟動redis服務
./redis-cli 啟動redis客戶端
./redis-cli shutdown 關閉redis服務
2. 在使用./redis-cli進入redis命令終端之后,
shutdown 關閉redis服務
save 保存存儲至磁盤
set [key] [value] 對鍵[key]賦值[value]
get [key] 獲取鍵[key]對應的值
問題描述:
Redis安裝完成,使用./redis-server啟動之后,運行./redis-cli進入redis終端,對鍵值的操作可正常完成,但shutdown與save會報錯,具體在終端或者日志中體現為:
1. shutdown請求失敗:
1550:M 02 Jan 18:22:48.778 # User requested shutdown...
1550:M 02 Jan 18:22:48.779 * Saving the final RDB snapshot before exiting.
1550:M 02 Jan 18:22:48.781 # Failed opening the RDB file dump.rdb (in server root dir /usr/share/redis/redis-3.2.6/src) for saving: Permission denied
1550:M 02 Jan 18:22:48.782 # Error trying to save the DB, can't exit.
2. save失敗
1550:M 02 Jan 18:42:05.298 # Failed opening the RDB file dump.rdb (in server root dir /usr/share/redis/redis-3.2.6/src) for saving: Permission denied
shutdown和save失敗的原因是一樣的,對rdb文件dump.rdb的操作過程出現問題(雖然日志中顯示permission denied,但不一定為權限問題,可能是目錄或者文件無法生成等多方面)
解決方法:
綜合考慮了以下兩點(非常抱歉,因為兩部分都同時修改后問題解決,所以無法確定是哪一點導致上述問題)
1. 在服務啟動之后,日志信息有如下Warning顯示:
1550:M 02 Jan 18:16:12.147 # WARNING: The TCP backlog setting of 511 cannot be enforced because /proc/sys/net/core/somaxconn is set to the lower value of 128.
1550:M 02 Jan 18:16:12.148 # Server started, Redis version 3.2.6
1550:M 02 Jan 18:16:12.148 # WARNING overcommit_memory is set to 0! Background save may fail under low memory condition. To fix this issue add 'vm.overcommit_memory = 1' to /etc/sysctl.conf and then reboot or run the command 'sysctl vm.overcommit_memory=1' for this to take effect.
1550:M 02 Jan 18:16:12.148 # WARNING you have Transparent Huge Pages (THP) support enabled in your kernel. This will create latency and memory usage issues with Redis. To fix this issue run the command 'echo never > /sys/kernel/mm/transparent_hugepage/enabled' as root, and add it to your /etc/rc.local in order to retain the setting after a reboot. Redis must be restarted after THP is disabled.
據此推測可能由於某些存儲上的上限極低(上述日志貌似默認0了),導致創建文件失敗,這里筆者理解為:沒有創建大小為X的文件的權限導致permission denied
2. 根據報錯日志顯示rdb文件是建立在 /usr/share/redis/redis-3.2.6/src(即redis安裝目錄)下,但實際查看時此目錄並木有rdb文件,即使redis是在系統的root用戶下啟動服務,shutdown和save依舊會出現上述error。所以感覺在這里沒有文件權限的可能性應該不大,不過最后還是修改配置文件更新了rdb文件的默認生成目錄。
操作:
1. 解決Warning
A. 終端root用戶執行:sysctl vm.overcommit_memory=1
B. 終端root用戶執行:echo never > /sys/kernel/mm/transparent_hugepage/enabled
C. 終端root用戶執行:vim /etc/rc.local,在打開文件之后,將echo never > /sys/kernel/mm/transparent_hugepage/enabled加入在語句exit 0之前
2. 更改rdb文件默認路徑
修改conf文件,在這里建議,復制一份新的conf文件,如test.conf,在test.conf進行修改,之后啟動redis時,使用腳本./redis-server test.conf啟動服務。
修改方式:在redis原來的解壓目錄下找到redis.conf文件(也可以在終端用命令locate redis.conf查找其位置),
打開后定位到如下位置:
# 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 ./
將其中的"dir ./"修改為相應的目錄,如"dir /home/distance/redis_dbfiles/"(這里需要注意最后的斜杠不能忘記,如果缺失斜杠可能會解析為文件而非目錄),保存。
上述操作完成之后,可以正常save與shutdown。