3台服务器Redis高可用哨兵模式实现

Redis 的 Sentinel 系统用于管理多个 Redis 服务器(instance), 该系统执行以下三个任务: 
监控(Monitoring): Sentinel 会不断地检查你的主服务器和从服务器是否运作正常。 
提醒(Notification): 当被监控的某个 Redis 服务器出现问题时, Sentinel 可以通过 API 向管理员或者其他应用程序发送通知。 
自动故障迁移(Automatic failover): 当一个主服务器不能正常工作时, Sentinel 会开始一次自动故障迁移操作, 它会将失效主服务器的其中一个从服务器升级为新的主服务器, 并让失效主服务器的其他从服务器改为复制新的主服务器; 当客户端试图连接失效的主服务器时, 集群也会向客户端返回新主服务器的地址, 使得集群可以使用新主服务器代替失效服务器。 
Redis Sentinel 是一个分布式系统, 你可以在一个架构中运行多个 Sentinel 进程(progress), 这些进程使用流言协议(gossip protocols)来接收关于主服务器是否下线的信息, 并使用投票协议(agreement protocols)来决定是否执行自动故障迁移, 以及选择哪个从服务器作为新的主服务器。 
虽然 Redis Sentinel 释出为一个单独的可执行文件 redis-sentinel , 但实际上它只是一个运行在特殊模式下的 Redis 服务器, 你可以在启动一个普通 Redis 服务器时通过给定 –sentinel 选项来启动 Redis Sentinel 。

环境 
CentOS7.2 
redis3.2.8

服务器IPredis端口哨兵端口服务器角色
10.1.0.160   6379   26379    
10.1.0.161   6379   26379   从1  
10.1.0.71   6379   26379   从2  
2. redis程序安装

以下是单redis安装脚本,可适用于单redis使用。 
cat install_redis.sh

#!/usr/bin/env bash
# It's Used to be install redis.
# Created on 2016/10/19 11:18.
# @author: Chinge_Yang.
# Version: 1.0

function install_redis () {
#################################################################################################
       sourcepackage_dir="/tmp"
       redis_install_dir="/usr/local/redis"
       cd ${sourcepackage_dir}
       if [ ! -f " redis-stable.tar.gz" ]; then
               wget
       fi
       cd ${makework_dir}
       tar -zxvf ${sourcepackage_dir}/redis-stable.tar.gz
       cd redis-stable
       make PREFIX=/usr/local/redis install
       return_echo "make"
       mkdir -p /usr/local/redis/{etc,var}
       rsync -avz redis.conf  /usr/local/redis/etc/
       sed -i 's@pidfile.*@pidfile /var/run/redis-server.pid@' $redis_install_dir/etc/redis.conf
       sed -i "s@logfile.*@logfile $redis_install_dir/var/redis.log@" $redis_install_dir/etc/redis.conf
       sed -i "s@^dir.*@dir $redis_install_dir/var@" $redis_install_dir/etc/redis.conf
       sed -i 's/daemonize no/daemonize yes/g' /usr/local/redis/etc/redis.conf
       sed -i 's/^# bind 127.0.0.1/bind 127.0.0.1/g' /usr/local/redis/etc/redis.conf
       rsync -avz ${sourcepackage_dir}/init.d/redis-server /etc/init.d/
       /etc/init.d/redis-server start
       chkconfig --add redis-server
       chkconfig redis-server on
#################################################################################################
}

install_redis

redis启停脚本示例: 
cat redis-server

#!/bin/bash
#
# redis - this script starts and stops the redis-server daemon
#
# chkconfig:   - 85 15
# description:  Redis is a persistent key-value database
# processname: redis-server
# config:      /usr/local/redis/etc/redis.conf
# config:      /etc/sysconfig/redis
# pidfile:     /usr/local/redis/var/redis-server.pid

# Source function library.
. /etc/rc.d/init.d/functions

# Source networking configuration.
. /etc/sysconfig/network

# Check that networking is up.
[ "$NETWORKING" = "no" ] && exit 0

redis="/usr/local/redis/bin/redis-server"
prog=$(basename $redis)

REDIS_CONF_FILE="/usr/local/redis/etc/redis.conf"

[ -f /etc/sysconfig/redis ] && . /etc/sysconfig/redis

lockfile=/var/lock/subsys/redis-server

start() {
   [ -x $redis ] || exit 5
   [ -f $REDIS_CONF_FILE ] || exit 6
   echo -n $"Starting $prog: "
   daemon $redis $REDIS_CONF_FILE
   retval=$?
   echo
   [ $retval -eq 0 ] && touch $lockfile
   return $retval
}

stop() {
   echo -n $"Stopping $prog: "
   killproc $prog
   retval=$?
   echo
   [ $retval -eq 0 ] && rm -f $lockfile
   return $retval
}

restart() {
   stop
   start
}

reload() {
   echo -n $"Reloading $prog: "
   killproc $redis -HUP
   RETVAL=$?
   echo
}

force_reload() {
   restart
}

rh_status() {
   status $prog
}

rh_status_q() {
   rh_status >/dev/null 2>&1
}

case "$1" in
   start)
       rh_status_q && exit 0
       $1
       ;;
   stop)
       rh_status_q || exit 0
       $1
       ;;
   restart)
       $1
       ;;
   reload)
       rh_status_q || exit 7
       $1
       ;;
   force-reload)
       force_reload
       ;;
   status)
       rh_status
       ;;
   condrestart|try-restart)
       rh_status_q || exit 0
           ;;
   *)
       echo $"Usage: $0 {start|stop|status|restart|condrestart|try-restart|reload|force-reload}"
       exit 2
esac

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/1c18f822890e3d296aec27963679414f.html