Redis学习手册18—Sentinel

故障转移

因为Redis支持主从复制,并且主从服务器的数据完全一致。因此,当主服务器因故障下线时,将它的其中一台从服务器转换为主服务器,并使用新的主服务器继续处理命令请求,这样整个系统就可以继续运行,不比仅因为主服务器下线而停机。这种使用正常服务器替换下线服务器以维持系统正常运转的操作,一般被称为故障转移(failover)。

手动故障转移

因为Redis支持主从复制特性,所以我们同样可以对下线的Redis主服务器实施故障转移,假设现在有一个主服务器 127.0.0.1:6379(简称 6379),它有两个从服务器 127.0.0.1:6380(简称 6380) 和 127.0.0.1:6381(简称 6381),对主服务器实施故障转移的步骤如下:

  • 先向 6380 发送命令 REPLICAOF no one,将它转换为主服务器;
  • 然后向另一个从服务器6381发送命令 REPLICAOF 127.0.0.1 6380,让它去复制新的主服务器 6380;

具体如下图所示:

在这里插入图片描述

Sentinel(哨兵)

当Redis主从复制结构比较复杂,比如一主多从的情况下,监视多台Redis服务器,并在有需要的时候对下线的主服务器实施故障转移,并不是一件容易的事情。为此,Redis服务器提供了自动化的故障转移功能,提高主从服务器的可用性,Redis为用户提供了 Redis Sentinel 工具,Sentinel(哨兵) 可以通过心跳检测的方式监视多个主服务器以及它们下属的所有从服务器,并在某个主服务器下线的时候自动对其实施故障转移。

启动Sentinel

在了解了Redis Sentinel的基本作用之后,现在让我们来学习一下如何启动Redis Sentinel并让它去监视指定的主服务器。

Redis Sentinel的程序文件名为 redis-sentinel,它通常和普通的Redis服务器 redis-server 位于同一个文件夹。因为用户需要在配置文件中指定想要被 Sentinel 监视的主服务器,并且 Sentinel 也需要在配置文件中写入信息以及记录主从服务器的状态,所以用户在启动 Sentinel 的时候必须传入一个 可写 的配置文件作为参数,如下:

redis-sentinel /etc/sentinel.conf

如果用户给定的配置文件是不可写的,那么 Sentinel 将放弃启动并报告一个错误

一个 Sentinel 配置文件至少需要包含以下选项,用于指定 Sentinel 要监视的主服务器:

sentinel monitor <master-name> <ip> <port> <quorum>

其中 <master-name> 参数用于指定主服务器的名字,这个名字在执行各种 Sentinel 操作的时候经常会用到;ip 参数和 port 参数用于指定主服务器的IP地址和端口号;而 quorum 参数则用于指定判断这个主服务器下线所需要的 Sentinel 数量。

sentinel monitor mymaster 127.0.0.1 6379 1

Sentinel 在开始监视一个主服务器之后,就会获取被监视主服务器的从服务器名单,并根据名单对各个从服务器实施监视,整个过程完全自动,所以用户只需要输入待监视的主服务器的地址就可以了,并不需要输入从服务器的地址。

redis-sentinel和redis-server之间的关系

因为Redis Sentinel实际上就是一个运行与特殊模式下的Redis服务器,所以用户也可以使用命令 redis-server sentinel.conf --sentinel 去启动一个Sentinel:这里的 --sentinel 参数用于指示Redis服务器进入Sentinel模式,从而变成一个Redis Sentinel而不是普通的Redis服务器。
同时监视多个主服务器

一个Sentinel可以监视任意数量的主服务器,而不是仅仅监视一个主服务器。如果用户想要使用Sentinel去监视多个主服务器,那么只需要在配置文件中指定多个sentinel monitor选项即可。
处理重上线的旧主服务器

Sentinel在对下线的主服务器实施故障转移之后,仍然会继续对它进行心跳检测,当这个服务器重新上线的时候,Sentinel将把它转换为当前主服务器的从服务器。
设置从服务器优先级

用户可以通过 replica-priority 配置选项来设置各个从服务器的优先级,优先级高的从服务器在 Sentinel 选择新主服务器的时候会优先被选择。replica-priority的默认值为100,这个值越小,从服务器的优先级越高。replica-priority值为0的从无服务器永远不会被选为主服务器,用户可以通过这一设置将不适合用作主服务器的从服务器排除在新主服务器的候选名单之外。
新主服务器的挑选规则

当Sentinel需要在多个从服务器中选择一个作为新的主服务器时,首先会根据以下规则从候选名单中剔除不符合条件的从服务器:
1) 否决所有已经下线以及长时间没有回复心跳检测的疑似已下线的从服务器。
2) 否决所有长时间没有与主服务器通信的,数据状态过时的从服务器。
3) 否决所有优先级为0的从服务器。
然后根据以下规则,在剩余的候选从服务器中选出新的主服务器:
1) 优先级最高的从服务器获胜。
2) 如果优先级最高的从服务器有两个或以上,那么复制偏移量最大的那个从服务器获胜。
3) 如果符合上述两个条件的从服务器有两个或以上,那么选出它们当中运行ID最小的那一个。

Sentinel网络

在实际应用中,只使用单个 Sentinel 监视主从服务器并不合适,因为:

  • 单个 Sentinel 可能会形成单点故障,当唯一的 Sentinel 出现故障时,针对主从服务器的自动故障转移将无法实施。
  • 单个 Sentinel 可能会因为网络故障而无法获得主服务器的相关信息,并因此错误的将主服务器判断为下线,继而执行实际上并无必要的故障转移操作。

为了避免 Sentinel 单点故障,并能够给出真实有效的判断结果,我们可以使用多个 Sentinel 组建一个分布式 Sentinel 网络,网络中的各个 Sentinel可以通过互通消息来更加准确地判断服务器的状态。

Sentinel 网络中的其中一个 Sentinel 认为某个主服务器已经下线时,它会将这个主服务器标记为主观下线,然后询问网络中的其他 Sentinel,是否也认为该服务器已下线。当同意主服务器下线的 Sentinel 数量达到 sentinel monitor 配置选项中 quorum 参数所指定的数量时,Sentinel 就会将相应的主服务器标记为客观下线,然后开始对其进行故障转移。

Sentinel管理命令

Redis为 Sentinel 提供了相应的管理命令,用于对 Sentinel 执行各种各样的管理操作。

Sentinel masters:获取所有被监视的主服务器的信息

通过向 Sentinel 发送以下命令,用户可以获得 Sentinel 正在监视的所有主服务器的相关信息:

Sentinel masters

命令返回的各个字段的及其意义:

在这里插入图片描述

Sentinel master:获取指定被监视主服务器的信息

如果想要获取特定主服务器的信息而不是主服务器的信息,可以使用以下命令代替 Sentinel masters命令:

Sentinel master <master-name>

这个命令只会返回用户指定的主服务器的相关信息。

Sentinel slaves:获取被监视主服务器的从服务器信息

通过使用以下命令,可以让 Sentinel 返回指定的主服务器属下所有从服务器的相关信息:

Sentinel slaves <master-name>

命令返回的字段及其意义:

在这里插入图片描述

Sentinel sentinels:获取其他Sentinel的相关信息

用户可以通过执行以下命令,获取监视同一个主服务器的其他所有Sentinel的相关信息:

Sentinel sentinels <master-name>

命令返回的字段及其含义:
在这里插入图片描述

Sentinel get-master-addr-by-name:获取给定的主服务器的IP地址和端口号

用户可以通过以下命令,通过给定的主服务器的名字来获取该服务器的IP地址和端口号:

Sentinel get-master-addr-by-name <master-name>

Sentinel reset:重置主服务器状态

Sentinel reset 命令接受一个glob风格的模式作为参数,接收到该命令的 Sentinel 将重置所有与给定模式相匹配的主服务器:

Sentinel reset <pattern>

命令将返回被重置主服务器的数量作为返回值。接收到Sentinel reset 命令的 Sentinel 除了会清理被匹配主服务器的相关信息之外,还会遗忘被匹配主服务器目前已有的所有从服务器,以及正在监视被匹配主服务器的所有其他 Sentinel。然后,这个 Sentinel将会重新搜索正在监视被匹配主服务器的其他Sentinel,以及该服务器属下的各个从服务器,并与它们重新建立连接。

Sentinel failover:强制执行故障转移

通过执行以下命令,可以强制对指定的主服务器实施故障转移:

Sentinel failover <master-name>

接收到这一命令的Sentinel 会直接对主服务器执行故障转移操作,而不会像平时那样,先在Sentinel网络中投票,然后再根据投票结果决定是否执行故障转移操作。

Sentinel ckquorum:检查可用的Sentinel数量

通过以下命令,检查Sentinel 网络中当前可用的Sentinel数量是否达到了判断主服务器客观下线并实施故障转移所需的数量:

Sentinel ckquorum <master-name>

Sentinel flushconfig:强制写入配置文件

用户可以通过向 Sentinel 发送以下命令,让 Sentinel 将它的配置文件重新写入硬盘中:

Sentinel flushconfig

因为Sentinel在被监视服务器的状态发生变化时就会自动重写配置文件,所以这个命令的作用就是在配置文件基于某些原因或错误而丢失时,立即生成一个新的配置文件。

在线配置 Sentinel

从Redis 2.8.4版本开始为 Sentinel 命令添加了一组子命令,这些子命令可以在线修改Sentinel对于监视主服务器的配置选项,并把修改后的配置选项保存到配置文件中,整个过程完全不需要停止 Sentinel,也不需要手动修改配置文件。

Sentinel monitor:监视给定的主服务器

通过以下命令,用户可以让 Sentinel 开始监视一个新的主服务器:

Sentinel monitor <master-name> <ip> <port> <quorum>

Sentinel monitor命令本质上就是 sentinel monitor配置选项的命令版本,当我们想要让 Sentinel 监视一个新的主服务器,但是又不想重启 Sentinel 并手动修改配置文件时,就可以使用该命令。

Sentinel remove:取消给定主服务器的监视

当用户想要在线取消Sentinel对某个主服务器的监视时,可以使用以下命令:

Sentinel remove <master-name>

接收到这个命令的Sentinel会停止对给定主服务器的监视,并删除Sentinel内部以及Sentinel配置文件中与给定主服务器有关的信息,然后返回OK,表示执行成功。

Sentinel set:修改Sentinel配置选项的值

通过使用以下命令,用户可以在线修改Sentinel配置文件中与主服务器有关的配置选项:

Sentinel set <master-name> <option> <value>

只要是Sentinel配置文件中与主服务器有关的配置选项,都可以使用 Sentinel set 命令在线进行配置,命令在执行成功后返回OK表示成功。

在线配置命令的注意事项

需要注意的是,以上介绍的各个在线配置命令只会对接收到命令的单个Sentinel起效,并不会对同一个Sentinel网络的其他Sentinel产生影响。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
在过去的几年中,NoSQL 数据库一度成为高并发、海量数据存储解决方案的代名词,与之相应的产 品也呈现出雨后春笋般的生机。然而在众多产品中能够脱颖而出的却屈指可数,如 Redis、MongoDB、 BerkeleyDB 和 CouchDB 等。由于每种产品所拥有的特征不同,因此它们的应用场景也存在着一定的差 异,下面仅给出简单的说明: 1). BerkeleyDB 是一种极为流行的开源嵌入式数据库,在更多情况下可用于存储引擎,比如 BerkeleyDB 在被 Oracle 收购之前曾作为 MySQL 的存储引擎,由此可以预见,该产品拥有极好的并发 伸缩性,支持事务及嵌套事务,海量数据存储等重要特征,在用于存储实时数据方面具有极高的可用价值。 然而需要指出的是,该产品的 Licence 为 GPL,这就意味着它并不是在所有情况下都是免费使用的。 2). 对 MongoDB 的定义为 Oriented-Document 数据库服务器,和 BerkeleyDB 不同的是该数据 库可以像其他关系型数据库服务器那样独立的运行并提供相关的数据服务。从该产品的官方文档中我们可 以获悉,MongoDB 主要适用于高并发的论坛或博客网站,这些网站具有的主要特征是并发访问量高、多 读少写、数据量大、逻辑关系简单,以及文档数据作为主要数据源等。和 BerkeleyDB 一样,该产品的 License 同为 GPL。 3). Redis,典型的 NoSQL 数据库服务器,和 BerkeleyDB 相比,它可以作为服务程序独立运行于 自己的服务器主机。在很多时候,人们只是将 Redis 视为 Key/Value 数据库服务器,然而事实并非如此, 在目前的版本中,Redis 除了Key/Value 之外还支持 List、Hash、Set 和Ordered Set 等数据结构,因 此它的用途也更为宽泛。对于此种误解,Redis 官网也进行了相应的澄清。和以上两种产品不同的是,Redis 的 License 是 Apache License,就目前而言,它是完全免费。 4). memcached,数据缓存服务器。为什么在这里要给出该产品的解释呢?很简单,因为笔者认为 它在使用方式上和 Redis 最为相似。毕竟这是一篇关于 Redis 的技术系列博客,有鉴于此,我们将简要的 对比一下这两个产品。首先说一下它们之间的最大区别,memcached 只是提供了数据缓存服务,一旦服 务器宕机,之前在内存中缓存的数据也将全部消失,因此可以看出 memcached 没有提供任何形式的数据 持久化功能,而 Redis 则提供了这样的功能。再有就是 Redis 提供了更为丰富的数据存储结构,如 Hash 和 Set。至于它们的相同点,主要有两个,一是完全免费,再有就是它们的提供的命令形式极为接近。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值