Redis的Sentinel模式进行分析
所有资源来源于Redis官方文档的翻译:redis.io/topics/sent…
Redis Sentinel模式
Redis Sentinel为Redis提供了高可用性。实际上,这意味着使用Sentinel可以创建一个Redis部署,在没有人为干预的情况下抵抗某些类型的故障。
Redis Sentinel还提供其他辅助任务,如监视、通知,并充当客户端的配置提供程序。这是宏观层面(即宏观层面)哨兵能力的完整列表。
Redis Sentinel的功能实现
- 监测:Sentinel不断检查主实例和副本实例是否按预期工作。
- 通知:Sentinel可以通过API通知系统管理员或其他计算机程序,其中一个受监视的Redis实例出现问题。
- 自动故障切换:如果主服务器未按预期工作,Sentinel可以启动故障切换过程,其中一个复制副本升级为主服务器,其他附加复制副本将重新配置为使用新的主服务器,并且使用Redis服务器的应用程序在连接时会被告知要使用的新地址。
- 配置提供程序:Sentinel充当客户端服务发现的授权来源:客户端连接到Sentinel,以请求负责给定服务的当前Redis主机的地址。如果发生故障转移,Sentinel将报告新地址。
Sentinel 的分布式特性
Redis Sentinel的分布式特性Sentinel是一个分布式系统:Sentinel本身设计为在多个Sentinel进程协作的配置中运行。
多个Sentinel进程协作的优点如下:当多个哨兵同意某个给定主机不再可用时,将执行故障检测。这降低了误报的概率。即使并非所有Sentinel进程都在工作,Sentinel也能工作,从而使系统对故障具有鲁棒性。
毕竟,拥有一个本身就是单点故障的故障切换系统是没有乐趣的。Sentinel、Redis实例(主机和副本)以及连接到Sentinel和Redis的客户端的总和也是一个具有特定属性的大型分布式系统。
将逐步介绍概念,从理解Sentinel基本属性所需的基本信息开始,到更复杂的信息(可选),以了解Sentinel的工作原理。
Sentinel快速入门
当前版本的Sentinel称为Sentinel 2,是对最初的Sentinel实现的重写,使用了更强、更简单的预测算法。
Sentinel的稳定版本从Redis2.8开始发布。新的开发是在不稳定的分支中执行的,新的特性有时在被认为是稳定的时候就被移植到最新的稳定分支中。
Redis 2.6附带的Redis Sentinel版本1已弃用,不应使用。
Sentinel的运行方式
运行Sentinel,如果您使用的是redis Sentinel可执行文件(或者如果您有一个与redis server可执行文件同名的符号链接),则可以使用以下命令行运行Sentinel:
redis-sentinel /path/to/sentinel.conf 复制代码
您可以直接使用redis server可执行文件以Sentinel模式启动它:
redis-server /path/to/sentinel.conf --sentinel 复制代码
两种方法都是一样的。但是,在运行Sentinel时必须使用配置文件,因为系统将使用该文件来保存当前状态,在重新启动时将重新加载该状态。如果没有提供配置文件或配置文件路径不可写,Sentinel将拒绝启动。
默认情况下,Sentinel运行侦听到TCP端口26379的连接,因此要使Sentinel正常工作,服务器的端口26379必须打开,才能从其他Sentinel实例的IP地址接收连接。否则哨兵就无法交谈,也无法就如何做达成一致,因此故障切换将永远不会执行。
部署Sentinel之前
- 需要了解的基本情况是,您至少需要三个Sentinel实例才能实现健壮的部署,这三个Sentinel实例应该放在被认为以独立方式失败的计算机或虚拟机中。例如,在不同的可用性区域上执行不同的物理服务器或虚拟机。
- Sentinel+Redis分布式系统不保证在故障期间保留已确认的写入,因为Redis使用异步复制。
- 有一些方法可以部署Sentinel,使窗口丢失写操作的时间限制在某些时刻,而还有其他不太安全的方法可以部署它。你的客户需要哨兵支持,流行的客户端库有Sentinel支持,但不是全部。
- 如果您不经常在开发环境中进行测试,那么就没有安全的HA设置,如果可以,在生产环境中,如果HA设置正常,那么就更好了。
- Sentinel、Docker或其他形式的网络地址转换或端口映射应谨慎混合:Docker执行端口重新映射,打破Sentinel对其他Sentinel进程和主机副本列表的自动发现。
配置Sentinel
Redis源发行版包含一个名为Sentinel.conf的文件,该文件是一个自我记录的示例配置文件,可用于配置Sentinel,但典型的最小配置文件如下所示:
sentinel monitor mymaster 127.0.0.1 6379 2 sentinel down-after-milliseconds mymaster 60000 sentinel failover-timeout mymaster 180000 sentinel parallel-syncs mymaster 1 复制代码
- 您只需要指定要监视的主机,为每个分离的主机(可能有任意数量的副本)指定不同的名称。无需指定自动发现的副本。
- Sentinel将使用有关副本的其他信息自动更新配置(以便在重新启动时保留这些信息)。
- 每次在故障切换期间将副本升级为主副本时,以及每次发现新的Sentinel时,都会重写配置。
sentinel monitor语句的参数含义
sentinel monitor <master-group-name> <ip> <port> <quorum> 复制代码
仲裁是指需要就无法访问主机这一事实达成一致意见的哨兵数量,以便真正将主机标记为失败,并在可能的情况下最终启动故障转移过程,但是,仲裁仅用于检测故障。
为了实际执行故障切换,其中一个哨兵需要被选为故障切换的负责人并获得继续执行的授权。
这只有在大多数Sentinel进程投票的情况下才会发生。例如,如果您有5个Sentinel进程,并且给定主机的仲裁设置为值2,则会发生以下情况:
注意事项
- 如果两个哨兵同时同意无法访问主服务器,那么其中一个哨兵将尝试启动故障转移。
- 如果至少有三个Sentinel可访问,则故障切换将被授权并实际启动。实际上,这意味着在故障期间,如果大多数Sentinel进程无法通信,Sentinel将永远不会启动故障转移(也就是少数分区中没有故障转移)。
其他哨兵选项
sentinel <option_name> <master_name> <option_value> 复制代码
- down after Millimes:是哨兵开始认为某个实例已关闭而不可访问的时间(毫秒)。
- parallel-syncs:并行同步设置可重新配置以在故障切换后同时使用新主机的副本数。数量越小,故障切换过程完成所需的时间就越长,但是,如果将副本配置为服务旧数据,则可能不希望所有副本同时与主机重新同步。
虽然复制过程对于复制副本来说基本上是无阻塞的,但有时它会停止从主机加载大容量数据。
通过将此选项的值设置为1,您可能希望确保一次只能访问一个副本
可以在运行时修改配置参数:使用SENTINEL SET修改特定于主机的配置参数。使用SENTINEL配置集修改全局配置参数。