什么是redis sentinel

参考文档:https://redis.io/topics/sentinel

简单的来说,就是Redis Sentinel 为redis 提供高可用性,主要体现在下面几个方面:
1.监控:redis sentinel会不间断的监控主服务器和从服务器是否正常工作
2.通知:当出现问题时,sentinel可以通过API通知系统管理员以及另外的服务器
3.自动故障转移:如果主服务器出现故障,sentinel可以启动故障转移,将其中一台从服务器升级为主服务器,其他的从服务器会重新配置为新主服务器 4.提供配置:sentinel充当客户端发现权限来源,客户端连接到sentinel询问负责给定服务器当前redis主服务器地址,如果发生故障,sentinel将报告新地址

redis sentinel 模拟环境

模拟环境为:1主2从

========redis=================sentinel==========

master:127.0.0.1 6379       127.0.0.1 26379
slave1:127.0.0.1 6380       127.0.0.1 26380
slave2:127.0.0.1 6381       127.0.0.1 26381

环境搭建

redis.conf配置

6379

# .conf | grep -Ev "^$|^#"
bind 127.0.0.1
port
daemonize yes
pidfile /var/run/redis_6379.pid
logfile "/root/redis/redis-6379.log"
dbfilename dump-.rdb
dir /root/redis
...
#

6380

# .conf | grep -Ev "^$|^#"
bind 127.0.0.1
port
daemonize yes
pidfile /var/run/redis_6380.pid
logfile "/root/redis/redis-6380.log"
dbfilename dump-.rdb
dir /root/redis
...
#

6381

# .conf | grep -Ev "^$|^#"
bind 127.0.0.1
port
daemonize yes
pidfile /var/run/redis_6381.pid
logfile "/root/redis/redis-6381.log"
dbfilename dump-.rdb
dir /root/redis
...
#

sentinel.conf配置

6379/6380/6381

# cat sentinel-*.conf | grep -Ev "^#|^$"
port
daemonize yes
logfile "/root/redis/sentinel-6379.log"
dir "/tmp"
sentinel monitor mymaster
sentinel down-after-milliseconds mymaster
sentinel parallel-syncs mymaster
sentinel failover-timeout mymaster
#

启动redis server 和 sentinel

redis:
# redis-server /etc/redis_6379.conf
# redis-server /etc/redis_6380.conf
# redis-server /etc/redis_6381.conf

sentinel:
# redis-sentinel /etc/sentinel-.conf
# redis-sentinel /etc/sentinel-.conf
# redis-sentinel /etc/sentinel-.conf

配置主从复制

# redis-cli -p
> SLAVEOF
OK
> exit

# redis-cli -p
> SLAVEOF
OK
> exit

模拟故障迁移

首先,kill 掉redis master进程

#  |  $n  ;done;

分析log

首先,redis 从服务器首先发现redis master 服务器无法连接,报错如下:
# *.log
==> redis-.log <==
:S  Nov ::54.235 # Connection with master lost.
:S  Nov ::54.235 * Caching the disconnected master state.

==> redis-.log <==
:S  Nov ::
:S  Nov ::54.466 * MASTER <-> SLAVE sync started
:S  Nov ::54.467 # Error condition on socket for SYNC: Connection refused

==> redis-.log <==
:S  Nov ::
:S  Nov ::54.782 * MASTER <-> SLAVE sync started
:S  Nov ::54.782 # Error condition on socket for SYNC: Connection refused
...
紧接着,redis sentinel 完成故障切换,从log来看,当6379主节点挂了之后,redis重新提了一个从节点6380为主节点,log 如下:
# *.log
==> sentinel-.log <==
:X  Nov ::

==> sentinel-.log <==
:X  Nov ::

==> sentinel-.log <==
:X  Nov ::

==> sentinel-.log <==
:X  Nov :: #quorum /
:X  Nov ::
:X  Nov ::

==> sentinel-.log <==
:X  Nov :: #quorum /
:X  Nov ::
:X  Nov ::

==> sentinel-.log <==
:X  Nov ::

==> sentinel-.log <==
:X  Nov ::

==> sentinel-.log <==
:X  Nov ::

==> sentinel-.log <==
:X  Nov ::

==> sentinel-.log <==
:X  Nov ::
:X  Nov ::

==> sentinel-.log <==
:X  Nov ::

==> sentinel-.log <==
:X  Nov ::

==> sentinel-.log <==
:X  Nov ::
:X  Nov ::
:X  Nov ::  @ mymaster
:X  Nov ::  @ mymaster
:X  Nov ::  @ mymaster
:X  Nov ::  @ mymaster
:X  Nov ::
:X  Nov ::  @ mymaster 

==> sentinel-.log <==
:X  Nov :: @ mymaster
:X  Nov ::
:X  Nov ::  @ mymaster
:X  Nov ::  @ mymaster 

==> sentinel-.log <==
:X  Nov :: @ mymaster
:X  Nov ::
:X  Nov ::  @ mymaster
:X  Nov ::  @ mymaster 

==> sentinel-.log <==
:X  Nov ::
:X  Nov ::  @ mymaster
:X  Nov ::  @ mymaster
:X  Nov ::
:X  Nov ::
:X  Nov ::  @ mymaster
:X  Nov ::  @ mymaster 

==> sentinel-.log <==
:X  Nov ::  @ mymaster 

==> sentinel-.log <==
:X  Nov ::  @ mymaster 

==> sentinel-.log <==
:X  Nov ::  @ mymaster 
再返回过来看redis server的log,此时可以看到6381为从节点已经向主节点6380请求并且完成了复制操作
==> redis-.log <==
:M  Nov :: asks for synchronization
:M  Nov :: accepted. Sending  bytes of backlog starting from offset .

==> redis-.log <==
:S  Nov ::25.823 * Successful partial resynchronization with master.
:S  Nov ::25.823 # Master replication ID changed to 0288d040464ebccbb56dc56d54455434a406bcb2
:S  Nov ::25.823 * MASTER <-> SLAVE sync: Master accepted a Partial Resynchronization.

当我们再启动6379服务器时,sentinel会让6379成为从库并且连接6380服务器,log如下: 

启动6379服务器
# redis-server /root/redis/redis-.conf

# *.log
...
==> sentinel-.log <==
:X  Nov ::  @ mymaster
...

# *.log
...
==> redis-.log <==
:S  Nov :: bytes from master
:S  Nov ::00.566 * MASTER <-> SLAVE sync: Flushing old data
:S  Nov ::00.566 * MASTER <-> SLAVE sync: Loading DB in memory
:S  Nov ::00.566 * MASTER <-> SLAVE sync: Finished with success

==> redis-.log <==
:S  Nov :: changes  seconds. Saving...
:S  Nov ::
:C  Nov ::36.486 * DB saved on disk
:C  Nov :: MB of memory used by copy-on-write
:S  Nov ::36.569 * Background saving terminated with success
...

未完待续。。。

Redis Sentinel 模拟故障迁移的更多相关文章

  1. Redis(九)哨兵:Redis Sentinel

    Redis的主从复制模式下,一旦主节点由于故障不能提供服务,需要人工将从节点晋升为主节点,同时还要通知应用方更新主节点地址,对于很多应用场景这种故障处理的方式是无法接受的. Redis从2.8开始正式 ...

  2. Redis源码阅读(六)集群-故障迁移(下)

    Redis源码阅读(六)集群-故障迁移(下) 最近私人的事情比较多,没有抽出时间来整理博客.书接上文,上一篇里总结了Redis故障迁移的几个关键点,以及Redis中故障检测的实现.本篇主要介绍集群检测 ...

  3. Redis源码阅读(五)集群-故障迁移(上)

    Redis源码阅读(五)集群-故障迁移(上) 故障迁移是集群非常重要的功能:直白的说就是在集群中部分节点失效时,能将失效节点负责的键值对迁移到其他节点上,从而保证整个集群系统在部分节点失效后没有丢失数 ...

  4. Redis Sentinel高可用配置及C#访问

    本文环境如下: 操作系统:ubuntu-14.04.1-desktop-amd64 Redis:2.8.19 如果使用虚拟机则将每台的网络设置为桥接,否则他们之间能连上,局域网连不上. 系统设计如图: ...

  5. Redis的同步(主从复制)和Redis Sentinel

    Redis的同步可以让其他服务器拥有一个不断更新的数据副本,从而使拥有数据副本的服务器可以处理客户端发出的读请求. 1.Redis同步的方法: 我们可以通过发送SLAVEOF host port命令来 ...

  6. Redis sentinel 哨兵模式集群方案配置

    第一个方案是创建 redis cluster,第二种方案就是用哨兵模式来进行主从替换以及故障恢复.兵模式集群方案配置 一.sentinel介绍 Sentinel作用: 1):Master状态检测 2) ...

  7. Redis Sentinel配置小记

    Sentinel是一个管理多个redis实例的工具,它可以实现对redis的监控.通知.自动故障转移.sentinel不断的检测redis实例是否可以正常工作,通过API向其他程序报告redis的状态 ...

  8. Redis Sentinel 高可用服务搭建

    阅读目录: 关于 Redis 的概念 关于 Redis Sentinel 的概念 搭建 Redis Server(master) 搭建 Redis Server(slave) 搭建 Redis Sen ...

  9. Redis sentinel & cluster 原理分析

    1. Redis集群实现分析 1.1  sentinel 1.   功能 Sentinel实现如下功能: (1)monitoring--redis实例是否正常运行. (2)notification-- ...

随机推荐

  1. Chapter 5 数组:为什么很多编程语言种数组都是从0开始编号?

    如何实现随机访问? 线性表:数组,队列,链表,栈 非线性表:树,图 总结:数组用一块连续的内存空间,来存储相同类型的一组数据,最大的特点就是支持随机访问,但插入,删除操作也因此变得比较低效,平均情况时 ...

  2. windows下安装Scrapy框架

    一 首先我们通过pycharm安装: 发现不行,会报错. 二 通过命令行再次进行安装: 发现还是会报错: 更新下pip,继续安装,发现还是不行,那怎么办呢? 继续安装Scrapy发下还是不行: 那么我 ...

  3. cxf+spring+restful简单接口搭建

    之前都是用soap协议搭建,最近学了下restful,以便日后翻阅,小生才疏学浅,不足之处请多见谅. 1.maven配置 <project xmlns="http://maven.ap ...

  4. scrollview嵌套recyclerview显示不全现象

    只需在recyclerview的外层加入一个父布局就好了 <RelativeLayout android:layout_width="match_parent" androi ...

  5. Adjacent Bit Counts(01组合数)

    Adjacent Bit Counts 4557 Adjacent Bit CountsFor a string of n bits x 1 , x 2 , x 3 ,..., x n , the a ...

  6. hadoop分布式集群搭建(2.9.1)

    1.环境 操作系统:ubuntu16 jdk:1.8 hadoop:2.9.1 机器:3台,master:192.168.199.88,node1:192.168.199.89,node2:192.1 ...

  7. Linux网络编程学习(四) -----守护进程的建立(第三章)

    本文介绍一个例程daemon_init() #include <sys/types.h> #include <signal.h> #include <unistd.h&g ...

  8. Python程序互斥体

    Python程序互斥体   有时候我们需要程序只运行一个实例,在windows平台下我们可以很简单的用mutex实现这个目的.   在开始时,程序创建了一个命名的mutex,这个mutex可以被其他进 ...

  9. python学习Day4 流程控制(if分支,while循环,for循环)

    复习 1.变量名命名规范 -- 1.只能由数字.字母 及 _ 组成 -- 2.不能以数字开头 -- 3.不能与系统关键字重名 -- 4._开头有特殊含义 -- 5.__开头__结尾的变量,魔法变量 - ...

  10. 【Django】django.core.exceptions.ImproperlyConfigured: Error loading MySQLdb module.

    最近学习Django的过程中,在cmd打算使用python manage.py shell来测试数据的时候,当我一导入自己写的model类,就发现报了这个错误django.core.exception ...