作者:北京运维
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 实例