Redis 高可用实践

Sentinel 简介

如上图所示,Redis 高可用是通过Sentinel来实现的,是Redis官方推荐的高可用性(HA)解决方案,Sentinel英文含义是哨兵,放哨的,可以理解为它是Redis集群的监控者,监控着所有的masterslave机器的健康状况。首先我们来看下它提供了哪些功能。

1.监控(Monitoring):
监控所有主从机的健康状态,当主从机连接出现问题时,会自动变更有问题机器的状态。
2.通知(Notification):
一旦集群的节点有问题,Sentinel可以通过API来通知系统管理员或者其他的应用程序。
3.自动执行故障转移(Automatic failover):
如果某个主节点挂掉,Sentinel会自动踢掉这个主节点,并且从它的从节点中选举一个出来做主节点,其他的从节点也会把这个从节点作为主节点。而且Sentinel还会持续监控挂掉的主节点,一旦发现活过来了,再次把它加入集群中的一个从节点。
4.作为一个配置提供者(Configuration provider):
Sentinel充当客户端服务发现的权威来源:客户端连接到Sentinels以请求负责给定服务的当前Redis主服务器的地址。 如果发生故障转移,Sentinels将报告新地址。

Sentinel是如何实现的?

Sentinel并不是一个新东西,它本质上只是一个运行在特殊模式下的Redis服务器,怎么个特殊法?比如它不支持很多的键值命令,因为它不是用来做存储的,它是用来管理集群的啊。Sentinel最核心的工作时记录集群节点的信息,比如每个节点的健康状态,以及某个节点故障后,剔除掉坏的机器。

Sentinel 支持哪些集群模式

Sentinel可以监视任意多个主服务器以及这些主服务下的从服务器,因此在集群中你可以一主多从,多主多从。
像这样:

Sentinel也支持多个Sentinel集群,几个Sentinel共同监控一个集群,像这样:

此时,多个Sentinel会进行相互通信来进行管理集群,比如要对故障节点进行下线,那必须经过多个(可配置)Sentinel同意才能执行下线,或者选举新的主服务器时,多个Sentinel也要相互协商。

多个Sentinel是官方推荐的,因为单个Sentinel也会有单点故障的问题,万一这个Sentinel挂掉了咋办?

上手Sentinel

安装

Sentinel是随redis安装的,无需再进行额外安装。如果你已经安装了Redis,可以看下Sentinel的版本

1
redis-sentinel -v

配置

Sentinel包含了一个名为sentinel.conf的配置文件,运行一个 Sentinel 所需的最少配置如下所示:

12345678910111213
//监视哪个主服务器,2代表执行故障时执行故障转移至少要两个` sentinel'`同意。sentinel monitor mymaster 127.0.0.1 6379 2//指定了 Sentinel 主观认为服务器已经断线所需的毫秒数。sentinel down-after-milliseconds mymaster 60000sentinel failover-timeout mymaster 180000//sentinel parallel-syncs mymaster 1

//..继续增加,监视多个服务器sentinel monitor resque 192.168.1.3 6380 4sentinel down-after-milliseconds resque 10000sentinel failover-timeout resque 180000sentinel parallel-syncs resque 5

failover-timeout: sentinel集群都遵守一个规则:如果sentinel A推荐sentinel B去执行failover,B会等待一段时间后,自行再次去对同一个master执行failover,这个等待的时间是通过failover-timeout配置项去配置的。从这个规则可以看出,sentinel集群中的sentinel不会再同一时刻并发去failover同一个master,第一个进行failover的sentinel如果失败了,另外一个将会在一定时间内进行重新进行failover,以此类推。
parallel-syncs:在发生failover主备切换时,这个选项指定了最多可以有多少个slave同时对新的master进行同步,这个数字越小,完成failover所需的时间就越长,但是如果这个数字越大,就意味着越多的slave因为replication而不可用。可以通过将这个值设为 1 来保证每次只有一个slave处于不能处理命令请求的状态。

启动

启动命令如下,配置文件参数是强制性的,必须要,因为sentinel会使用配置文件保存当前状态,在运行中,配置文件会根据系统状态动态更改,启动时也会重新加载。

1
redis-sentinel  /usr/local/etc/redis/sentinel.conf

另外,sentinel默认使用的端口是26379,可以使用redis客户端进行连接,如果是本地安装的话,命令如下:

1
redis-cli -h 127.0.0.1 -p 26379

Sentinel API

使用 Docker-compose 搭建 Sentinel 集群

借助 Docker-compose ,我们 可以轻松的搭建一个集群环境,docker-compose.yml配置如下:

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465
version: '3'services:  redis-master1:    image: redis    container_name: redis-master1    volumes:       - "/Users/jarviszhao/docker/redis/conf/:/usr/local/etc/redis/"    ports:      - "6382:6379"    command: redis-server /usr/local/etc/redis/redis-master1.conf

  redis-slave1:    image: redis    container_name: redis-slave1    volumes:       - "/Users/jarviszhao/docker/redis/conf:/usr/local/etc/redis/"    ports:      - "6380:6379"    command: redis-server /usr/local/etc/redis/redis-slave1.conf --slaveof redis-master1 6379    links:      - redis-master1

  redis-slave2:    image: redis    container_name: redis-slave2    volumes:       - "/Users/jarviszhao/docker/redis/conf:/usr/local/etc/redis/"    ports:      - "6381:6379"    command: redis-server /usr/local/etc/redis/redis-slave2.conf --slaveof redis-master1 6379    links:      - redis-master1

  redis-sentinel1:    image: redis    container_name: redis-sentinel1    volumes:       - "/Users/jarviszhao/docker/redis/conf:/usr/local/etc/redis/"    ports:      - "26383:26379"    command: redis-sentinel /usr/local/etc/redis/sentinel1.conf    links:      - redis-master1

  redis-sentinel2:    image: redis    container_name: redis-sentinel2    volumes:       - "/Users/jarviszhao/docker/redis/conf:/usr/local/etc/redis/"    ports:      - "26384:26379"    command: redis-sentinel /usr/local/etc/redis/sentinel2.conf    links:      - redis-master1

  redis-sentinel3:    image: redis    container_name: redis-sentinel3    volumes:       - "/Users/jarviszhao/docker/redis/conf:/usr/local/etc/redis/"    ports:      - "26385:26379"    command: redis-sentinel /usr/local/etc/redis/sentinel3.conf    links:      - redis-master1

集群中包含三个Sentinel,一个master和两个salve。可以使用docker pause命令来中断master的进程,观察是否执行了故障转移。代码见Github 仓库

Sentinel 详细内部机制

主观下线和客观下线

主观下线
sentinel会向master发送心跳PING来确认master是否存活,如果master在“一定时间范围”内不回应PONG 或者是回复了一个错误消息,那么这个sentinel会主观地(单方面地)认为这个master已经不可用了(subjectively down, 也简称为SDOWN)。而配置项down-after-milliseconds就是用来指定这个“一定时间范围”的,单位是毫秒。

客观下线
sentinel会向集群中的其他sentinel询问故障的master的状态,当也认为master已经下线的sentinel超过配置数量时,sentinel会认为该master当前状态是客观下线(ODOWN)。ODOWN需要一定数量的sentinel达成一致意见才能认为一个master客观上已经宕掉,各个sentinel之间通过命令SENTINEL is_master_down_by_addr来获得其它sentinel对master的检测结果。
如果之后master可用了,这个状态就会相应地被清理掉。
ODOWN状态只适用于master,对于不是master的redis节点sentinel之间不需要任何协商,slaves和sentinel不会有ODOWN状态。

Sentinel 与 master ,salve 之间是如何通信的?

Sentinelmastersalve之间有两个异步网络连接。

  1. 一是命令连接,专门向服务器发送命令,并接受命令回复。
  2. 二是订阅连接,专门订阅主服务的__sentinel_hello__频道。

Sentinel会以每10秒一次的频率向主从服务器发送info命令,来获取主从服务器的信息,以及新加入集群其他的sentinel。Sentinel内部保存着其他Sentinel的信息,如果其他Sentinel有更新,此时保存的信息也会更新。

如何执行失效转移?

当一个主服务被判断为客观下线时,监视这个下线服务器的各个Sentinel会进行协商,选举出个领头Sentinel来执行失效转移。使用 Raft 算法来选出领头Sentinel。确保在一个给定的纪元(epoch)里, 只有一个领头产生。
关于raft 算法(也是zookeeper的核心算法)
http://www.jdon.com/artichect/raft.html

参考

01.Redis Sentinel 官方文档
02.Redis主从集群的Sentinel配置
03.使用Docker Compose部署基于Sentinel的高可用Redis集群
04.Redis 高可用(1)——Sentinel 篇
Redis Sentinel机制与用法(一)

原文:大专栏  Redis 高可用实践

原文地址:https://www.cnblogs.com/wangziqiang123/p/11618295.html

时间: 2024-10-08 20:47:00

Redis 高可用实践的相关文章

搭建一个redis高可用系统

一.单个实例 当系统中只有一台redis运行时,一旦该redis挂了,会导致整个系统无法运行. 单个实例 二.备份 由于单台redis出现单点故障,就会导致整个系统不可用,所以想到的办法自然就是备份(一般工业界认为比较安全的备份数应该是3份).当一台redis出现问题了,另一台redis可以继续提供服务. 备份 三.自动故障转移 虽然上面redis做了备份,看上去很完美.但由于redis目前只支持主从复制备份(不支持主主复制),当主redis挂了,从redis只能提供读服务,无法提供写服务.所以

Redis高可用详解:持久化技术及方案选择

Redis高可用详解:持久化技术及方案选择 Java架构师那些事 关注 0.3 2018.08.23 22:55 字数 9774 阅读 542评论 0喜欢 9 前言 本文将先说明上述几种技术分别解决了Redis高可用的什么问题,然后详细介绍Redis的持久化技术,主要是RDB和AOF两种持久化方案.在介绍RDB和AOF方案时,不仅介绍其作用及操作方法,同时还会介绍持久化实现的一些原理细节及需要注意的问题.最后,介绍在实际使用中持久化方案的选择以及经常遇到的问题等内容. 一.Redis高可用概述

Keepalived+Redis高可用部署(第二版)

更新 20150625 脚本由5个减少为4个,sh脚本指令做了精简. 修改了另外3个脚本,在日志里增加了日期显示. 新增redis数据类型,持久化,主从同步简介. 新增hiredis简介. 新增c语言客户端测试. Redis简介及安装 Redis是一个开源,先进的key-value存储,用于构建高性能,可扩展的Web应用程序的完美解决方案. Redis从它的许多竞争继承来的三个主要特点: Redis数据库完全在内存中,使用磁盘仅用于持久性. 相比许多键值数据存储,Redis拥有一套较为丰富的数据

利用redis-sentinel+consul实现redis高可用

在前文<利用redis-sentinel+keepalived实现redis高可用>详细描述了利用redis-sentinel+keepalived实现redis高可用的方案.本文中redis-sentinel的应用场景也是一样的,也是提供Redis单实例服务,当某Redis(master)服务意外停掉或该服务所在的主机发生宕机故障或网络故障时,另一台Redis服务会由slave自动成为master,提供Redis读写服务.redis-sentinel的配置可以参考前文,本文略去,只讨论con

利用redis-sentinel+keepalived实现redis高可用

目标.需求: 为上层应用提供高可靠.低延迟.低(无限接近0)数据损失的Redis缓存服务 方案概述: 采用同一网络内的三台主机(可以是物理主机.虚拟机或docker容器),要求三台主机之间都能相互访问,每一台主机上都安装redis-server.redis-sentinel和keepalived. redis-server负责提供Redis缓存服务,三台主机间的关系是master-slave-slave redis-sentinel负责提供Redis高可用,三台主机间的关系与redis-serv

Redis高可用部署及监控

Redis高可用部署及监控 目录                        一.Redis Sentinel简介 二.硬件需求 三.拓扑结构 1.单M-S结构 2.双M-S结构 3.优劣对比 四.配置部署 1.Redis配置 2.Redis Sentinel配置 3.启动服务 4.故障模拟检测 五.备份恢复 1.备份策略 2.灾难恢复 六.运维监控 1.安全监控 2.性能监控   一.           Redis Sentinel简介   Redis Sentinel是redis自带的集

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

3台服务器Redis高可用哨兵模式 学习 redis 高可用 3台服务器Redis高可用哨兵模式 3.1 主redis配置 3.2 从redis配置 1. 介绍 2. redis程序安装 3. 哨兵模式配置 3.3 启动redis和哨兵 4. 总结 1. 介绍 Redis 的 Sentinel 系统用于管理多个 Redis 服务器(instance), 该系统执行以下三个任务: 监控(Monitoring): Sentinel 会不断地检查你的主服务器和从服务器是否运作正常. 提醒(Notifi

CentOS下Redis高可用安装笔记

(WJW)Redis高可用安装笔记 [x] 安装环境介绍: Master: T1 Slave: T2 VIP: 192.168.68.45 [x] 安装Redis(Master,Slave) 注意: 安装redis前flushall的修改 查找src/redis.c文件,把 `{"flushdb",flushdbCommand,1,"w",0,NULL,0,0,0,0,0},` `{"flushall",flushallCommand,1,&qu

利用lvs keepalived配置redis高可用及负载均衡

需求 我们用ES做日志服务,架构是 上游数据来源=>redis=>logstash=>ES redis目前还是单点, 没有做高可用, 现在数据量越来越多, 如果下游消费不出问题还好, redis里面数据来了就走,但是下游一旦出问题, 分给redis的内存半小时就撑满了. 看到redis3.0 beta版本已经提供了集群功能, 但是需要client以集群模式接入, 我们这么多上游用户, 不太可能统一要求他们改造. 公司也有硬件的LB, 同事在E公司的时候就是用的硬件LB. 但接入还要申请,