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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM