Redis sentinel哨兵集群
sentinel(sen/te/nou)
redis哨兵集群
作用:可以实现类似mysql的mha的相关操作,实时监控redis各个数据库的运行情况,并且在主库停止运行时,可以实现自动的故障转移,是实现redis高可用的基础

实现过程:
1、哨兵节点会定期监控整个redis数据节点运行情况
2、当发现主节点宕机时,哨兵之间会通过选举,选出一个领导节点来进行故障转移操作
3、在从节点列表中选出一个节点作为新的主节点,方法如下:
(1)过滤:“不健康”(主观下线、断线)、在规定时间(5秒)内没有回复Sentinel节点ping响应,则不会选为新的主节点,因为这个从节点可能已经宕机或者性能较差响应速度慢
(2)选择slave-priority(从优先级)最高的从节点列表(数字越小优先级越高),如果存在则返回,不存在则继续。
(3)选择复制偏移量最大的从节点,也就是看那个从库数据最新
(4)选择runid最小的从节点,因为runid每次都会随着重启而改变,所以相当于随机选择
4、领导者节点会对第一步选出来的从节点执行slaveof no one命令,使其成为主
5、领导者节点会向剩余的从节点发送命令,让他们成为新主的从节点
6、Sentinel节点集合会将原来的主节点更新为从节点并保持这对其关注,当其恢复后命令它去复制新的主节点。

实现原理:
sentiel哨兵集群其主要原理就是通过三个定时任务进行实时的监控,从而判断各个节点是否正常

主观下线:表示sentinel自己对主节点宕机的判定
当一个sentinel通过ping命令对主节做心跳检测,如果sentinel没有收到有效回复,那么该sentinel节点就会主观的认为该主节点已经停掉了,从而标记为主观下线,因为只有一个sentinel判定节点停止,所以会存在误判断的可能。

客观下线:表示多个sentinel在交流后一致判定主节点宕机
当标记为主观下线后,sentinel会加快广播包的发送频率,当同一频道内的其他sentinel收到后,也会给主节点发送心跳包检测,当超过一半的sentinel都判定主节点宕机后,那么他们会统一的将主节点标记为客观下线

领导这选举:因为有多个sentinel,如果说让其都去执行故障转移操作,则会出现冲突,所以会通过领导者算法,而选举出执行故障转移的sentinel节点,让其单独执行故障转移,大体思路如下:
(1)每个在线的Sentinel节点都有资格成为领导者,当他确认主节点主观下线时,会向其他Sentinel节点发送sentinel is-master-down-by-addr命令,要求将自己设置为领导者。
(2)收到命令的节点,如果没有同意过其他节点的请求,则会同意该请求,否则拒绝。
(3)如果某一个节点的票数已经大于等于max(quorum,num(sentinels)/2+1),那么它将成为领导者
(4)如果此过程没有选举出领导者,将进入下一次选举
从以上过程可以推断出,最先发现主节点宕机的sentinel节点,将最有可能成为领导者

哨兵只能实现redis的故障转移,并不能实现高可用,高可用可以配合keepalive实现,在设置优先级的时候注意,redis中优先级数字越小优先级越高,keepalived中优先级数字越大优先级越高

Redis哨兵集群及keepalived部署
==Redis哨兵集群及keepalived部署=
主redis:192.168.40.11
从redis:192.168.40.12 192.168.40.13

192.168.40.11和192.168.40.12做keepalived高可用

=环境部署
systemctl stop firewalld
setenforce 0
yum -y install gcc gcc-c++

===安装redis=
tar -xf redis-4.0.9.tar.gz
cd redis-4.0.9/
make
cd src/
#其中redis-server是服务端程序,redis-cli是客户端程序,redis.conf是redis的配置文件,redis-benchmark是redis的压力测试工具,
mkdir -p /usr/local/redis
cp -p redis-server redis-cli redis-benchmark /usr/local/redis/
cp /root/redis-4.0.9/redis.conf /usr/local/redis/
cd /usr/local/redis/
ln -s /usr/local/redis/redis-cli /usr/bin/redis

修改所有服务器的redis配置文件
#将redis监听的网卡IP改成自身对外监听的网卡IP地址
sed -i "/^bind 127.0.0.1 / s / 127.0.0.1 / / s/127.0.0.1/ /s/127.0.0.1/(ifconfig ens32 | awk 'NR2 {print $2}’)/g" /usr/local/redis/redis.conf

#关闭redis的保护模式,类似linux的安全机制,所以必须关闭
sed -i ‘/protected-mode/s/yes/no/g’ /usr/local/redis/redis.conf

#开启redis后台守护进程模式,否则redis会在前台运行
sed -i ‘/daemonize/s/no/yes/g’ /usr/local/redis/redis.conf

#设置redis密码
sed -i ‘/requirepass/s/foobared/123123/g’ /usr/local/redis/redis.conf

#将redis密码那一行得注释去掉
sed -i ‘/requirepass 123123/s/^#//g’ /usr/local/redis/redis.conf

#修改日志文件存放路径及名称
sed -i ‘/logfile/s@""@"/var/log/redis.log"@g’ /usr/local/redis/redis.conf

#修改redis最大使用内存,需要小于主机内存或等于主机内存,可使用free -m查询主机内存
sed -i ‘/maxmemory /s//500MB/g’ /usr/local/redis/redis.conf
sed -i ‘/maxmemory 500MB/s/^#//g’ /usr/local/redis/redis.conf

=主库生成redis启动脚本
cat <>/etc/init.d/redis
#!/bin/sh

chkconfig: 2345 80 90

description: Start and Stop redis

#PATH=/usr/local/bin:/sbin:/usr/bin:/bin
REDISPORT=6379
EXEC=/usr/local/redis/redis-server
REDIS_CLI=/usr/local/redis/redis-cli
PIDFILE=/var/run/redis_6379.pid
CONF="/usr/local/redis/redis.conf"
AUTH=“123123”
LISTEN_IP=$(netstat -utpln |grep redis-server |awk ‘{print $4}’|awk -F’:’ ‘{print $1}’ |uniq)

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
if [ “$?”=“0” ]
then
echo “Redis is running…”
fi
;;
stop)
if [ ! -f $PIDFILE ]
then
echo “$PIDFILE does not exist, process is not running”
else
PID=$(cat $PIDFILE)
echo “Stopping …”
$REDIS_CLI -h $LISTEN_IP -p $REDISPORT -a $AUTH SHUTDOWN
while [ -x ${PIDFILE} ]
do
echo “Waiting for Redis 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
END

chmod +x /etc/init.d/redis

======配置主从复制
=======主库配置文件优化
#如果redis作为缓存使用,可以不使用该优化,具体可根据实际情况选择

#设置slave节点的数量,如果slave节点数量少于此值,那么master节点将停止客户端的一切写请求,从而保证至少有一台从库和自己的数据时完全一致的
sed -i ‘/# min-slaves-to-write/ s/2/1/g’ redis.conf
sed -i ‘/# min-slaves-to-write/ s/#//g’ redis.conf

#master与slave之间同步数据的延迟时间,若超过此时间,master节点将停止客户端的一切写操作
sed -i ‘/# min-slaves-max-lag 10/ s/#//g’ redis.conf

#指定连接mater的密码,因为在后续的故障转移过程中,master作为从时,sentine不会自动生成新主的密码,整个架构中他们的密码是相同的,所以在这里我们提前指定好密码,方便后续故障转移后,原主库能够实现主从复制
sed -i ‘/masterauth/ s/# masterauth /masterauth 123123/g’ /usr/local/redis/redis.conf

====修改所有从库配置文件=
#指定主库IP及端口号
sed -i ‘/# slaveof/ s/# slaveof /slaveof 192.168.40.11 6379/g’ /usr/local/redis/redis.conf

#指定连接mater的密码
sed -i ‘/masterauth/ s/# masterauth /masterauth 123123/g’ /usr/local/redis/redis.conf

以上全部配置好后,启动redis,通过info replication查看主从复制是否正常=

======配置redis sentinel(配置在从库上,或配置在架构中的所有redis上)=
cd /root/redis-4.0.9/
cp src/redis-sentinel /usr/local/redis/
cp sentinel.conf /usr/local/redis/

==编辑sentinel.conf配置文件
vim /usr/local/redis/sentinel.conf

#dG将文件中的所有内容删掉,改成以下内容
port 26379 #指定sentinel端口号
dir “/var/redis/data” #指定sentinel日志存放目录

sentinel monitor kgc 192.168.40.11 6379 1 #指定主库信息,kgc表示给主库起了个名字,后面可以调用这个名字,后面是主库的IP及对应的redis监听端口,1表示当有多少个哨兵认为master失效时,master才算真正失效

sentinel down-after-milliseconds kgc 3000 #指定master失效时间,当在规定时间内,master没有回应sentinel时,则会标记为主观下线,单位毫秒,默认为3秒

sentinel auth-pass kgc 123123 #指定连接主库和从库时的密码,在设置主从复制时,应该将主库和从库的密码设置为相同

sentinel parallel-syncs kgc 1 #指定当故障转移完成之后,最多有多少个slave同时对新的master进行同步,数字越小,完成故障转移时间越长,如果数字过大,则会造成多台slave因为数据同步而无法对外提供服务

sentinel failover-timeout kgc 180000 #故障转移的超时时间,单位毫秒,如果在规定时间内没有完成故障转移,则重新连接

protected-mode no #关闭保护模式,必须要关闭,否则可能会造成无法故障转移
daemonize yes #以守护进程方式启动

=启动哨兵模式==
mkdir -p /var/redis/data
/usr/local/redis/redis-sentinel /usr/local/redis/sentinel.conf
netstat -anpt |grep 26379

#登录redis sentinel,通过info sentinel可以查看哨兵的相关信息
redis -h 192.168.40.13 -p 26379 -a 123123

=测试故障转移==
#停掉主库,然后登录任意从库,通过info replication查看主从复制信息,查看主库是否发生变化
#启动旧主redis并登录,查看主从复制信息,看自己是否成为从库
#在新主创建一个键,测试旧主是否能查看到,从而确定主从同步是否正常

#恢复原始状态,使旧主依然作为主库,用于配置后续的keepalived高可用
(1)关闭sentinel
(2)关闭所有redis
(3)修改配置文件中的slaveof
(4)修改sentinel配置文件中的主从信息

=配置keepalived高可用
====修改redis优先级,从而在后续配置高可用时可以使vip准确的漂移
#当恢复原始状态完成后,不要启动redis及sentinel,执行以下操作
#修改主库优先级,注意数字越低,级别越高
sed -i ‘/slave-priority/ s/100/98/g’ /usr/local/redis/redis.conf

#修改192.168.40.12优先级
sed -i ‘/slave-priority/ s/100/99/g’ /usr/local/redis/redis.conf

安装keepalived=
yum -y install keepalived

====修改主keepalived主配置文件=
vim /etc/keepalived/keepalived.conf

! Configuration File for keepalived

global_defs {
router_id redis1
}
vrrp_script redis { #调用脚本监控模块
script /opt/redis.sh #监控脚本存放位置及名称
interval 3 #健康检查时间
}

vrrp_instance VI_1 {
state SLAVE
interface ens32
virtual_router_id 51
priority 100
advert_int 1
nopreempt #不抢占参数
authentication {
auth_type PASS
auth_pass 1111
}
track_script { #调用脚本监控模块
redis
}
virtual_ipaddress { #设置VIP
192.168.40.150
}
}

========修改从keepalived主配置文件=
vim /etc/keepalived/keepalived.conf

! Configuration File for keepalived

global_defs {
router_id redis2
}
vrrp_script redis { #调用脚本监控模块
script /opt/redis.sh #监控脚本存放位置及名称
interval 3 #健康检查时间
}

vrrp_instance VI_1 {
state SLAVE
interface ens32
virtual_router_id 51
priority 99
advert_int 1
authentication {
auth_type PASS
auth_pass 1111
}
track_script { #调用脚本监控模块
redis
}
virtual_ipaddress { #设置VIP
192.168.40.150
}
}

===生成监控脚本
====生成方式一
vim /opt/redis.sh

#!/bin/bash
IP=$(ifconfig ens32 |awk ‘NR==2 {print $2}’)
/usr/local/redis/redis-cli -h $IP -p 6379 -a 123123 -c info replication &> /dev/null
if [ $? -eq 1 ]
then
systemctl stop keepalived
else
exit 0
fi

==生成方式二
cat <> /opt/redis.sh
#!/bin/bash
IP=$(ifconfig ens32 |awk 'NR2 {print $2}’)
/usr/local/redis/redis-cli -h $IP -p 6379 -a 123123 -c info replication &> /dev/null
if [ $? -eq 1 ]
then
systemctl stop keepalived
else
exit 0
fi

EOF

=修改所有redis主配置文件中的bind IP地址=====
#由于后续需要通过VIP来实现高可用,如果bind参数依然设置为自身IP,那么则会造成redis只能实现VIP漂移,而VIP却没有实质作用,无法通过VIP来实现登录数据库,解决办法如下

#将bind参数中的IP地址改为0.0.0.0,表示监听任意IP
bind 0.0.0.0

修改所有从库的slaveof========
#将所有slaveof改为主库IP地址
slaveof 192.168.40.11 6379

修改sentinel.conf配置文件==
#将其中master的IP地址改为主库IP地址
sentinel monitor kgc 192.168.40.11 6379 1

=最终测试====
1、先启动主库,然后再依次启动所有从库
2、启动keeplived
3、启动sentinel
4、查看主库是否有VIP
5、通过-c选项,使用info replication查看主从复制状态
6、关闭主库
7、在备份库上查看VIP是否漂移到这边
8、修复损坏的主库,并查看VIP是否会被抢回来,如果不抢则表示高可用配置正确
9、在所有库上通过-c选项,使用info replication查看主从复制状态

redis -h 192.168.40.13 -p 6379 -a 123123 -c info replication

Redis sentinel哨兵集群相关推荐

  1. redis 主从 哨兵 集群部署

    介绍 Redis是当前比较热门的NOSQL系统之一,它是一个key-value存储系统.和Memcache类似,但很大程度补偿了Memcache的不足,它支持存储的value类型相对更多,包括stri ...

  2. Redis 高可用篇:你管这叫 Sentinel 哨兵集群原理

    概要 我们知道「主从复制是高可用的基石」,从库宕机依然可以将请求发送给主库或者其他从库,但是 Master 宕机,只能响应读操作,写请求无法再执行. 所以主从复制架构面临一个严峻问题,主库挂了,无法执 ...

  3. SpringBoot整合Redis(单机/哨兵/集群)

    pom <?xml version="1.0" encoding="UTF-8"?> <project xmlns="http:// ...

  4. Redis面试 - 哨兵集群实现高可用

    Redis 哨兵集群实现高可用 哨兵的介绍 sentinel,中文名是哨兵.哨兵是 redis 集群机构中非常重要的一个组件,主要有以下功能: 集群监控:负责监控 redis master 和 sla ...

  5. 5-Redis 高可用篇:你管这叫 Sentinel 哨兵集群原理(码哥)

    概要 我们知道「主从复制是高可用的基石」,从库宕机依然可以将请求发送给主库或者其他从库,但是 Master 宕机,只能响应读操作,写请求无法再执行. 所以主从复制架构面临一个严峻问题,主库挂了,无法执 ...

  6. redis 主从 哨兵 集群 及原理

    1.主从哨兵 1.主从哨兵架构图: 此图为最常见的一主两从结构,一个master主机,两个slave主机.每台主机上都运行着两个进程: redis-server 服务,处理redis正常的数据操作与响 ...

  7. Redis:哨兵集群

    目录 基于pub/sub 机制的哨兵集群组成 基于pub/sub 机制的客户端事件通知 由哪个哨兵执行主从切换 哨兵实例是不是越多越好,如果同时调大 down-after-milliseconds 值 ...

  8. SpringBoot之单Redis与哨兵集群连接配置

    引入Redis依赖 <!-- 指定SpringBoot版本 --><parent><groupId>org.springframework.boot</gro ...

  9. Redis主从哨兵集群模式概念以及搭建

    目录 前言 一.Redis使用准备工作 1.1.下载redis 1.2.安装redis 二.Redis部署 2.1.单节点模式部署 2.2.主从模式部署 2.2.1 主从模式的感念: 2.2.2 主从 ...

最新文章

  1. 20161023 NOIP 模拟赛 T1 解题报告
  2. 16版.就诊时排队叫号
  3. java左手画圆右手画方_左手画圆,右手画方作文
  4. Lazyload 延迟加载效果
  5. 从零开始刷Leetcode——数组(189.217.219)
  6. Python可视化库Matplotlib的使用
  7. C语言:指向指针的指针
  8. DOCTYPE用法详解
  9. 内存池算法 linux,内存池自动释放 - 梦想游戏 - OSCHINA - 中文开源技术交流社区...
  10. Python爬虫:数据提取
  11. clockworkmod CWM简单介绍
  12. sqluldr2支持mysql吗_sqluldr2工具使用方法
  13. 短信接口安全防护策略
  14. C语言零碎知识点之输入字符数组
  15. 如何快速求出与n互素的数有多少个?
  16. 镜像 网站 linux 程序,腾讯开源镜像网站(腾讯云软件源)地址,附使用说明
  17. ASP.NET Core : 八.图说管道,唐僧扫塔的故事
  18. IT 大牛们的小传,有点academic风格的说^_^
  19. python编程一球从100米_【Python3练习题 015】 一球从100米高度自由落下,每次落地后反跳回原高度的一半,再落下。求它在第10次落地时,共经过多少米?第10次反弹多高?...
  20. 视频转mp3格式怎么弄?

热门文章

  1. Windows下opencc安装及使用方法
  2. Android手机导出微信聊天记录
  3. 2022EVH第二届新能源汽车产业技术高峰论坛_爱普搜汽车
  4. 火绒杀毒-史上最好用的杀毒软件
  5. mysql建库语句 最简单最常用语句
  6. 了解 Windows Azure 存储计费 – 带宽、事务和容量
  7. You have an error in your SQL syntax问题解决方法
  8. mac使用终端连接服务器错误:RSA host key for 10. . . has changed and you have requested strict checking.已解决
  9. python中io.textio_关于python的IO读写的二三事
  10. 在DOS环境下制作Windows启动盘