Redis 主从复制高可用方案

时间:2022-09-14 21:09:07

Redis 主从复制高可用方案

 

主节点:172.18.0.4
从节点:172.18.11.41 
注意:所有从节点的配置都一样

 

停止防火墙(有可能还需要iptables加规则)
systemctl stop firewalld.service 

 

修改内核参数
vi /etc/sysctl.conf

vm.overcommit_memory = 1

 

安装需要的系统包:

 yum -y install gcc automake autoconf libtoolmake telnet ruby-devel ruby-irb ruby-libs ruby-rdoc ruby rubygems-develrubygems

 

安装redis-3.2.8

wgethttp://download.redis.io/releases/redis-3.2.8.tar.gz

tar -zxvfredis-3.2.8.tar.gz

make

编译安装  make install PREFIX=/usr/local/redis

 

建立目录:

mkdir-p/usr/local/redis/bin

cd  /usr/local/src/redis-3.2.8/src

cp  /usr/local/src/redis-3.2.8/redis.conf  /etc

cp  /usr/local/src/redis-3.2.8/sentinel.conf /etc
cp  mkreleasdhdr.sh redis-benchmarkredis-check-aof redis-check-dump redis-cli redis-server

redis-sentinel /usr/local/redis/bin

 

修改配置文件

主:/etc/redis.conf

bind 172.18.0.4

protected-mode yes

port 6379

tcp-backlog 128

timeout 0

tcp-keepalive 300

daemonize yes

supervised no

pidfile "/var/run/redis_6379.pid"

loglevel notice

logfile"/var/log/redis/redis.log"

databases 16

save 900 1

save 300 10

save 60 10000

stop-writes-on-bgsave-error yes

rdbcompression yes

rdbchecksum yes

dbfilename "dump.rdb"

dir "/usr/local/redis"

masterauth "xxxx1812"

slave-serve-stale-data yes

slave-read-only no

repl-diskless-sync no

repl-diskless-sync-delay 5

repl-disable-tcp-nodelay no

slave-priority 100

requirepass "hjhz1812"

appendonly yes

appendfilename "appendonly.aof"

appendfsync everysec

no-appendfsync-on-rewrite no

auto-aof-rewrite-percentage 100

auto-aof-rewrite-min-size 64mb

aof-load-truncated yes

lua-time-limit 5000

slowlog-log-slower-than 10000

slowlog-max-len 128

latency-monitor-threshold 0

notify-keyspace-events ""

hash-max-ziplist-entries 512

hash-max-ziplist-value 64

list-max-ziplist-size -2

list-compress-depth 0

set-max-intset-entries 512

zset-max-ziplist-entries 128

zset-max-ziplist-value 64

hll-sparse-max-bytes 3000

activerehashing yes

client-output-buffer-limit normal 0 0 0

client-output-buffer-limit slave 256mb 64mb60

client-output-buffer-limit pubsub 32mb 8mb60

hz 10

aof-rewrite-incremental-fsync yes

 

从:/etc/redis.conf

bind 172.18.11.41

protected-mode yes

port 6381

tcp-backlog 511

timeout 0

tcp-keepalive 300

daemonize yes

supervised no

pidfile "/var/run/redis_6381.pid"

loglevel notice

logfile "/var/log/redis.log"

databases 16

save 900 1

save 300 10

save 60 10000

stop-writes-on-bgsave-error yes

rdbcompression yes

rdbchecksum yes

dbfilename "dump.rdb"

dir "/"

masterauth "hjhz1812"

slave-serve-stale-data yes

slave-read-only yes

repl-diskless-sync no

repl-diskless-sync-delay 5

repl-disable-tcp-nodelay no

slave-priority 100

requirepass "xxxx1812"

maxmemory 3000mb

appendonly yes

appendfilename "appendonly.aof"

appendfsync everysec

no-appendfsync-on-rewrite no

auto-aof-rewrite-percentage 100

auto-aof-rewrite-min-size 64mb

aof-load-truncated yes

lua-time-limit 5000

slowlog-log-slower-than 10000

slowlog-max-len 128

latency-monitor-threshold 0

notify-keyspace-events ""

hash-max-ziplist-entries 512

hash-max-ziplist-value 64

list-max-ziplist-size -2

list-compress-depth 0

set-max-intset-entries 512

zset-max-ziplist-entries 128

zset-max-ziplist-value 64

hll-sparse-max-bytes 3000

activerehashing yes

client-output-buffer-limit normal 0 0 0

client-output-buffer-limit slave 256mb 64mb60

client-output-buffer-limit pubsub 32mb 8mb60

hz 10

aof-rewrite-incremental-fsync yes

slaveof 172.18.0.4 6379

 

启动文件:

主:

#!/usr/bin/env bash

#

# redis start up the redis server daemon

#

# chkconfig: 345 99 99

# description: redis service in/etc/init.d/redis \

#             chkconfig --add redis or chkconfig--list redis \

#             service redis start  or service redis stop

# processname: redis-server

# config: /etc/redis.conf

 

PATH=/usr/local/bin:/sbin:/usr/bin:/bin

 

REDISPORT=6379

EXEC=/usr/local/bin/redis-server

REDIS_CLI=/usr/local/bin/redis-cli

 

PIDFILE=/var/run/redis_6379.pid

CONF="/etc/redis.conf"

#make sure some dir exist

if [ ! -d /var/lib/redis ] ;then

   mkdir -p /var/lib/redis

   mkdir -p /var/log/redis

fi

 

case "$1" in

   status)

       ps -A|grep redis

       ;;

   start)

       if [ -f $PIDFILE ]

       then

                echo "$PIDFILE exists,process is already running or crashed"

       else

                echo "Starting Redisserver..."

                $EXEC $CONF

       fi

       if [ "$?"="0" ]

       then

              echo "Redis isrunning..."

       fi

       ;;

   stop)

       if [ ! -f $PIDFILE ]

       then

                echo "$PIDFILE does notexist, process is not running"

       else

                PID=$(cat $PIDFILE)

                echo "Stopping ..."

                $REDIS_CLI   -h 172.18.0.4 -p 6379 -a xxxx1812 shutdown

                while [ -x ${PIDFILE} ]

               do

                    echo "Waiting forRedis to shutdown ..."

                    sleep 1

                done

                echo "Redis stopped"

       fi

       ;;

  restart|force-reload)

       ${0} stop

       ${0} start

       ;;

  *)

   echo "Usage: /etc/init.d/redis{start|stop|restart|force-reload}" >&2

       exit 1

esac

 

从启动文件:

#!/usr/bin/env bash

#

# redis start up the redis server daemon

#

# chkconfig: 345 99 99

# description: redis service in/etc/init.d/redis \

#            chkconfig --add redis orchkconfig --list redis \

#             service redis start  or service redis stop

# processname: redis-server

# config: /etc/redis.conf

 

PATH=/usr/local/bin:/sbin:/usr/bin:/bin

 

REDISPORT=6381

EXEC=/usr/local/bin/redis-server

REDIS_CLI=/usr/local/bin/redis-cli

 

PIDFILE=/var/run/redis_6381.pid

CONF="/etc/redis.conf"

#make sure some dir exist

if [ ! -d /var/lib/redis ] ;then

   mkdir -p /var/lib/redis

   mkdir -p /var/log/redis

fi

 

case "$1" in

   status)

       ps -A|grep redis

       ;;

   start)

       if [ -f $PIDFILE ]

       then

                echo "$PIDFILE exists,process is already running or crashed"

       else

                echo "Starting Redisserver..."

                $EXEC $CONF

        fi

       if [ "$?"="0" ]

       then

              echo "Redis isrunning..."

       fi

       ;;

   stop)

       if [ ! -f $PIDFILE ]

       then

                echo "$PIDFILE does notexist, process is not running"

       else

                PID=$(cat $PIDFILE)

                echo "Stopping ..."

                $REDIS_CLI   -h 172.18.11.41 -p 6381 -a xxxx1812 shutdown

                while [ -x ${PIDFILE} ]

               do

                    echo "Waiting forRedis to shutdown ..."

                    sleep 1

                done

                echo "Redis stopped"

       fi

       ;;

  restart|force-reload)

       ${0} stop

       ${0} start

       ;;

  *)

   echo "Usage: /etc/init.d/redis {start|stop|restart|force-reload}">&2

       exit 1

esac

 

启动停止命令:

(主从相同)

service redis start/stop/status

service sentinel stat/stop/status

 

安装sentinel  如果Master异常,则会进行Master-Slave切换,将其中一个Slave作为Master,将之前的Master作为Slave

 

Sentinel 主配置文件:

bind 172.18.0.4

protected-mode yes

daemonize yes

port 26379

dir "/tmp"

logfile"/usr/local/redis/sentinel.log"

sentinel monitor mymaster 172.18.0.4 6379 2

sentinel down-after-milliseconds mymaster15000

sentinel failover-timeout mymaster 900000

sentinel auth-pass mymaster hjhz1812

sentinel config-epoch mymaster 7

sentinel leader-epoch mymaster 7

# Generated by CONFIG REWRITE

sentinel known-slave mymaster 172.18.11.416381

sentinel current-epoch 7

 

sentinel 从配置文件:

bind 172.18.11.41

protected-mode yes

daemonize yes

port 26381

dir "/tmp"

logfile "/usr/local/redis/sentinel.log"

sentinel monitor mymaster 172.18.0.4 6379 2

sentinel down-after-milliseconds mymaster15000

sentinel failover-timeout mymaster 900000

sentinel auth-pass mymaster hjhz1812

sentinel config-epoch mymaster 7

# Generated by CONFIG REWRITE

sentinel leader-epoch mymaster 7

sentinel known-slave mymaster 172.18.11.416381

sentinel current-epoch 7

 

sentinel 主启动文件:

/etc/init.d/sentinel

 

#!/usr/bin/env bash

#

# redis start up the sentinel server daemon

#

# chkconfig: 345 98 98

# description: sentinel service in/etc/init.d/sentinel \

#             chkconfig --add sentinel orchkconfig --list sentinel \

#             service sentinel start  or service sentinel stop

# processname: sentinel-server

# config: /etc/sentinel.conf

 

PATH=/usr/local/bin:/sbin:/usr/bin:/bin

 

EXEC=/usr/local/bin/redis-sentinel

REDIS_CLI=/usr/local/bin/redis-cli

 

#PIDFILE=/var/run/redis_6379.pid

CONF="/etc/sentinel.conf"

a=`ps -A|grep sentinel|wc -l`

#make sure some dir exist

if [ ! -d /var/lib/redis ] ;then

   mkdir -p /var/lib/redis

   mkdir -p /var/log/redis

fi

 

case "$1" in

   status)

       ps -A|grep sentinel

       ;;

   start)

       if [ $a -gt 0 ]

       then

                echo "$PIDFILE exists,process is already running or crashed"

       else

                echo "Starting Redisserver..."

                $EXEC $CONF

       fi

       if [ "$?"="0" ]

       then

              echo "Redis isrunning..."

       fi

       ;;

   stop)

       if [ $a -eq 0 ]

       then

                echo "sentinel does not exist, process isnot running"

       else

                #PID=$(cat $PIDFILE)

                echo "Stopping ..."

                pkill sentinel

                #$REDIS_CLI   -h 172.18.0.4 -p 6379 -a xxxx1812 shutdown

                while [ -x $a ]

                do

                    echo "Waiting forRedis to shutdown ..."

                    sleep 1

                done

                echo "Redis stopped"

       fi

       ;;

  restart|force-reload)

       ${0} stop

       ${0} start

       ;;

  *)

   echo "Usage: /etc/init.d/sentinel{start|stop|restart|force-reload}" >&2

       exit 1

esac

 

sentinel 从启动文件:

/etc/init.d/sentinel

#!/usr/bin/env bash

#

# redis-sentinel start up the redis serverdaemon

#

# chkconfig: 345 98 98

# description: redis service in/etc/init.d/redis \

#             chkconfig --add sentinel orchkconfig --list sentinel \

#             service sentinel start  or service sentinel stop

# processname: sentinel-server

# config: /etc/sentinel.conf

 

PATH=/usr/local/bin:/sbin:/usr/bin:/bin

 

EXEC=/usr/local/bin/redis-sentinel

#REDIS_CLI=/usr/local/bin/redis-cli

 

#PIDFILE=/var/run/redis_6379.pid

CONF="/etc/sentinel.conf"

a=`ps -A|grep sentinel|wc -l`

#make sure some dir exist

if [ ! -d /var/lib/redis ] ;then

   mkdir -p /var/lib/redis

   mkdir -p /var/log/redis

fi

 

case "$1" in

   status)

       ps -A|grep sentinel

       ;;

   start)

       if [ $a -gt 0 ]

       then

                echo "$PIDFILE exists,process is already running or crashed"

       else

                echo "Starting Redisserver..."

                $EXEC $CONF

       fi

       if [ "$?"="0" ]

       then

              echo "Redis isrunning..."

       fi

       ;;

   stop)

       if [ $a -eq 0 ]

       then

                echo "sentinel does notexist, process is not running"

       else

                #PID=$(cat $PIDFILE)

                echo "Stopping ..."

                pkill sentinel

                #$REDIS_CLI   -h 172.18.0.4 -p 6379 -a xxxx1812 shutdown

                while [ -x $a ]

                do

                    echo "Waiting forRedis to shutdown ..."

                    sleep 1

                done

                echo "Redis stopped"

       fi

       ;;

  restart|force-reload)

       ${0} stop

       ${0} start

       ;;

  *)

   echo "Usage: /etc/init.d/sentinel{start|stop|restart|force-reload}" >&2

       exit 1

esac

 

 

注意点:
1)
:首次启动时,必须先启动Master
2)
:Sentinel 只在server 端做主从切换,

3):若Master已经被判定为下线,Sentinel已经选择了新的Master,也已经将old Master改成Slave,但是还没有将其改成new Master。若此时重启old Master,则Redis集群将处于无Master状态,此时只能手动修改配置文件,然后重新启动集群

到此Redis集群配置完毕

 

附录(说明参数):

daemonize:如需要在后台运行,把该项的值改为yes

pdifile:把pid文件放在/var/run/redis.pid,可以配置到其他地址

bind:指定redis只接收来自该IP的请求,如果不设置,那么将处理所有请求,在生产环节中最好设置该项

port:监听端口,默认为6379

timeout:设置客户端连接时的超时时间,单位为秒

loglevel:等级分为4级,debug,revbose,notice和warning。生产环境下一般开启notice

logfile:配置log文件地址,默认使用标准输出,即打印在命令行终端的端口上

database:设置数据库的个数,默认使用的数据库是0

save:设置redis进行数据库镜像的频率

rdbcompression:在进行镜像备份时,是否进行压缩

dbfilename:镜像备份文件的文件名

dir:数据库镜像备份的文件放置的路径

slaveof:设置该数据库为其他数据库的从数据库

masterauth:当主数据库连接需要密码验证时,在这里设定

requirepass:设置客户端连接后进行任何其他指定前需要使用的密码

maxclients:限制同时连接的客户端数量

maxmemory:设置redis能够使用的最大内存

appendonly:开启appendonly模式后,redis会把每一次所接收到的写操作都追加到appendonly.aof文件中,当redis重新启动时,会从该文件恢复出之前的状态

ppendfsync:设置appendonly.aof文件进行同步的频率

 

主要工具:

redis-benchmark:redis性能测试工具

redis-check-aof:检查aof日志的工具

redis-check-dump:检查rdb日志的工具

redis-cli:连接用的客户端

redis-server:redis服务进程