Redis 哨兵机制及配置实现


Posted in Redis onMarch 25, 2022

一、为什么 Redis 集群中要有哨兵机制

Redis 主从复制有一个缺点,当 master 宕机以后,整个集群的写就会挂掉。因为 redis 本身是不会自动从 slave 中选举出新的 master 的。

我们理想的情况是:当 master 挂掉之后,可以有 slave 迅速补上,自动切换为 master,不影响整个服务。

基于此,引入了 Redis Sentinel(Redis 哨兵机制)。

它能够在 master 挂掉之后,自动从 多台 slave 中选举出 新的 master,迅速开始工作,省去了人工切换的麻烦,实现了 redis 的高可用。

二、模拟主机挂掉之后,人工切换

1、环境介绍

这里有四台 redis,分别的 ip 是:

master:172.10.0.2
 
slave1:172.10.0.3
slave2:172.10.0.4
slave3:172.10.0.5

2、将原来的 master 挂掉

通过 netstat -anp|grep 6379 命令找到 master 的 pid,然后 kill 掉。

去几个 slave 中查询 info replication,会发现,master 的状态已经是 down

3、人工将一个 slave 选举成为新的 master

选择 slave2 成为 新的 master:

(1)去 slave2 客户端执行 slave no one命令

该命令会将 slave2 和原来的 master 的主从关系断掉,重新使自己成为 master(当然,这个 master 下没有一个 slave )

(2)到其他两个 slave 执行 slaveof 172.10.0.4 6379 或配置slaveof

注意 requirepass、masterauth、bind 的配置,并重启、重新加载配置文件,否则可能会不生效。

虽然人工方式也可以实现切换,但难免会碰到

‘到底选举哪一个为 master’, 
‘如果再断了又要重新配置’,
‘如果有其他事情耽误了,没来得及配置,会有很长一段时间无法提供服务’等问题,

因此,哨兵机制就变得十分有必要。

三、哨兵机制的原理

Redis Sentinel 是一个分布式架构,其中包含若干个 Sentinel 节点和 Redis 数据节点,每个 Sentinel 节点会对数据节点和其余 Sentinel 节点进行监控,当它发现节点不可达时,会对节点做下线标识。

Redis 哨兵机制及配置实现

哨兵集合监控redis主从是否正常运行。

如果挂掉的是从节点,则哨兵集合会将这个从节点做下线标识;

如果挂掉的是主节点,则哨兵集合不仅会对主节点做下线标识,而且还会所有哨兵进行"协商”,选举出新的主节点,来完成自动故障转移工作。原来的主节点恢复正常后,会变成新的主节点的从节点。

整个过程完全是自动的,不需要人工接入。

四、哨兵机制的实现

1、创建三个redis-sentinel,构成一个哨兵集合

docker run -itd --name  redis-sentinel-1 --privileged  --net haveyb-network  -p 6384:6379  --ip 172.10.0.6  docker-test
 
docker run -itd --name  redis-sentinel-2 --privileged  --net haveyb-network  -p 6385:6379  --ip 172.10.0.7  docker-test
 
docker run -itd --name  redis-sentinel-3 --privileged  --net haveyb-network  -p 6386:6379  --ip 172.10.0.8  docker-test

注:--net haveyb-network为指定自定义网络

2、使用 docker ps -a 命令查看当前创建的容器

Redis 哨兵机制及配置实现

3、分别进入新建的三个 sentinel 的每一个容器

docker exec -it redis-sentinel-3 bash

4、修改 net.core.somaxconn的值

vi /etc/sysctl.conf

(1)添加下面一行代码:

net.core.somaxconn = 32768

(2)加载

sysctl -p

5、修改 redis.conf

vi /etc/redis.conf

(1)修改参数 bind 127.0.0.1 为 0.0.0.0

bind 0.0.0.0

(2)设置 redis 密码

requirepass YourPasswordSettings

(3)加载配置文件

redis-server /etc/redis.conf &

6、修改新建的三台 redis-sentinel 的 redis-sentinel.conf

vi /etc/redis-sentinel.conf

(1)修改 # bind 127.0.0.1 192.168.1.1 为 bind 0.0.0.0

bind 0.0.0.0

(2)删除这一行代码

sentinel monitor mymaster 127.0.0.1 6379 2

这一行代码是redis默认给的(没有注释掉的),我们后面自己配置,所以直接删除掉,也会避免之后由于顺序造成的问题。

(3)添加下面代码

sentinel monitor mymaster 172.10.0.2 6379 2
 
sentinel auth-pass mymaster yourPasswordSettings
 
sentinel down-after-milliseconds mymaster 3000

解释:

第一行代码:

监控的主节点的名字(可以任意起,这里就起为 master)、IP 和端口,最后一个 2 的意思是有几台 Sentinel 发现有问题,就执行故障转移。一般这个数字设置为 Sentinel 节点数的一半加1。

不过这里建议把名字就起为 mymaster(默认的就是这个),因为如果起成别的名字,还需要对应改好几处地方。

第二行代码:

是填写连接的master的名字和密码,这里名字就用的默认的mymaster,密码要填写master的密码,我这里都设置成一样的了。

第三行代码

是设置每隔多长时间进行心跳检测,这里设置成3秒

7、分别在三台新建的redis-sentinel加载哨兵配置文件

redis-sentinel /etc/redis-sentinel.conf &

8、验证是否配置成功

如果出现下图类似内容,则说明配置哨兵成功

Redis 哨兵机制及配置实现

注:移除某个哨兵对master的监控,在哨兵中执行命令

sentinel remove mastername

到此这篇关于Redis 哨兵机制及配置实现的文章就介绍到这了,更多相关Redis 哨兵机制内容请搜索三水点靠木以前的文章或继续浏览下面的相关文章希望大家以后多多支持三水点靠木!

Redis 相关文章推荐
详解RedisTemplate下Redis分布式锁引发的系列问题
Apr 27 Redis
Redis Cluster集群动态扩容的实现
Jul 15 Redis
Redis源码阅读:Redis字符串SDS详解
Jul 15 Redis
为什么RedisCluster设计成16384个槽
Sep 25 Redis
关于SpringBoot 使用 Redis 分布式锁解决并发问题
Nov 17 Redis
Window server中安装Redis的超详细教程
Nov 17 Redis
Redis命令处理过程源码解析
Feb 12 Redis
面试分析分布式架构Redis热点key大Value解决方案
Mar 13 Redis
Redis 的查询很快的原因解析及Redis 如何保证查询的高效
Mar 16 Redis
sentinel支持的redis高可用集群配置详解
Apr 01 Redis
redis复制有可能碰到的问题汇总
Apr 03 Redis
Redis实现一个账号只能登录一个设备
Apr 19 Redis
Redis如何使用乐观锁(CAS)保证数据一致性
Mar 25 #Redis
Redis 操作多个数据库的配置的方法实现
Mar 23 #Redis
Redis安装使用RedisJSON模块的方法
Mar 23 #Redis
解决redis批量删除key值的问题
Mar 23 #Redis
源码分析Redis中 set 和 sorted set 的使用方法
Redis监控工具RedisInsight安装与使用
在Centos 8.0中安装Redis服务器的教程详解
You might like
Terran兵种介绍
2020/03/14 星际争霸
php xml文件操作实现代码(二)
2009/03/20 PHP
PHP Session_Regenerate_ID函数双释放内存破坏漏洞
2011/01/27 PHP
基于在生产环境中使用php性能测试工具xhprof的详解
2013/06/03 PHP
深入浅析Yii admin的权限控制
2016/08/31 PHP
在phpstudy集成环境下的nginx服务器下配置url重写
2019/12/02 PHP
javascript 操作Word和Excel的实现代码
2009/10/26 Javascript
通过AJAX的JS、JQuery两种方式解析XML示例介绍
2013/09/23 Javascript
JavaScript支持的最大递归调用次数分析
2014/06/24 Javascript
js监听鼠标事件控制textarea输入字符串的个数
2014/09/29 Javascript
javascript实现按回车键切换焦点
2015/02/09 Javascript
jQuery实现可以编辑的表格实例详解【附demo源码下载】
2016/07/09 Javascript
微信小程序 wx:key详细介绍
2016/10/28 Javascript
关于jQuery EasyUI 中刷新Tab选项卡后一个页面变形的解决方法
2017/03/02 Javascript
vue.js中Vue-router 2.0基础实践教程
2017/05/08 Javascript
用js实现before和after伪类的样式修改的示例代码
2017/09/07 Javascript
小程序实现展开/收起的效果示例
2018/09/22 Javascript
解决js相同的正则多次调用test()返回的值却不同的问题
2018/10/10 Javascript
javascript实现前端成语点击验证
2020/06/24 Javascript
python 多进程通信模块的简单实现
2014/02/20 Python
Python中类的定义、继承及使用对象实例详解
2015/04/30 Python
python 创建一个空dataframe 然后添加行数据的实例
2018/06/07 Python
python计算两个地址之间的距离方法
2018/06/09 Python
浅析Python3中的对象垃圾收集机制
2019/06/06 Python
如何使用Flask-Migrate拓展数据库表结构
2019/07/24 Python
python打印n位数“水仙花数”(实例代码)
2019/12/25 Python
基于TensorBoard中graph模块图结构分析
2020/02/15 Python
Python使用QQ邮箱发送邮件实例与QQ邮箱设置详解
2020/02/18 Python
Timex手表官网:美国运动休闲手表品牌
2017/01/28 全球购物
Javascript如何发送一个Ajax请求
2015/01/26 面试题
中式餐厅创业计划书范文
2014/01/23 职场文书
乡镇挂职心得体会
2014/09/04 职场文书
综合测评个人总结
2015/03/03 职场文书
红色经典电影观后感
2015/06/18 职场文书
Redis实现订单自动过期功能的示例代码
2021/05/08 Redis
忘记Grafana不要紧2种Grafana重置admin密码方法详细步骤
2022/04/07 Servers