玩转 Redis 集群之 Sentinel

Redis作为内存数据库,需要具备高可用的特点,不然如果服务器宕机,还在内存里的数据就会丢失。我们最常用的高可用方法就是搭建集群,master机器挂了,可以让slave机器顶上,继续提供服务。但是Redis集群是不会自动进行主从切换的,也就是说,如果主节点非常不争气的在凌晨3点挂了,那么运维同学就要马上起床,把从节点改成主节点,这样的操作是非常繁琐低效的。为此,Redis官方提供了一种解决方案:Redis Sentinel

简介

Redis Sentinel集群通常由3到5个节点组成,如果个别节点挂了,集群还可以正常运作。它负责监控Redis集群的健康情况。如果主节点挂掉,Sentinel集群会通过投票选择一个新的主节点。当原来的主节点恢复时,它会被当做新的主节点的从节点重新加入Redis集群。

基本原理

Sentinel集群通过指定的配置文件发现master,对其进行监控,并且会发送info指令获取master的从节点信息。Sentinel集群中的节点通过向其监控的主从节点发送hello信息(包含Sentinel本身的ip、端口和id等内容)来向其他Sentinel宣告自己的存在。

Sentinel集群通过订阅连接来接收其他Sentinel的hello信息。

Sentinel集群通过ping命令来检查监控的实例状态,如果在指定时间内没有返回,则认为该实例下线。

Sentinel触发failover主从切换后,并不会马上进行,只有指定(quorum)Sentinel授权后,master节点被标记为ODOWN状态。这时才真正开始投票选择新的master。

Sentinel选择新的master的原则是:首先判断优先级,选择优先级较小的;如果优先级相同,查看复制下标,选择复制数据较多的;如果复制下标也相同,就选择进程ID较小的。

Sentinel被授权后,它将会获得宕掉的master的一份最新配置版本号(config-epoch),当failover执行结束以后,这个版本号将会被用于最新的配置,通过广播形式通知其它Sentinel,其它的Sentinel则更新对应master的配置。

基本使用

我们以Python为例,简单说明一下在客户端如何使用Sentinel

1from redis.sentinel import Sentinel
2
3if name == ‘main‘:
4 sentinel = Sentinel([‘localhost‘, 26379], socket_timeout=0.1)
5 print(sentinel.discover_master(‘mymaster‘))
6 print(sentinel.discover_slaves(‘mymaster‘))
7 master = sentinel.master_for(‘mymaster‘, socket_timeout=0.1)
8 slave = sentinel.slave_for(‘mymaster‘, socket_timeout=0.1)
9 master.set(‘follow‘, ‘Jackeyzhe2018‘)
10 follow = slave.get(‘follow‘)
11 print(follow)
master_for和slave_for方法会从连接池中拿出一个连接来使用,如果从地址有多个,则会采用轮询的方法。

当redis发生了主从切换时,客户端如何知道地址已经变更了呢?我们从redis-py的源码里找一找答案。

图片描述(最多50字)

图片描述(最多50字)

可以看到,redis在创建一个新的连接时,会调用get_master_address方法来获取主节点地址。get_master_address方法中,客户端先查询主节点地址,然后与内存中的地址进行比较。如果不一致,则会断开连接,然后使用新的地址重新进行连接。

如果主节点没有挂,而Sentinel主动进行了主从切换,对于这种情况redis-py也做了处理。就是捕获一个ReadOnlyError的异常,然后断开连接,后续指令都需要重新进行连接了。当然,如果没有修改性指令,那么连接就不会切换,不过数据也不会被破坏,所以影响不大。

动手搭建

关于Sentinel的工作原理和使用方法我们已经有了大概的认识,为了加深理解,我们来自己动手搭建一套Sentinel集群。

首先搭建我们我需要的redis集群环境

安装好redis后,将redis目录下的配置文件redis.conf复制3份。分别命名为redis6379.conf,redis6380.conf,redis6381.conf。

在redis6381.conf文件中修改以下几项

1bind 127.0.0.1
2port 6381
3logfile "6381.log"
4dbfilename "dump-6381.rdb"
在redis6379.conf中修改

1bind 127.0.0.1
2port 6379
3logfile "6379.log"
4dbfilename "dump-6379.rdb"
5slaveof 127.0.0.1 6381
redis6380.conf的修改参照redis6379.conf。修改完成后,分别启动三个实例。就搭建好了我们想要的redis主从环境了。

图片描述(最多50字)

我们连接上master节点,可以看到它的主从配置信息

图片描述(最多50字)

接着,我们来配置Sentinel集群。这里我们同样配置三个实例。复制3份sentinel.conf文件,分别命名为sentinel-26379.conf,sentinel-26380.conf和sentinel-26381.conf。

sentinel-26379.conf文件中编辑以下内容

1port 26379
2daemonize yes
3logfile "26379.log"
4dir /home/xxx/redis/data
5sentinel monitor mymaster 127.0.0.1 6381 2
6sentinel down-after-milliseconds mymaster 30000
7sentinel parallel-syncs mymaster 1
8sentinel failover-timeout mymaster 180000
sentinel-26380.conf和sentinel-26381.conf的内容与上述类似。配置好后,我们使用命令redis-sentinel来启动3个sentinel实例。

图片描述(最多50字)

此时,我们用redis-cli命令连接26379的实例,查看sentinel的信息。

图片描述(最多50字)

发现它已经开始监控我们的3个redis节点了。这时我们的整个集群就部署好了,接下来测试一下。

kill掉master节点,查看sentinel的日志,会发现sentinel已经按照我们前面说的步骤选择了新的master。

图片描述(最多50字)

此时再来看sentinel信息。

此时,6380已经成了新的master。

恭喜你,以后都不需要在凌晨起床切换Redis主从实例了。

原文地址:http://blog.51cto.com/14028890/2314217

时间: 2024-11-14 12:10:39

玩转 Redis 集群之 Sentinel的相关文章

支撑微博亿级社交平台,小白也能玩转Redis集群(原理篇)

Redis作为一款性能优异的内存数据库,支撑着微博亿级社交平台,也成为很多互联网公司的标配.这里将以Redis Cluster集群为核心,基于最新的Redis5版本,从原理再到实战,玩转Redis集群 常见Redis集群方案 在介绍Redis Cluster集群方案之前,为了方便对比,先简单了解一下业界常见的Redis集群方案: 1 基于客户端分片 Redis Sharding是Redis Cluster出来之前,业界普遍使用的多Redis实例集群方法.其主要思想是基于哈希算法,根据Redis数

redis集群(Sentinel)

问题 Redis 主哨兵模式是如何保证高可用的 主要依赖主哨兵的发现故障和故障转移 概述 本文假设读者对redis 的主从复制已经进行了了解 . Redis 主哨兵集群为Redis 提供了高可用,即高可用是猪哨兵模式的主要目的,这是宏观上Sentinel功能的完整列表 Monitoring :监视实例的情况 Notification : 通知 Automatic failover : 当Master异常下线后,自动会通过选举 Configuration provider : 提供配置信息. 注意

redis集群之Sentinel

目前我们讲的 Redis 还只是主从方案,最终一致性.读者们可思考过,如果主节点凌晨3 点突发宕机怎么办?就坐等运维从床上爬起来,然后手工进行从主切换,再通知所有的程序把地址统统改一遍重新上线么?毫无疑问,这样的人工运维效率太低,事故发生时估计得至少 1 个小时才能缓过来.如果是一个大型公司,这样的事故足以上新闻了. 所以我们必须有一个高可用方案来抵抗节点故障,当故障发生时可以自动进行从主切换,程序可以不用重启,运维可以继续睡大觉,仿佛什么事也没发生一样.Redis 官方提供了这样一种方案 ——

Redis集群 之 Sentinel模式Windows篇

1.环境 a.下载Redis:访问 https://github.com/MicrosoftArchive/redis/releases 下载Windows版Redis,并解压 2.哨兵模式配置 a.复制3份Redis作为3个节点,分别命名为8081.8082.8083 b.修改 Redis 各节点中的 redis.windows.conf 配置文件 1)8081节点: #端口号改为8081 port 8081 2)8082节点: #端口号改为8082 port 8082 #设置该slave的m

Redis集群redis主从自动切换Sentinel(哨兵模式)

Redis SentinelSentinel(哨兵)是用于监控redis集群中Master状态的工具,其已经被集成在redis2.4+的版本中 一.Sentinel作用:1):Master状态检测 2):如果Master异常,则会进行Master-Slave切换,将其中一个Slave作为Master,将之前的Master作为Slave3):Master-Slave切换后,master_redis.conf.slave_redis.conf和sentinel.conf的内容都会发生改变,即mast

redis 集群热备自动切换sentinel配置实战

Redis SentinelSentinel(哨兵)是用于监控redis集群中Master状态的工具,其已经被集成在redis2.4+的版本中 一.Sentinel作用:1):Master状态检测 2):如果Master异常,则会进行Master-Slave切换,将其中一个Slave作为Master,将之前的Master作为Slave3):Master-Slave切换后,master_redis.conf.slave_redis.conf和sentinel.conf的内容都会发生改变,即mast

基于Redis Sentinel的Redis集群(主从&Sharding)高可用方案

基于Redis Sentinel的Redis集群(主从&Sharding)高可用方案 http://www.tuicool.com/articles/naeEJbv 基于Redis Sentinel的Redis集群(主从&Sharding)高可用方案 时间 2014-02-21 15:15:17  IT社区推荐资讯 原文  http://itindex.net/detail/48192-redis-sentinel-redis Redis Sentinel是一个分布式系统,可以部署多个Se

基于Redis Sentinel的Redis集群(主从Sharding)高可用方案(转)

本文主要介绍一种通过Jedis&Sentinel实现Redis集群高可用方案,该方案需要使用Jedis2.2.2及以上版本(强制),Redis2.8及以上版本(可选,Sentinel最早出现在Redis2.4中,Redis2.8中Sentinel更加稳定),Redis集群是以分片(Sharding)加主从的方式搭建,满足可扩展性的要求: Redis Sentinel介绍 Redis Sentinel是Redis官方提供的集群管理工具,主要有三大功能: 监控,能持续监控Redis的主从实例是否正常

02.Redis主从集群的Sentinel配置

阅读目录 开始 1.集群环境 2.配置并启动Redis主从集群 3.配置sentinel集群并启动 4.测试sentinel集群 回到顶部 1.集群环境 1.Linux服务器列表 使用4台CentOS Linux服务器搭建环境,其IP地址如下: 192.168.110.100192.168.110.101192.168.110.102192.168.110.103 2.Redis服务部署环境 192.168.110.100    启动多个Redis sentinel服务,构成Redis sent