哨兵简介

一定要有一个概念:哨兵实例也是特殊的Redis实例,也就是哨兵实例是独立的进程,多个哨兵实例可以搭建主从(Master-Slave),它们承担的职责和普通的Redis实例不一样。下面是官方文档中对哨兵的介绍:

Redis哨兵为Redis提供了高可用性,意味着可以使用哨兵创建Redis服务部署,该部署可以在无需人工干预的情况下抵御某些类型的故障。Redis哨兵还提供其他功能,如监视、通知,并且为客户端提供配置入口(acts as a configuration provider for clients)。下面是Redis哨兵提供的完整功能列表:

  • 监控(Monitoring):Sentinel会不断检查Master实例和Slave实例是否按预期工作。
  • 通知(Notification):Sentinel可以通过API进行通知受监控的Redis实例出现问题。
  • 自动故障转移(Automatic Failover):如果Master实例未按预期工作,则Sentinel可以启动故障转移程序,在该过程中,会将一个Slave实例提升为Master实例,将其他Slave实例重新配置为使用新的Master实例,并且会通知使用Redis实例的应用程序获取新的地址、连接信息。
  • 提供配置入口(Configuration provider):Sentinel充当客户端服务发现的授权来源(a source of authority):客户端连接到Sentinel,可以询问Redis服务群中的Master实例的地址。如果发生故障转移,Sentinel将通知客户端新的Master实例的地址。

Sentinel的分布式性质

Redis Sentinel是一个分布式系统,Sentinel采用同一份配置多个Sentinel进程共同协作运行的设计,多Sentinel进程协作的优势如下:

  • 多个Sentinel实例就给定的主机不再可用这一事实达成共识时,将执行故障检测,从而降低了误报的可能性。
  • Sentinel群中即使不是所有Sentinel处于可用状态,Sentinel群仍然能够正常工作,进行故障转移。

哨兵搭建

当前的Redis哨兵版本称为哨兵2,哨兵版本1是Redis 2.6的时候引入,现在已经过期,不推荐使用。官方文档中部署哨兵的示例中指出:一个健壮的部署至少需要三个Sentinel实例。再加上一般情况下,普通的Redis服务实例为了保证健壮性需要搭建树状主从,至少建议部署三个实例。这里的部署拓扑图如下:

 

环境配置

按照部署拓扑图,一共部署6个Redis实例,3个普通的Redis实例组成Master-Slave,并且是树状主从,3个Redis哨兵实例。为了简单起见,6个Redis实例部署在同一个虚拟机中,注意在生产或者测试环境要分散机器部署,避免所有鸡蛋放在同一个篮子出现机器单点故障。具体信息如下:

实例标识

角色

主机IP

端口

备注

Sentinel-1

-

192.168.56.200

26379

-

Sentinel-2

-

192.168.56.200

26380

-

Sentinel-3

-

192.168.56.200

26381

-

Redis-1

Master

192.168.56.200

6380

-

Redis-11

Slave

192.168.56.200

6381

Redis-1的从节点

Redis-111

Slave

192.168.56.200

6382

Redis-11的从节点

Sentinel配置和配置文件创建

先看样板配置文件sentinel.conf的内容:

port 26379
daemonize no
pidfile /var/run/redis-sentinel.pid
logfile ""
dir /tmp
sentinel monitor mymaster 127.0.0.1 6379 2
sentinel down-after-milliseconds mymaster 30000
sentinel parallel-syncs mymaster 1
sentinel failover-timeout mymaster 180000
sentinel deny-scripts-reconfig yes
# sentinel auth-pass mymaster 123456
# bind 127.0.0.1
# ......

完整的配置属性列表比较少,而portdaemonizepidfilelogfiledirbind等属性上一篇文章已经分析过,这里不再复述。

sentinel monitor <master-group-name> <ip> <port> <quorum>

  • master-group-name:被监控的目标Master实例的名称,这个值可以自定义。
  • ip:被监控的目标Master实例的服务器地址。
  • port:被监控的目标Master实例的端口。
  • quorum:仲裁参数,设置需要多少个Sentinel实例同意才能判断一个被监控的Redis实例失效。换言之,一个 Sentinel群需要获得系统中多数Sentinel的支持, 才能发起一次自动故障迁移。如果我们使用3个Sentinel实例,那么这个值可以定义为2。

sentinel monitor配置项比较特殊,主要用来指定Master角色Redis服务的链接信息。其他5个配置项采用下面的格式:

sentinel <option_name> <master-group-name> <option_value>
  • down-after-milliseconds:定了Sentinel认为被监控的Redis服务已经断线的总毫秒数。如果在指定的毫秒数之内,被监控的Redis服务没有向Sentinel回复PING信息或者回复了Error信息,那么Sentinel会开始认为被监控的Redis服务下线(其实这里是主观下线(subjectively down,简称SDOWN)。
  • parallel-syncs:指定了在执行故障转移时,最多可以有多少Slave实例同时对新的Master实例进行同步,这个数字越小,完成故障转移所需的时间就越长。这里建议参考样板配置中的值,设置为1。
  • failover-timeout:故障转移超时时间,单位为毫秒。
  • deny-scripts-reconfig:是否禁用SENTINEL SET命令运行时修改notification-scriptclient-reconfig-script,默认值为yes
  • auth-pass:配置连接Master实例的认证密码,如果Master实例没有设置密码,可以不配置此项属性。

创建3份Sentinel配置文件26379.conf26380.conf26381.conf,它们的内容十分相似,这里只列出26379.conf的内容(192.168.56.200是笔者虚拟机的主机地址):

port 26379
daemonize yes
bind 0.0.0.0
protected-mode no
pidfile /var/run/sentinel-26379.pid
logfile "/data/redis/sentinel-26379.log"
dir /data/redis
sentinel monitor doge-master 192.168.56.200 6380 2
sentinel down-after-milliseconds doge-master 30000
sentinel parallel-syncs doge-master 1
sentinel failover-timeout doge-master 180000

另外,创建3份Redis服务的配置文件6380.conf6381.conf6382.conf,它们的内容十分相似,这里只列出6380.conf(主节点)的内容:

port 6380
daemonize yes
bind 0.0.0.0
protected-mode no
pidfile /var/run/redis-6380.pid
logfile "/data/redis/redis-6380.log"
dir /data/redis
dbfilename "dump-6380.rdb"

6381.conf(从节点)尾部添加额外配置:

slaveof 192.168.56.200 6380

6382.conf(从节点)尾部添加额外配置:

slaveof 192.168.56.200 6381

每份配置记得替换好对应的端口号,都准备好了之后,依次启动主节点、两个从节点和3个Sentinel(可以把命令写成一个start.sh,调用sh start.sh):

/data/redis/redis-5.0.5/src/redis-server /data/redis/6380.conf
/data/redis/redis-5.0.5/src/redis-server /data/redis/6381.conf
/data/redis/redis-5.0.5/src/redis-server /data/redis/6382.conf /data/redis/redis-5.0.5/src/redis-sentinel /data/redis/26379.conf
/data/redis/redis-5.0.5/src/redis-sentinel /data/redis/26380.conf
/data/redis/redis-5.0.5/src/redis-sentinel /data/redis/26381.conf
 

此时查看哨兵的配置,发现被Redis修改,新增了发现的主从信息和哨兵实例信息:

 

查看一下哨兵实例的日志:

 

目前哨兵和Redis服务都正常运作。

模拟故障转移

官方文档中建议使用测试命令让Redis实例Sleep一个时间,从而触发故障转移:

redis-cli -p [port] DEBUG sleep 30

先查看当前的Master实例:

[root@localhost ~]# redis-cli -p 26379
127.0.0.1:26379> SENTINEL get-master-addr-by-name doge-master
1) "127.0.0.1"
2) "6380"

再对Master实例执行Sleep命令:

redis-cli -p 6380 DEBUG sleep 40

该命令会阻塞直到40秒后,控制台释放后,再查看当前的Master实例:

127.0.0.1:26379> SENTINEL get-master-addr-by-name doge-master
1) "127.0.0.1"
2) "6381"
127.0.0.1:26379>

可见,已经成功切换Master实例为6381。那么,当前的Master-Slave的拓扑关系到底是怎么样的?这个时候先看一下Sentinel的日志:

 

这里可以看出了,恢复后的6380实例重新成为了Slave角色,感觉有点翻车了,原来的树状主从部署变回了一主多从,笔者开始不相信,于是从当前的Master实例查看了一下主从信息:

 

确实如此,再检查了一下旧的主节点6380的配置:

port 6380
daemonize yes
bind 0.0.0.0
protected-mode no
pidfile "/var/run/redis-6380.pid"
logfile "/data/redis/redis-6380.log"
dir "/data/redis"
dbfilename "dump-6380.rdb"
# Generated by CONFIG REWRITE
replicaof 192.168.56.200 6381

发现,最后一行被新增了内容,它成为了从节点。这一点如果不实践,恐怕不知道会衍生出这种结果。画了个图表明一下整个过程:

 

这个问题暂时不深入探究,目前知道结果如此即可。

客户端代码测试

既然哨兵搭建完了,可以用Java客户端连接进行一些简单的操作。使用的是Lettuce驱动:

<dependency>
<groupId>io.lettuce</groupId>
<artifactId>lettuce-core</artifactId>
<version>5.1.8.RELEASE</version>
</dependency>

测试代码:

@Test
public void testSentinel() throws Exception {
RedisURI uri = RedisURI.builder()
.withSentinelMasterId("doge-master")
.withSentinel("192.168.56.200", 26379)
.build();
RedisClient redisClient = RedisClient.create(uri);
StatefulRedisMasterSlaveConnection<String, String> connection = MasterSlave.connect(redisClient, new Utf8StringCodec(), uri);
connection.setReadFrom(ReadFrom.SLAVE_PREFERRED);
RedisCommands<String, String> commands = connection.sync();
String result = commands.ping();
log.info("PING:{}", result);
commands.setex("name", 5, "throwable");
result = commands.get("name");
log.info("Get value:{}", result);
connection.close();
redisClient.shutdown();
}

输出结果:

PING:PONG
Get value:throwable

小结

Redis哨兵搭建相对简单,但是需要注意Redis主从配置和Sentinel配置,一些命令可以直接写成shell脚本方便一键shutdown或者重启。在测试故障转移的时候发现了树状主从会变成一主多从,这个问题后面会分析

参考文档: Redis5.x哨兵搭建手记 - 码农教程 (manongjc.com)

liunx下redis的哨兵环境搭建的更多相关文章

  1. 【redis】 linux 下redis 集群环境搭建

    Redis集群 (要让集群正常工作至少需要3个主节点,在这里我们要创建6个redis节点,其中三个为主节点,三个为从节点,对应的redis节点的ip和端口对应关系如下) 127.0.0.1:63791 ...

  2. linux环境(CentOS-6.7)下redis集群的搭建全过程

    linux环境下redis集群的搭建全过程: 使用mount命令将光盘挂载到/mnt/cdrom目录下: [root@hadoop03 ~]# mount -t iso9660 -o ro /dev/ ...

  3. Windows下Lua+Redis 断点调试环境搭建==Linux下类似

    Lua+Redis 断点调试环境搭建 windows环境,使用Redis,写lua脚本头疼的问题之一不能对脚本断点调试,google加上自己的摸索,终于搞定. 1.下载ZeroBraneStudio, ...

  4. Sublime Text 3下C/C++开发环境搭建

    Sublime Text 3下C/C++开发环境搭建 之前在Linux Mint 17一周使用体验中简单介绍过Sublime Text. 1.Sublime Text 3安装 Ubuntu.Linux ...

  5. Redis集群环境搭建

    Redis集群cluster环境搭建 描述:本章节主要单服务器搭建集群,在一个服务器上启动多个不同端口的redis服务,非真实环境. 真实环境下redis集群会搭建在多个物理服务器上,并非单一的服务器 ...

  6. Windows下ELK-5.4.3环境搭建

    Windows下ELK-5.4.3环境搭建 一.概述 ELK官网 https://www.elastic.co ELK由Elasticsearch.Logstash和Kibana三部分组件组成: El ...

  7. Redis进阶:Redis的哨兵模式搭建

    Redis进阶:Redis的哨兵模式搭建 哨兵机制介绍 单机版的Redis存在性能瓶颈,Redis通过提高主从复制实现读写分离,提高了了Redis的可用性,另一方便也能实现数据在多个Redis直接的备 ...

  8. Redis集群环境搭建实践

    0 Redis集群简介 Redis集群(Redis Cluster)是Redis提供的分布式数据库方案,通过分片(sharding)来进行数据共享,并提供复制和故障转移功能.相比于主从复制.哨兵模式, ...

  9. [转]MonkeyRunner在Windows下的Eclipse开发环境搭建步骤(兼解决网上Jython配置出错的问题)

    MonkeyRunner在Windows下的Eclipse开发环境搭建步骤(兼解决网上Jython配置出错的问题)   网上有一篇shangdong_chu网友写的文章介绍如何在Eclipse上配置M ...

  10. 转:Windows下的PHP开发环境搭建——PHP线程安全与非线程安全、Apache版本选择,及详解五种运行模式。

    原文来自于:http://www.ituring.com.cn/article/128439 Windows下的PHP开发环境搭建——PHP线程安全与非线程安全.Apache版本选择,及详解五种运行模 ...

随机推荐

  1. Matplotlib绘图设置---颜色条设置

    设置颜色条 对于图形中由彩色的点.线.面构成的连续标签,用颜色条来表示的效果比较好,在Matplotlib中,颜色条是一个独立的坐标轴. 可视图形的颜色选择可参考matplotlib配色方案. Cho ...

  2. Qt:Qt自适应高分辨率屏幕

    现在的电脑分辨率越来越高,DPI也越来越大,使用Qt创建出来的界面,在小分辨率电脑上显示的很好,但是在大分辨率电脑上显示异常,感觉边框被压缩了,看起来很不协调. 从Qt 5.6 还是从Qt 5.14 ...

  3. IE8发送ajax请求无效

    IE是个非常有个性的浏览器,常规的东西在他这个都不太好使. 最开始发送ajax请求,总是不成功,也没啥报错,反正就是请求被忽略了 然后我就考虑用原生的JS来实现,然后就:哎呀  可以了...... x ...

  4. consul:啥?我被优化没了?AgileConfig+Yarp替代Ocelot+Consul实现服务发现和自动网关配置

    现在软件就业环境不景气,各行各业都忙着裁员优化.作为一个小开发,咱也不能光等着别人来优化咱,也得想办法优化下自己.就拿手头上的工作来说吧,我发现我的微服务应用里,既有AgileConfig这个日志组件 ...

  5. MRBS(Meeting Room Booking System)开源的会议室预订系统搭建使用

    前一家公司所有的办公系统都是自己开发的,包括排班.工单.会议室预定等等,很方便. 目前所在的公司,每周部门例会找行政预订了会议室,但多次去都被人占了,很烦,于是网上找了一个评价不错的系统,python ...

  6. P7177 [COCI2014-2015#4] MRAVI 题解

    思路. 我们知道最初添加的液体越多,那么每个蚂蚁得到的液体也就越多,又因为标签里有深搜,所以可以用 DFS+二分解决(感觉说了一通废话),算是比较常规的一种解法了. 在此题中我们需要魔改一下建树,需在 ...

  7. node统计指定文件夹内代码行数

    1. 来源 想对于自己接触前端日常学习与思考的代码行数进行一个统计,看自己大约敲了多少代码 2.代码 const fs = require('fs') const path = require('pa ...

  8. 【Oracle】在PL/SQL中使用sql实现插入排序

    [Oracle]在PL/SQL中使用sql实现插入排序 一般来说,SQL要排序的话直接使用order by即可 不一般来说,就是瞎搞,正好也可以巩固自己的数据结构基础,主要也发现没有人用SQL去实现这 ...

  9. 力扣1107(MySQL)-每日新用户统计(中等)

    题目: Traffic 表: 该表没有主键,它可能有重复的行.activity 列是 ENUM 类型,可能取 ('login', 'logout', 'jobs', 'groups', 'homepa ...

  10. 力扣50(java)-Pow(x,n)(中等)

    题目: 实现 pow(x, n) ,即计算 x 的整数 n 次幂函数(即xn ). 示例 1: 输入:x = 2.00000, n = 10输出:1024.00000示例 2: 输入:x = 2.10 ...