Redis 單機和多實例部署

做者:北京運維node

1. 安裝環境說明

  • OS 版本:CentOS 7.5.1804
  • Redis 版本:redis-3.2.12

Redis 下載頁面:http://download.redis.io/releases/redis

Redis 版本號第 2 位,若是是奇數,則爲非穩定版本(例如 2.七、2.九、3.1)若是是偶數爲穩定版本(例如 2.八、3.0、3.2)vim

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 檢查版本: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

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 做爲模板進行修改。app

redis 的基礎配置運維

配置名 配置說明
port 端口
logfile 日誌文件
dir Redis 工做目錄(存放持久化文件和日誌文件)
daemonize 是否已守護進程方式啓動 Redis(yes 或 no)

2.3 啓動 Redis

2.3.1 準備 Redis 配置文件

複製 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/

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腳本

相關文章
相關標籤/搜索