• Redis 单机和多实例部署


    作者:北京运维

    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 脚本实现功能说明

    1. 运行 init 脚本自动创建 Redis 实例(单实例或多实例);
    2. 根据模板文件 redis.conf.tpl 生成 Redis 配置文件;
    3. 软链接 redis_scripts 脚本到 /etc/init.d/目录下为对应端口实例的启动脚本;
    4. 运行 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

    redis_init脚本

    4.6 验证 uninit 脚本

    删除 6383 实例

    redis_uninit脚本

  • 相关阅读:
    css 重新学习系列(1)
    sublime Text 使用
    值得收藏的前端大牛博客
    javascript中最常用的方法
    ie6,ie7兼容性总结
    jQuery学习笔记(二)
    jQuery学习笔记(一)
    php smarty
    javascript DOM(2) 一个网页上切换显示不同的图片或文本
    effective c++ 8: Prevent exceptions from leaving destrctors
  • 原文地址:https://www.cnblogs.com/wangenzhi/p/10562761.html
Copyright © 2020-2023  润新知