Redis 开发与运维Redis Sentinel 哨兵

Posted 木兮同学

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Redis 开发与运维Redis Sentinel 哨兵相关的知识,希望对你有一定的参考价值。


一、基本概念

主从复制的问题

Redis 的主从复制模式可以将主节点的数据改变同步给从节点,这样可以起到两个作用,一个是作为主节点的备份,一个是扩展主节点的读能力,分担主节点压力。但主从复制也带来很多问题(如下),其中第一点就是 Redis 高可用的问题,就是本章节要讲的 Redis Sentinel。第二、三点属于 Redis 分布式问题,后面会出章节讲解。

  • 一旦主节点出现故障,需要手动将一个从节点晋升为主节点,同时需要修改应用方的主节点地址,还需要命令其他从节点去复制新的主节点,整个过程需要人工干预
  • 主节点的写能力受到单机的限制
  • 主节点的存储能力受到单机的限制

Redis Sentinel 的高可用性

当主节点出现故障时,Redis Sentinel 能自动完成故障发现和故障转移,并通知应用方,从而实现真正的高可用。

  • 拓扑结构
    sentinel
  • 故障转移处理逻辑
    • 第一步:主节点出现故障,此时两个从节点与主节点数去连接,主从复制失败
    • 第二步:每个 Sentinel 节点通过定期监控发现主节点出现了故障
    • 第三步:多个 Sentinel 节点对主节点的故障达成一致,选举出其中一个从节点作为领导者负责故障转移
    • 第四步:Sentinel 领导者节点执行了故障转移
    • 故障转移后整个拓扑图变为如下结构:
      new_sentinel
  • 通过上面的逻辑架构以及故障转移的处理,可以看出 Redis Sentinel 具有以下几个功能:
    • 监控:Sentinel 节点会定期的检测 Redis 数据节点和其余 Sentinel 节点是否可达。
    • 通知:Sentinel 节点会将故障转移的结果通知给应用方。
    • 主节点故障转移:实现从节点晋升为主节点并维护后续正确的主从关系。
    • 配置提供者:在 Redis Sentinel 结构中,客户端在初始化的时候连接的是 Sentinel 节点集合,从中获取主节点信息。
  • Sentinel 节点本身就是独立的 Redis 节点,只不过它们有一些特殊,它们不存储数据,只支持部分命令

二、安装和部署

部署拓扑结构图

  • 接下来将以 3 个 Sentinel 节点、1 个主节点、2 个从节点组成一个 Redis Sentinel 进行说明。
    拓扑图

部署 Redis 数据节点

  • 启动主节点:Redis Sentinel 中 Redis 数据节点没有做任何特殊配置,按照之前章节方法直接启动即可
  • 启动两个从节点:两个从节点配置一样,和主节点不同的是多了 slaveof 配置
  • 确认主从关系:在主节点和从节点分别使用 info replication 命令查看启动情况

部署 Sentinel 节点

  • 配置 Sentinel 节点
    • Sentinel 节点的默认端口是 26379。
    • 配置文件中 sentinel monitor mymaster 127.0.0.1 6379 2 这个配置表示,当前 sentinel 节点需要监控 127.0.0.1:6379 这个主节点,2 代表判断主节点失败至少需要 2 个 Sentinel 节点同意,mymaster 是主节点的别名。
  • 启动 Sentinel 节点
    • 方式一:redis-sentinel redis-sentinel-26379.conf
    • 方式二:redis-server redis-sentinel-26379.conf --sentinel
  • 确认:也可以用 info 命令(info sentinel)查询 sentinel 节点的相关信息,全部启动之后,Sentinel 节点能够彼此感知到对方,也能够感知到 Redis 数据节点

部署技巧

  • Sentinel 节点不应该部署在一台物理机器上,防止机器挂了导致哨兵全不可用。
  • 部署至少三个且奇数个的 Sentinel 节点,这里要注意并非每个数据节点都需要一个哨兵节点,其实只使用一个哨兵节点也是可以的,使用多个哨兵节点是为了 Sentinel 也达到高可用
  • Sentinel 节点集合可以只监控一个主节点,也可以监控多个主节点,所以多个主节点的情况下,可以选择一套 Sentinel 或者多套 Sentinel ,如何选择?
    • 一套 Sentinel:这种方案降低了维护成本,因为只需要维护固定个数的 Sentinel 节点,但如果这套 Sentinel 节点集合出现异常,可能会对多个 Redis 数据节点造成影响。如果监控的 Redis 数据节点较多,会造成 Sentinel 节点产生过多的网络连接。
    • 多套 Sentinel:优缺点和上面相反,每个 Redis 主节点都有自己的 Sentinel 节点集合,会造成资源浪费。优点也明显,每套 Redis Sentinel 都是彼此隔离的。
    • 如果 Sentinel 节点集合监控的是同一个业务的多个主节点集合,那么使用方案一,否则一般建议采用方案二

三、API

  • sentinel masters:展示所有被监控的主节点状态以及相关的统计信息
  • sentinel master <master name>:展示指定主节点状态以及相关的统计信息
  • sentinel slaves <master name>:展示指定从节点状态以及相关的统计信息
  • sentinel sentinels <master name>:展示指定的 Sentinel 节点集合(不包含当前 Sentinel 节点)
  • sentinel get-maste-addr-by-name <master name>:返回指定主节点的 IP 地址和端口
  • sentinel reset <pattern>:当前 Sentinel 节点对符合 pattern 通配符主节点的配置进行重置,包含清除主节点的相关状态(例如故障转移),重新发现从节点和 Sentinel 节点
  • sentinel failover <master name>:对指定主节点进行强制故障转移(没有和其他 Sentinel 节点“协商”),当故障转移完成后,其他 Sentinel 节点按照故障转移的结果更新自身配置,这个命令在 Redis 日常运维中非常有用
  • sentinel ckquorum <master name>:检测当前可达的 Sentinel 节点总数是否达到 quorum 的个数
  • sentinel flushconfig:当 Sentinel 节点的配置强制刷到磁盘上,这个命令 Sentinel 节点自身用的比较多,对于开发和运维人员只有当外部原因(比如磁盘损坏)造成配置文件损坏或者丢失时,这个命令是很有用的。
  • sentinel remove <master name>:取消当前 Sentinel 节点对于指定主节点的监控
  • sentinel monitor <master name> <ip> <port> <quorum>:这个命令和配置文件中的含义是完全一样的,只不过是通过命令的形式来完成 Sentinel 节点对主节点的监控。
  • sentinel set <master name>:动态修改 Sentinel 节点配置选项
  • sentinel is-master-down-by-addr:Sentinel 节点之间来交换对主节点是否下线的判断,根据参数的不同,还可以作为 Sentinel 领导者选举的通信方式

来源:《Redis 开发与运维》第 9 章 哨兵

以上是关于Redis 开发与运维Redis Sentinel 哨兵的主要内容,如果未能解决你的问题,请参考以下文章

Redis 开发与运维Redis Sentinel 哨兵

Redis 开发与运维Redis Sentinel 哨兵

Redis开发与运维

《Redis开发与运维》

redis 开发与运维 学习心得

Redis开发与运维:数据迁移