Redis从入门到精通(七、Redis Sentinel)

2019-06-16  本文已影响0人  QuoVadis_k

Redis Sentinel 是 Redis官方提供的高可用解决方案。Redis本身可以实现主从复制,但是并没有自动切换主备的功能,当出现其中一个主实例宕机的情况,客户端将无法执行写入命令,Sentinel可以在没有人工干预的情况下执行故障转移,不影响正常的写入操作。Sentinel是一个分布式的系统,多个Sentinel进程之间协调工作,一来保证故障检测的误报率,二来保证了Sentinel本身的可用性。

Sentinel提供了以下功能:

配置

我挑了一些主要的配置项出来,其它的都与redis.conf类似

# sentinel announce-ip <ip>
# sentinel announce-port <port>

sentinel auth-pass mymaster <password>

# sentinel monitor <master-group-name> <ip> <port> <quorm>
sentinel monitor mymaster 127.0.0.1 6379 2

# sentinel down-after-milliseconds <master-name> <milliseconds>
sentinel down-after-milliseconds mymaster 30000

# sentinel parallel-syncs <master-name> <numreplicas>
sentinel parallel-syncs mymaster 1

# sentinel failover-timeout <master-name> <milliseconds>
sentinel failover-timeout mymaster 180000

启动

可以通过以下两种方式开启Sentinel:

redis-server sentinel.conf --sentinel

redis-sentinel sentinel.conf

Sentinel 解析

任何一个sentinel实例主要达到SDOWN的条件,就将该服务器标记为 SDOWN,如果有至少 qurom 个实例都认为该服务器SDOWN,就标记为 ODOWN,此时触发故障转移,需要满足大多数Sentinel实例的授权才能进行故障转移。例设有5个sentinel 实例,配置 qurom 为 2 , 5个实例,有2个认为服务器无法访问,就尝试故障转移,只有3个或以上实例授权后才能执行故障转移,如果qurom设置为5,则当ODOWN时,直接进行故障转移。

Sentinel 实例之间的通信

Sentinel 实例之间通过名为 __sentinel__:hello 的 Pub/Sub channel 进行通信

SDOWN 和 ODOWN状态

Sentinel 每隔1秒向服务器发出 ping 命令,如果服务器距离上次回复ping 已经超过了 down-after-milliseconds 所设置的时长,或者不是以下三个中的命令时,sentinel 认为这个服务器下线了(主观下线):

当多个sentinel实例(qurom)对同一个服务器做出主观下线的判断后,状态变为 ODOWN

Slave 选择和优先权

当Sentinel开始执行故障转移时,需要在 从服务器之间选出一个,来提升为主服务器,只要参考以下4个方面:

  1. 与原主服务器断开连接的时长
  2. Slave priority,在 redis.conf 中有配置 slave-priority,默认为100,数字越小将越优先
  3. 已经处理的复制偏移量
  4. Run ID

分区下的一致性

             +-------------+
             | Sentinel 1  | <--- Client A
             | Redis 1 (M) |
             +-------------+
                     |
                     |
 +-------------+     |                     +------------+
 | Sentinel 2  |-----+-- / partition / ----| Sentinel 3 | <--- Client B
 | Redis 2 (S) |                           | Redis 3 (M)|
 +-------------+                           +------------+

初始状态下redis3是master, redis1和redis2是slave。之后redis3所在的主机网络不可用了,sentinel1和sentinel2启动了failover并把redis1选举为master。

Sentinel集群的特性保证了sentinel1和sentinel2得到了关于master的最新配置。但是sentinel3依然持着的是旧的配置,因为它与外界隔离了。

客户端将依然可以向redis3写数据,但是当网络恢复后,redis3就会变成redis的一个slave,那么,在网络隔离期间,客户端向redis3写的数据将会丢失。

如果你把redis当做缓存来使用,那么你也许能容忍这部分数据的丢失。
但如果你把redis当做一个存储系统来使用,你也许就无法容忍这部分数据的丢失了。

因为redis采用的是异步复制,在这样的场景下,没有办法避免数据的丢失。然而,你可以通过以下配置来配置redis3和redis1,使得数据不会丢失。

可以通过下面2个参数进行配置,保证只要有一个从服务器断开了与主服务器的连接就不执行写入操作。具体可以参考 Redis从入门到精通(六、Redis主从复制)

min-slaves-to-write 1
min-slaves-max-lag 10

Sentinel persistent state

Sentinel状态保留在sentinel配置文件中。这意味着停止并重新启动Sentinel进程是安全的。


更多详细资料参考:

Redis Sentinel 官方文档

上一篇 下一篇

猜你喜欢

热点阅读