一、基本概念
主从复制的问题
Redis 的主从复制模式可以将主节点的数据改变同步给从节点,这样可以起到两个作用,一个是作为主节点的备份,一个是扩展主节点的读能力,分担主节点压力。但主从复制也带来很多问题(如下),其中第一点就是 Redis 高可用的问题,就是本章节要讲的 Redis Sentinel。第二、三点属于 Redis 分布式问题,后面会出章节讲解。
- 一旦主节点出现故障,需要手动将一个从节点晋升为主节点,同时需要修改应用方的主节点地址,还需要命令其他从节点去复制新的主节点,
整个过程需要人工干预
。 - 主节点的
写能力
受到单机的限制 - 主节点的
存储能力
受到单机的限制
Redis Sentinel 的高可用性
当主节点出现故障时,
Redis Sentinel 能自动完成故障发现和故障转移,并通知应用方
,从而实现真正的高可用。
- 拓扑结构
- 故障转移处理逻辑
第一步
:主节点出现故障,此时两个从节点与主节点数去连接,主从复制失败第二步
:每个 Sentinel 节点通过定期监控发现主节点出现了故障第三步
:多个 Sentinel 节点对主节点的故障达成一致,选举出其中一个从节点作为领导者负责故障转移第四步
: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 章 哨兵