Redis Sentinel 哨兵模式

Stella981
• 阅读 861

Redis Sentinel 哨兵模式

Sentinel 介绍

Redis的主从模式下,主节点一旦发生故障不能提供服务,需要人工干预,将从节点晋升为主节点, 同时还需要修改客户端配置。对于很多应用场景这种方式无法接受。 Sentinel(哨兵)架构解决了 redis主从人工干预的问题。 Redis Sentinel 是 redis的高可用实现方案,实际生产环境中,对提高整个系统可用性非常有帮助的。

哨兵的主要功能

Redis Sentinel 是一个分布式系统, Redis Sentinel 为 Redis提供高可用性。可以在没有人为干预的 情况下阻止某种类型的故障。
 Redis 的 Sentinel 系统用于管理多个 Redis 服务器(instance)该系统执行以下三个任务:


**1.监控(Monitoring):**


Sentinel 会不断地定期检查你的主服务器和从服务器是否运作正常。

2.提醒(Notification):**

当被监控的某个 Redis 服务器出现问题时, Sentinel 可以通过 API 向管理员或者其他应用程序发送通知。

3.自动故障迁移(Automatic failover):

当一个主服务器不能正常工作时, Sentinel 会开始一次自动故障迁移操作, 它会将失效主服务器的其中一个从

服务器升级为新的主服务器, 并让失效主服务器的其他从服务器改为复制新的主服务器; 当客户端试图连接失

效的主服务器时, 集群也会向客户端返回新主服务器的地址, 使得集群可以使用新主服务器代替失效服务器

哨兵操作

目录规划

角色

IP

端口

Master

10.0.0.51

6379

Sentinel-01

26379

Master

10.0.0.52

6379

Sentinel-01

26379

Master

10.0.0.52

6379

Sentinel-01

26379

安装部署3个单节点

!!!!注意!!!!

三个节点修改为自己的IP地址

#创建哨兵实例目录
mkdir -p /data/redis_cluster/redis_6379
mkdir -p /opt/redis_cluster/redis_6379/{conf,pid,logs}

cd /data/soft/
wget http://download.redis.io/releases/redis-3.2.9.tar.gz
tar zxf redis-3.2.9.tar.gz -C /opt/redis_cluster/
ln -s /opt/redis_cluster/redis-3.2.9/ /opt/redis_cluster/redis

cd /opt/redis_cluster/redis
make && make install

#进目录下编辑哨兵配置文件
cd /opt/redis_cluster/redis_6379/conf/
cat >redis_6379.conf <<EOF
daemonize yes
bind 10.0.0.5x
port 6379
pidfile /opt/redis_cluster/redis_6379/pid/redis_6379.pid
logfile /opt/redis_cluster/redis_6379/logs/redis_6379.log
databases 16
dbfilename redis_6379.rdb
dir /data/redis_cluster/redis_6379
EOF 

2.安装部署3个哨兵节点

!!!!注意!!!!

三个节点的bind IP修改为自己的IP地址

db01

mkdir -p /data/redis_cluster/redis_26379
mkdir -p /opt/redis_cluster/redis_26379/{conf,pid,logs}

3.配置哨兵的配置文件
cat >/opt/redis_cluster/redis_26379/conf/redis_26379.conf << EOF
bind 10.0.0.53
port 26379
daemonize yes
logfile /opt/redis_cluster/redis_26379/logs/redis_26379.log
dir /data/redis_cluster/redis_26379

#mymaster 主节点别名 主节点 ip 和端口,判断主节点失败,两个 sentinel 节点同意 
sentinel monitor mymaster 10.0.0.51 6379 2 

#选项指定了 Sentinel 认为服务器已经断线所需的毫秒数。
sentinel down-after-milliseconds mymaster 3000

#向新的主节点发起复制操作的从节点个数,1 轮询发起复制 
sentinel parallel-syncs mymaster 1

#故障转移超时时间 
sentinel failover-timeout mymaster 18000
EOF

db01

rsync -avz /opt/* db02:/opt/ 
rsync -avz /opt/* db03:/opt/

db02

mkdir -p /data/redis_cluster/redis_26379 
cd /opt/redis_cluster/redis 
make install 
sed -i 's#bind 10.0.0.51#bind 10.0.0.52#g' /opt/redis_cluster/redis_6379/conf/redis_6379.conf 
sed -i 's#bind 10.0.0.51#bind 10.0.0.52#g' /opt/redis_cluster/redis_26379/conf/redis_26379.conf

db03

mkdir -p /data/redis_cluster/redis_26379 
cd /opt/redis_cluster/redis 
make install 
sed -i 's#bind 10.0.0.51#bind 10.0.0.53#g' /opt/redis_cluster/redis_6379/conf/redis_6379.conf 
sed -i 's#bind 10.0.0.51#bind 10.0.0.53#g' /opt/redis_cluster/redis_26379/conf/redis_26379.conf

4.启动所有的单节点

redis-server /opt/redis_cluster/redis_6379/conf/redis_6379.conf 

5.配置主从复制

redis-cli -h db02 slaveof 10.0.0.51 6379
redis-cli -h db03 slaveof 10.0.0.51 6379

6.启动哨兵

3台都操作 启动哨兵
redis-sentinel /opt/redis_cluster/redis_26379/conf/redis_26379.conf

7.验证主节点

redis-cli -h db01 -p 26379 Sentinel get-master-addr-by-name mymaster
redis-cli -h db02 -p 26379 Sentinel get-master-addr-by-name mymaster
redis-cli -h db03 -p 26379 Sentinel get-master-addr-by-name mymaster

配置文件的变化

当所有节点启动后,配置文件的内容发生了变化,体现在三个方面:

1、Sentinel 节点自动发现了从节点,其余 Sentinel 节点

2、去掉了默认配置,例如 parallel-syncs failover-timeout 参数

3、添加了配置纪元相关参数 查看配置文件命令

[root@db01 ~]# tail -6 /opt/redis_cluster/redis_26379/conf/redis_26379.conf   
# Generated by CONFIG REWRITE 
sentinel known-slave mymaster 10.0.0.52 6379 
sentinel known-slave mymaster 10.0.0.53 6379 
sentinel known-sentinel mymaster 10.0.0.53 26379 7794fbbb9dfb62f4d2d7f06ddef06bacb62e4c97 
sentinel known-sentinel mymaster 10.0.0.52 26379 17bfab23bc53a531571790b9b31558dddeaeca40 
sentinel current-epoch 0

哨兵常用操作 API

[root@db01 ~]# redis-cli -h db01 -p 26379 Sentinel 节点是一个特殊的 Redis节点,他们有自己专属的 API 
Info Sentinel 
Sentinel masters 
Sentinel master <master name> 
Sentinel slaves <master name>  
Sentinel sentinels <master name> 
Sentinel get-master-addr-by-name <master name>    
Sentinel failover <master name> 
Sentinel flushconfig

8.模拟故障转移

  • 关闭主节点服务上的所有redis进程
  • 观察其他2个节点会不会发生选举
  • 查看配置文件里会不会自动更新
  • 查看新的主节点能不能写入
  • 查看从节点能否正常同步

9.模拟故障修复上线

  • 启动单节点
  • 启动哨兵

10.模拟权重选举

  • 设置其他节点的权重为0

  • 手动发起重新选举

  • 观察所有节点消息是否同步

  • 观察切换结果是否符合预期

    命令解释: 1.查询命令:CONFIG GET slave-priority 2.设置命令:CONFIG SET slave-priority 0 3.主动切换:sentinel failover mymaster

    操作命令: redis-cli -h db02 -p 6379 CONFIG SET slave-priority 0 redis-cli -h db03 -p 6379 CONFIG SET slave-priority 0 redis-cli -h db01 -p 26379 sentinel failover mymaster

    验证选举结果: redis-cli -h db01 -p 26379 Sentinel get-master-addr-by-name mymaster

点赞
收藏
评论区
推荐文章
blmius blmius
3年前
MySQL:[Err] 1292 - Incorrect datetime value: ‘0000-00-00 00:00:00‘ for column ‘CREATE_TIME‘ at row 1
文章目录问题用navicat导入数据时,报错:原因这是因为当前的MySQL不支持datetime为0的情况。解决修改sql\mode:sql\mode:SQLMode定义了MySQL应支持的SQL语法、数据校验等,这样可以更容易地在不同的环境中使用MySQL。全局s
皕杰报表之UUID
​在我们用皕杰报表工具设计填报报表时,如何在新增行里自动增加id呢?能新增整数排序id吗?目前可以在新增行里自动增加id,但只能用uuid函数增加UUID编码,不能新增整数排序id。uuid函数说明:获取一个UUID,可以在填报表中用来创建数据ID语法:uuid()或uuid(sep)参数说明:sep布尔值,生成的uuid中是否包含分隔符'',缺省为
待兔 待兔
7个月前
手写Java HashMap源码
HashMap的使用教程HashMap的使用教程HashMap的使用教程HashMap的使用教程HashMap的使用教程22
Stella981 Stella981
3年前
KVM调整cpu和内存
一.修改kvm虚拟机的配置1、virsheditcentos7找到“memory”和“vcpu”标签,将<namecentos7</name<uuid2220a6d1a36a4fbb8523e078b3dfe795</uuid
Stella981 Stella981
3年前
Redis主从模式的常用类型
本文介绍Redis主从模式的常用类型。Redis的可靠性主要有主从模式和集群模式。对于主从模式而言,Redis有以下方案:Sentinel方案;Keepalived方案。Sentinel方案作为Redis主推的官方方案,主要的实现原理是通过引入哨兵sentinel节点,来投标决定master节点故障后,
Easter79 Easter79
3年前
Twitter的分布式自增ID算法snowflake (Java版)
概述分布式系统中,有一些需要使用全局唯一ID的场景,这种时候为了防止ID冲突可以使用36位的UUID,但是UUID有一些缺点,首先他相对比较长,另外UUID一般是无序的。有些时候我们希望能使用一种简单一些的ID,并且希望ID能够按照时间有序生成。而twitter的snowflake解决了这种需求,最初Twitter把存储系统从MySQL迁移
Stella981 Stella981
3年前
Redis系列
Redis的主从复制模式下,一旦主节点由于故障不能提供服务,需要人工将从节点晋升为主节点,同时还要通知应用方更新主节点地址,对于很多应用场景这种故障处理的方式是无法接受的。可喜的是Redis从2.8开始正式提供了RedisSentinel(哨兵)架构来解决这个问题。总结:Redis主从复制的缺点:没有办法对master进行动态
Wesley13 Wesley13
3年前
MySQL部分从库上面因为大量的临时表tmp_table造成慢查询
背景描述Time:20190124T00:08:14.70572408:00User@Host:@Id:Schema:sentrymetaLast_errno:0Killed:0Query_time:0.315758Lock_
Python进阶者 Python进阶者
1年前
Excel中这日期老是出来00:00:00,怎么用Pandas把这个去除
大家好,我是皮皮。一、前言前几天在Python白银交流群【上海新年人】问了一个Pandas数据筛选的问题。问题如下:这日期老是出来00:00:00,怎么把这个去除。二、实现过程后来【论草莓如何成为冻干莓】给了一个思路和代码如下:pd.toexcel之前把这
美凌格栋栋酱 美凌格栋栋酱
1个月前
Oracle 分组与拼接字符串同时使用
SELECTT.,ROWNUMIDFROM(SELECTT.EMPLID,T.NAME,T.BU,T.REALDEPART,T.FORMATDATE,SUM(T.S0)S0,MAX(UPDATETIME)CREATETIME,LISTAGG(TOCHAR(