作者:北京運維
1. 安裝環境說明
- OS 版本:CentOS 7.5.1804
- Redis 版本:redis-3.2.12
Redis 下載頁面:http://download.redis.io/releases/
Redis 版本號第 2 位,如果是奇數,則為非穩定版本(例如 2.7、2.9、3.1)如果是偶數為穩定版本(例如 2.8、3.0、3.2)
2. 下載安裝 Redis
$ cd /usr/local/
$ wget http://download.redis.io/releases/redis-3.2.12.tar.gz
$ tar xf redis-3.2.12.tar.gz
$ ln -sv redis-3.2.12 redis
$ cd redis
$ make
$ make install
安裝完成后再任意目錄下執行 redis-cli -v 檢查版本:
$ redis-cli -v
redis-cli 3.2.12
Redis 安裝完成后,src 和 /usr/local/bin/ 目錄下多了幾個 redis 開頭的可執行文件:
$ ls /usr/local/bin/redis-*
/usr/local/bin/redis-benchmark /usr/local/bin/redis-check-rdb /usr/local/bin/redis-sentinel
/usr/local/bin/redis-check-aof /usr/local/bin/redis-cli /usr/local/bin/redis-server
2.1 可執行文件說明
可執行文件 | 作用 |
---|---|
redis-server | 啟動 Redis |
redis-cli | Redis 命令行客戶端 |
redis-benchmark | Redis 基准測試工具 |
redis-check-aof | Redis AOF 持久化文件檢測和修復工具 |
redis-check-rdb | Redis RDB 持久化文件檢測和修復工具 |
redis-sentinel | 啟動 Redis Sentinel (哨兵模式) |
2.2 Redis 的基礎配置
Redis 目錄下都會有一個 redis.conf 的配置文件,里面就是 redis 的默認配置,通常我們會在一台服務器上啟動多個 redis 實例,並且集中將配置管理在指定目錄下,而且不是完全手動配置的,而是將 redis.conf 作為模板進行修改。
redis 的基礎配置
配置名 | 配置說明 |
---|---|
port | 端口 |
logfile | 日志文件 |
dir | Redis 工作目錄(存放持久化文件和日志文件) |
daemonize | 是否已守護進程方式啟動 Redis(yes 或 no) |
2.3 啟動 Redis
2.3.1 准備 Redis 配置文件
復制 redis.conf 配置文件到指定目錄,修改默認端口,並且以守護進程方式運行 Redis:
$ mkdir /etc/redis
$ cp redis.conf /etc/redis/redis_6381.conf
$ vim /etc/redis/redis_6381.conf
# 默認端口為 6379
port 6381
# 定義 Redis 日志文件路徑,默認為空
logfile "/data/redis/logs/redis_6381.log"
# 定義 Redis 持久化文件路徑,默認為 `./` 當前目錄
dir /data/redis
# 定義已守護進程方式啟動 Redis,默認為 no
daemonize yes
# 定義 pid 文件,默認為 redis_6379.pid
pidfile /var/run/redis_6381.pid
# 定義 RDB 持久化文件名,默認為 dump.rdb
dbfilename 6381.rdb
# 定義 AFO 持久化文件名,默認為 appendonly.aof
appendfilename "6381.aof"
$ mkdir -pv /data/redis/logs/
2.3.2 啟動 Redis
$ redis-server /etc/redis/redis_6381.conf
驗證 Redis 是否啟動成功:
$ ss -tnlp | grep 6381
3. Redis 單機多實例
Redis 單機多實例部署方法十分簡單,只要復制多個 redis 配置文件即可。需要注意每個實例的端口不能沖突。基於上面的例子,在復制一份 redis 配置文件監聽在 6382 端口。
$ cp redis.conf /etc/redis/redis_6382.conf
$ vim /etc/redis/redis_6382.conf
port 6382
daemonize yes
pidfile /var/run/redis_6382.pid
logfile "/data/redis/logs/redis_6382.log"
dbfilename 6382.rdb
dir /data/redis
appendfilename "6382.aof"
啟動 6382 實例:
$ redis-server /etc/redis/redis_6382.conf
驗證 6382 實例是否啟動:
$ ss -tnlp | grep 6382
4. Redis 自動化創建實例腳本
4.1 腳本實現功能說明
- 運行 init 腳本自動創建 Redis 實例(單實例或多實例);
- 根據模板文件 redis.conf.tpl 生成 Redis 配置文件;
- 軟鏈接 redis_scripts 腳本到 /etc/init.d/目錄下為對應端口實例的啟動腳本;
- 運行 uninit 腳本卸載指定 Redis 實例
注意:該腳本依賴於本文 Redis 安裝方式,其它方式自行修改。
4.2 配置文件模板
redis.conf.tpl 模板文件中 REDISPORT 會在 init 腳本執行時替換為傳入的端口號。
$ vim /usr/local/redis/redis.conf.tpl
daemonize yes
# 定義 PID 文件路徑
pidfile /var/run/redis_REDISPORT.pid
bind 127.0.0.1
protected-mode no
# 定義 Redis 端口
port REDISPORT
tcp-backlog 20000
timeout 30
tcp-keepalive 0
loglevel notice
# 定義日志文件路徑
logfile /data/redis/logs/redis_REDISPORT.log
databases 16
stop-writes-on-bgsave-error yes
rdbcompression yes
rdbchecksum yes
# 定義 RDB 文件
dbfilename REDISPORT.rdb
dir /data/redis/
slave-serve-stale-data yes
slave-read-only yes
repl-timeout 300
repl-disable-tcp-nodelay no
repl-backlog-size 1024mb
repl-backlog-ttl 0
slave-priority 100
maxmemory 20G
maxmemory-policy noeviction
appendonly yes
# 定義 AOF 持久化文件名
appendfilename REDISPORT.aof
appendfsync everysec
no-appendfsync-on-rewrite yes
auto-aof-rewrite-percentage 0
auto-aof-rewrite-min-size 1024mb
lua-time-limit 5000
slowlog-log-slower-than 10000
slowlog-max-len 128
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
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
4.3 Redis 啟動腳本模板
$ vim /usr/local/redis/redis_scripts
#!/bin/sh
##
## redis - this script starts and stops the redis daemin
##
## chkconfig: - 52 15
## description: Simple Redis init.d script conceived to work on Linux systems \
MYNAM=`basename "$0"`
REDISPORT=`echo ${MYNAM} | awk -F'_' '{print $2}'`
if [ -z "${REDISPORT}" ] ; then
REDISPORT=6379
fi
EXEC=/usr/local/bin/redis-server
CLIEXEC=/usr/local/bin/redis-cli
PROG=$(basename $EXEC)
PIDFILE=/var/run/redis_${REDISPORT}.pid
CONF="/etc/redis/redis_${REDISPORT}.conf"
[ -x $EXEC ] || exit 5
[ -f $CONF ] || exit 6
case "$1" in
start)
if [ -f $PIDFILE ]
then
echo "$PIDFILE exists, process is already running or crashed"
else
echo "Starting Redis server..."
$EXEC $CONF
fi
;;
stop)
if [ ! -f $PIDFILE ]
then
echo "$PIDFILE does not exist, process is not running"
else
PID=$(cat $PIDFILE)
echo "Stopping ..."
$CLIEXEC -p $REDISPORT shutdown
while [ -x /proc/${PID} ]
do
echo "Waiting for Redis to shutdown ..."
sleep 1
done
echo "Redis stopped"
fi
;;
*)
echo "Please use start or stop as first argument"
;;
esac
$ chmod +x /usr/local/redis/redis_scripts.sh
4.4 init 腳本
$ vim /usr/local/redis/init.sh
#!/bin/sh
#
# define restricted path
PATH="/bin:/usr/bin:/sbin:/usr/sbin"
# adirname - return absolute dirname of given file
adirname() { odir=`pwd`; cd `dirname $1`; pwd; cd "${odir}"; }
# ---------
# constants
# ---------
MYNAM=`basename "$0"`
MYDIR=`adirname "$0"`
MYTMP="${MYDIR}/../tmp"
MYLCK="${MYTMP}/${MYNAM}.lock"
PORTS=(${1//,/ })
for PORT in ${PORTS[@]}
do
cp redis.conf.tpl /etc/redis/redis_${PORT}.conf
sed -i "s/REDISPORT/${PORT}/g" /etc/redis/redis_${PORT}.conf
# 鏈接啟動腳本對應本次生成實例的端口
ln -s redis_scripts redis_${PORT}
# 鏈接啟動腳本到 /etc/init.d/
ln -s /usr/local/redis/redis_${PORT} /etc/init.d/redis_${PORT}
# 啟動 redis
/etc/init.d/redis_${PORT} start
done
# 記錄上一次創建 Redis 實例的端口號
vi /usr/local/redis/redis_chkmult.cfg
$ chmod +x /usr/local/redis/init.sh
創建 redis_chkmult.cfg 用於記錄上次創建 Redis 實例
$ vim /usr/local/redis/redis_chkmult.cfg
PORTS="6381"
SLAVE_CHK="true"
4.5 uninit 腳本
$ vim /usr/local/redis/uninit.sh
#!/bin/sh
#
# define restricted path
PATH="/bin:/usr/bin:/sbin:/usr/sbin"
# adirname - return absolute dirname of given file
adirname() { odir=`pwd`; cd `dirname $1`; pwd; cd "${odir}"; }
# ---------
# constants
# ---------
MYNAM=`basename "$0"`
MYDIR=`adirname "$0"`
MYTMP="${MYDIR}/../tmp"
MYLCK="${MYTMP}/${MYNAM}.lock"
PORTS=(${1//,/ })
vi /usr/local/redis/redis_chkmult.cfg
for PORT in ${PORTS[@]}
do
/etc/init.d/redis_${PORT} stop
sudo rm -rf /etc/init.d/redis_${PORT}
sudo rm -rf /usr/local/redis/redis_${PORT}
sudo rm -rf /etc/redis/redis_${PORT}.conf
sudo rm -rf /data/redis/logs/redis_${PORT}.*
sudo rm -rf /data/redis/${PORT}.*
done
$ chmod +x /usr/local/redis/uninit.sh
4.5 驗證 init 腳本
創建一個 Redis 實例,端口為 6383
4.6 驗證 uninit 腳本
刪除 6383 實例