做者:北京运维node
Redis 下载页面:http://download.redis.io/releases/redis
Redis 版本号第 2 位,若是是奇数,则为非稳定版本(例如 2.七、2.九、3.1)若是是偶数为稳定版本(例如 2.八、3.0、3.2)vim
$ 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 检查版本:bash
$ 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
可执行文件 | 做用 |
---|---|
redis-server | 启动 Redis |
redis-cli | Redis 命令行客户端 |
redis-benchmark | Redis 基准测试工具 |
redis-check-aof | Redis AOF 持久化文件检测和修复工具 |
redis-check-rdb | Redis RDB 持久化文件检测和修复工具 |
redis-sentinel | 启动 Redis Sentinel (哨兵模式) |
Redis 目录下都会有一个 redis.conf 的配置文件,里面就是 redis 的默认配置,一般咱们会在一台服务器上启动多个 redis 实例,而且集中将配置管理在指定目录下,并且不是彻底手动配置的,而是将 redis.conf 做为模板进行修改。app
redis 的基础配置运维
配置名 | 配置说明 |
---|---|
port | 端口 |
logfile | 日志文件 |
dir | Redis 工做目录(存放持久化文件和日志文件) |
daemonize | 是否已守护进程方式启动 Redis(yes 或 no) |
复制 redis.conf 配置文件到指定目录,修改默认端口,而且以守护进程方式运行 Redis:tcp
$ 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/
$ redis-server /etc/redis/redis_6381.conf
验证 Redis 是否启动成功:工具
$ ss -tnlp | grep 6381
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
注意:该脚本依赖于本文 Redis 安装方式,其它方式自行修改。
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
$ 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
$ 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"
$ 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
建立一个 Redis 实例,端口为 6383
删除 6383 实例