【0】哨兵 sentinel 的作用

  其概念参考:Redis高可用(理论篇) 中的【2】

  【0.1】监控:监控主从是否正常

  【0.2】通知:出现问题时,可以通知相关人员

  【0.3】故障转移:自动主从切换

  【0.4】统一的配置管理:可以从 sentinel 取得主从的地址,统一管理

  如果2台机器,可以在1台机器上布置2个哨兵。3台机器则每个机器各部署一个。

  前置条件:主从搭建部分可以参考上一篇:Redis(1.9)Redis主从复制

    

【1】环境

  CentOS7.5

  redis4.0.11

  master1/sentinel1:192.168.135.173

  slave1/sentinel2:192.168.135.174

  slave2/sentinel3:192.168.135.175

  架构:1主2从3哨兵

  安装包软件目录: /soft

  redis目录:/data/redis/

      (1)conf:存放配置文件pid文件,rdb文件  (2)log:日志文件  (3)data:安装目录

#redis的配置文件核心参数如下

daemonize yes
logfile "/data/redis/log/redis.log"
requirepass
bind 0.0.0.0
pidfile /data/redis/conf/redis.pid
dbfilename redis.rdb
dir /data/redis/conf/
timeout
port
#如果主从各个库都设置了密码,那么建议密码一致且都配置下面masterauth参数
masterauth

【2】修改哨兵配置文件

【2.1】找到 sentinel.conf 配置文件
cp /soft/redis-4.0./sentinel.conf /data/redis/conf/sentinel.conf
#不复制了,直接新建吧,否则会各种报错。。除非你查询下面的选项一个一个修改 【2.2】修改文件(3台机器都这么操作,主库所在机器为173)
vim /data/redis/conf/sentinel.conf
#sentinel 实例之间的通讯端口

sentinel monitor mymaster 192.168.135.173  2
  #sentinel monitor 主服务器别名 主服务器IP 主服务器redis实例端口 可观下线投票数(一般为节点数/2+1)
sentinel down-after-milliseconds mymaster 10000
  #主库多久没有响应后宕机, mymaster 为主服务器别名,10000 单位为毫秒,换算成秒为10秒,即主库10秒没有响应则认为其宕机
sentinel parallel-syncs mymaster 1
  #当故障转移切换后,新主库与其他从库并行同步的数量,如果是1则一个一个同步,同步完一个从库才回去同步下一个从库,如果是2就同时同步2个从库,同步完后继续同步下2个从库
sentinel failover-timeout mymaster 15000
  #故障转移时间,如果故障转移步骤15秒还没有完成,则跳过,随机选择
sentinel auth-pass mymaster 123456
  #定义主库的登录密码
bind 0.0.0.0
port 26379
  #sentinel的端口
daemonize yes
logfile /data/redis/log/sentinel.log
dir /data/redis/conf
【2.3】启动哨兵(先启动redis再启动哨兵)
redis-server /data/redis/conf/redis.conf
redis-sentinel /data/redis/conf/sentinel.conf
ps -ef|grep redis
  #这就意味着起来了,如下图
    

【3】查看哨兵状态

redis-cli -h 192.168.135.173 -p  sentinel masters #登录主库哨兵用 sentinel masters 查看
    
redis-cli -p  -a  -h 192.168.135.173 info #登录主库哨兵,用Info查看
    

【4】故障转移

【4.1】模拟故障:主库关机

:shutdown -h now
#然后去其他任意哨兵节点查看日志如下

由上图选中可见,主库已经切换成175了。

【4.2】核验故障转移

#登录上175
  

  

#登录上174

  

#重启173机器,查看其现在是否把主库转移到175了,且数据同步。至于是down,查看了一下是因为我没有给主库配置文件设置masterauth,设置完重启后即可。

   

【5】数据丢失与脑裂

redis哨兵主从切换下数据丢失:

(1)异步数据丢失问题:
当集群节点间网络或其他问题导致异步复制延时很高,如果此时master宕机了,
毫无疑问会丢失延时的这段时间的数据当集群节点间网络或其他问题导致异步复制延时很高,
如果此时master宕机了,毫无疑问会丢失延时的这段时间的数据
(2)脑裂问题:
当网络分区变化导致master和slave节点之间无法正常通信时,sentinel哨兵集群会选举
slave为master,此时与之前master连接的client一直发送数据,当我们进行恢复将原master
当做新master的slave节点的时候,那么后来一直发送到原master内存的数据会丢失

【5.1】【解决办法】

解决上述两种数据丢失的问题,redis配置文件中有以下两行:
  min-slaves-to-write 3
  min-slaves-max-lag 10

  意味着至少要有3个slave节点与master保持10秒钟以内的数据同步,否则master就不会
接受新的请求,我们需要采取其他措施来应对

min-slaves-to-write默认情况下是0,min-slaves-max-lag默认情况下是10。

【5.2】【数据丢失问题】   

  以上面配置为例,这两个参数,前者表示至少有3个salve在与master进行复制,后者表示,在所有从库中一旦任意一个slave复制和同步的延迟达到了10s,那么此时master就不会接受任何请求。
我们可以减小min-slaves-max-lag参数的值,这样就可以避免在发生故障时大量的数据丢失,一旦发现延迟超过了该值就不会往master中写入数据。
那么对于client,我们可以采取降级措施,将数据暂时写入本地缓存和磁盘中,在一段时间后重新写入master来保证数据不丢失;也可以将数据写入kafka消息队列,隔一段时间去消费kafka中的数据。
通过上面两个参数的设置我们尽可能的减少数据的丢失,具体的值还需要在特定的环境下进行测试设置。

【5.3】【脑裂问题】

  若一个master出现了脑裂,跟其他slave失去连接,那么开始的两个配置可以确保
若不能继续给指定数量的slave发送数据,而且slave超过10秒没有给自己ack消息,那么就直接拒绝客户端的写请求
这样脑裂后的旧master就不会接受client的新数据,也就避免了数据丢失
上面的配置就确保了,如果跟任何一个slave丢了连接,在10秒后发现没有slave给自己ack,那么就拒绝新的写请求
因此在脑裂场景下,最多就丢失10秒的数据

【6】哨兵的常见代码操作

【6.1】哨兵的客户端操作

Sentinel时客户端命令
检查其他 Sentinel 节点的状态,返回 PONG 为正常。
> PING sentinel
显示被监控的所有 主节点 以及它们的状态。
> SENTINEL masters 显示指定 主节点 的信息和状态。
> SENTINEL master <master_name> 显示指定 主节点 的所有 从节点 以及它们的状态。
> SENTINEL slaves <master_name>
返回指定 主节点 的 IP 地址和 端口。如果正在进行 failover 或者 failover 已经完成,将会显示被提升为 主节点 的 从节点 的 IP 地址和 端口。 > SENTINEL get-master-addr-by-name <master_name> 重置名字匹配该 正则表达式 的所有的 主节点 的状态信息,清除它之前的 状态信息,以及 从节点 的信息。
> SENTINEL reset <pattern>
强制当前 Sentinel 节点执行 failover,并且不需要得到其他 Sentinel 节点的同意。但是 failover 后会将 最新的配置 发送给其他 Sentinel 节点。 >SENTINEL failover <master_name>

【6.2】常用命令

sentinel的基本状态信息
INFO

列出所有被监视的主服务器,以及这些主服务器的当前状态
SENTINEL masters

列出指定主redis的从节点状态情况
SENTINEL slaves <master-name>

列出指定主redis的监控哨兵信息,不包含他自己
SENTINEL sentinels <master-name>

返回给定名字的主服务器的 IP 地址和端口号
SENTINEL get-master-addr-by-name <master-name>

重置所有名字和给定模式 pattern 相匹配的主服务器。重置操作清除主服务器目前的所有状态,包括正在执行中的故障转移,并移除目前已经发现和关联的,主服务器的所有从服务器和 Sentinel 。
SENTINEL <master-name>

当主服务器失效时 在不询问其他 Sentinel 意见的情况下,强制开始一次自动故障迁移,但是它会给其他sentinel发送一个最新的配置,其他sentinel会根据这个配置进行更新
SENTINEL failover <master-name>

检查当前在线的哨兵节点。如果一共有5个节点,设置4票,但检查后只有3节点在线,那一直无法进行监控切换
sentinel ckquorum <master-name>

将配置强制刷新到本地文件
sentinel flushconfig

取消当前哨兵对某主节点的监控
sentinel remove <master name>

二、相关实践

指定一个从做新主

  有时候需要将当前主节点机器下线,并指定一个高一些性能的从节点接替

  将其它从节点的slave-priority配置为0,然后在随意一台 Setinel 执行sentinel failover <master name>来手动强行切换主从

  配置后,需要再将其它节点的slave-priority再变回来,否则会影响之后的切换

添加一个从节点

  直接在新的从节点填写主节点信息,让他作为从节点启动即可。每10秒 Setinel 会发送info去检测主从信息

添加一个Setinel节点

  直接添加sentinel monitor mymaster 127.0.0.1 6379 1主节点的配置即可

【6.3】哨兵的主要配置文件参数

# redis进程是否以守护进程的方式运行,yes为是,no为否(不以守护进程的方式运行会占用一个终端)。
daemonize no
# 指定redis进程的PID文件存放位置
pidfile /var/run/redis.pid
# redis进程的端口号
port
# 绑定的主机地址
bind 127.0.0.1
# 客户端闲置多长时间后关闭连接,默认此参数为0即关闭此功能
timeout
# redis日志级别,可用的级别有debug.verbose.notice.warning
loglevel verbose
# log文件输出位置,如果进程以守护进程的方式运行,此处又将输出文件设置为stdout的话,就会将日志信息输出到/dev/null里面去了
logfile stdout
# 设置数据库的数量,默认为0可以使用select <dbid>命令在连接上指定数据库id
databases
# 指定在多少时间内刷新次数达到多少的时候会将数据同步到数据文件
save <seconds> <changes>
# 指定存储至本地数据库时是否压缩文件,默认为yes即启用存储
rdbcompression yes
# 指定本地数据库文件名
dbfilename dump.db
# 指定本地数据问就按存放位置
dir ./
# 指定当本机为slave服务时,设置master服务的IP地址及端口,在redis启动的时候他会自动跟master进行数据同步
slaveof <masterip> <masterport>
# 当master设置了密码保护时,slave服务连接master的密码
masterauth <master-password>
# 设置redis连接密码,如果配置了连接密码,客户端在连接redis是需要通过AUTH<password>命令提供密码,默认关闭
requirepass footbared
# 设置同一时间最大客户连接数,默认无限制。redis可以同时连接的客户端数为redis程序可以打开的最大文件描述符,如果设置 maxclients ,表示不作限制。当客户端连接数到达限制时,Redis会关闭新的连接并向客户端返回 max number of clients reached 错误信息
maxclients
# 指定Redis最大内存限制,Redis在启动时会把数据加载到内存中,达到最大内存后,Redis会先尝试清除已到期或即将到期的Key。当此方法处理后,仍然到达最大内存设置,将无法再进行写入操作,但仍然可以进行读取操作。Redis新的vm机制,会把Key存放内存,Value会存放在swap区
maxmemory<bytes>
# 指定是否在每次更新操作后进行日志记录,Redis在默认情况下是异步的把数据写入磁盘,如果不开启,可能会在断电时导致一段时间内的数据丢失。因为redis本身同步数据文件是按上面save条件来同步的,所以有的数据会在一段时间内只存在于内存中。默认为no。
appendonly no
# 指定跟新日志文件名默认为appendonly.aof
appendfilename appendonly.aof
# 指定更新日志的条件,有三个可选参数 - no:表示等操作系统进行数据缓存同步到磁盘(快),always:表示每次更新操作后手动调用fsync()将数据写到磁盘(慢,安全), everysec:表示每秒同步一次(折衷,默认值);
appendfsync everysec

【附录】报错处理

(1)Duplicated master name

    

   意思是说我们重复定义了2个不同值的 master name,这里推测应该是原本配置文件的配置和我们这里的配置不一样,导致冲突了。

  找一下之后,果然有,注释掉他

    

  修改后,依然有其他选项值出现相关问题

    

  最终解决办法,删掉原本的配置,只留下我们需要的配置。

  

Redis(1.10)Redis主从复制下的哨兵模式的更多相关文章

  1. 【运维技术】redis(一主两从三哨兵模式搭建)记录

    redis(一主两从三哨兵模式搭建)记录 目的: 让看看这篇文章的的人能够知道:软件架构.软件的安装.配置.基本运维的操作.高可用测试.也包含我自己,能够节省对应的时间. 软件架构: 生产环境使用三台 ...

  2. Redis 复制技术和高可用sentinel(哨兵模式)

    redis的复制技术和高可用(哨兵模式) 1 复制 为什么要复制 实现数据的多副本存储,从而可以实现服务的高可用 提供更好的读性能复制技术的关键点及难点 如何指定被复制对象 增量还是全量以及如何实现增 ...

  3. Redis 集群_主从配置_哨兵模式

    首先:slaveof 可以在[从]服务器启动一个service服务,直接将[从]服务器定义为[从Redis] redis-server --slaveof <master-ip> < ...

  4. redis(一主两从三哨兵模式搭建)记录

    转自:http://www.cnblogs.com/fly-piglet/p/9836314.html 目的: 让看看这篇文章的的人能够知道:软件架构.软件的安装.配置.基本运维的操作.高可用测试.也 ...

  5. redis 学习笔记2(集群之哨兵模式的使用)

    redis3.0之前已经有了哨兵模式,3.0之后有了cluster(分片集群),官方不推荐使用!!主要原因是分片后单节点故障后需要实现手动分槽... 集群较为成熟的解决方案codis,公司使用的是哨兵 ...

  6. redis 的一主二从三哨兵模式

    概述 在部署redis 的时候,如果redis宕机,缓存将不可用,redis提供了哨兵模式保证redis实现高可用. 即一台主机两台从机,三台哨兵主机,如果主实例宕机,哨兵将将一台从机升级为主机.实现 ...

  7. Redis 3.2.3: 集群3哨兵模式

    简介 Redis是一个使用ANSI C编写的开源.支持网络.基于内存.可选持久性的键值对存储数据库.从2015年6月开始,Redis的开发由Redis Labs赞助,而2013年5月至2015年6月期 ...

  8. Redis不重启的情况下 切换持久化模式

    确保redis版本在2.2以上 [root@localhost /]# redis-server -v Redis server v=4.0.10 sha=00000000:0 malloc=jema ...

  9. redis学习三,Redis主从复制和哨兵模式

    Redis主从复制 java架构师项目实战,高并发集群分布式,大数据高可用,视频教程 1.Master可以拥有多个slave 2.多个slave可以连接同一个Master外,还可以连接到其他的slav ...

随机推荐

  1. 微信小程序填坑之旅(1)-app.js中用云开发获取openid,在其他页上用app.globaldata.openid获取为空

    参考:小程序如何在其他页面监听globalData中值的变化?https://www.jianshu.com/p/8d1c4626f9a3 原因就是:app.js没执行完时,其他页已经onload了, ...

  2. 路由器配置——广播多路访问链路上的OSPF

    一.实验目的:作广播形式的OSPF,了解DR与BDR之间的链路关系 二.拓扑图: 三.具体步骤配置 (1)R1路由器配置 enableconfigure terminalhostname R1inte ...

  3. 洛谷 P2184 贪婪大陆

    题面 又是一类比较套路的题呢? 假如我们的地雷都表示成 [l[i],r[i]] ,要求[L,R],那么就相当于要求满足 (l[i]<=R && r[i]>=L)的i的个数. ...

  4. deepin grub2017年11月13日折腾记录

    http://blog.csdn.net/atbird0321/article/details/78158194 https://bbs.deepin.org/forum.php?mod=viewth ...

  5. Pap.er 模仿 - 第二天

    最后更新:2017-12-19 在第一天中, 我们完成了项目的基本设置.隐藏Dock.显示和隐藏Popover等操作,接下来的这章中, Pap.er将会去搭建对应 UI. 一.设置Popover对应颜 ...

  6. solr安装记录

    [root@localhost bin]# ./solr start -force*** [WARN] *** Your open file limit is currently 1024.   It ...

  7. MySQL Cluster 集群部署

    前言 此篇博客用以介绍 MySQL Cluster 集群部署方法 一.节点规划 序号 IP地址 节点名称 1 172.16.1.201 mysql-manage 2 172.16.1.202 mysq ...

  8. ios-Runtime调用私有方法

    有时在代码中会有需要调用私有方法的场景,如不想import太多头文件:想组件设计一些解耦的模块:查看别人模块中未暴露的代码进行分析等. 在 ios 中调用私有方法有很多种方式,主要是通过Runtime ...

  9. CentOS linux7 磁盘分区

    常用命令 df [选项] [文件] -a  显示全部文件系统 -h 方便阅读方式显示 -l 只显示本地文件系统 -T 显示文件系统类型 fdisk  /dev/sda1

  10. 视图解析器InternalResourceViewResolver

    ModelAndView对象中即可以封装真实视图路径名,也可以封装视图路径的逻辑名,springmvc.xml 代码如下: <!-- 视图解析器(框架) --> <bean clas ...