Redis学习笔记(8)-redis一主多从搭建高可用环境之哨兵

哨兵是用来监控主数据库和从数据库的,一旦主数据库发生宕机,哨兵可以将从数据库切换为主数据库,这种机制,无需人工干预,提升了数据库的高可用性。哨兵是一个独立的进程,一个哨兵可以监控多个数据库,同时一个数据库也可以被多个哨兵监控。

哨兵的使用

首先需要按照前面一小节,搞一个一主多从的数据库实例结构。假设有三台机器6379,6340,6341,其中6379为主,后面两为从。现在我们开始配置哨兵:
打开sentinel.conf文件,对端口和监控的主数据库进行配置:

# port 
# The port that this sentinel instance will run on
port 26379
# sentinel monitor    
#
# Tells Sentinel to monitor this master, and to consider it in O_DOWN
# (Objectively Down) state only if at least  sentinels agree.
#
# Note that whatever is the ODOWN quorum, a Sentinel will require to
# be elected by the majority of the known Sentinels in order to
# start a failover, so no failover can be performed in minority.
#
# Replicas are auto-discovered, so you don't need to specify replicas in
# any way. Sentinel itself will rewrite this configuration file adding
# the replicas using additional configuration options.
# Also note that the configuration file is rewritten when a
# replica is promoted to master.
#
# Note: master name should not include special characters or spaces.
# The valid charset is A-z 0-9 and the three characters ".-_".
sentinel monitor mymaster 127.0.0.1 6379 1

mymaster是给主数据起的名字,后面是主数据库的ip和端口,最后的1代表最低通过票数。

启动sentinel:

redis-sentinel sentinel.conf

此时,哨兵哨兵就能监控三个redis实例了,当主数据库宕机后,哨兵会帮我们从从数据库中挑选一个成为主数据库。

哨兵实现的原理

哨兵的原理只要记住三个interval就行:

第一个interval,10,哨兵每隔10秒会向监控的主数据库节点发送INFO命令,以此来更新数据的信息,比如有新的从数据库加入,或者,有从数据库离开,或者主数据库的信息发生变更。sentinel.conf里之所以只要配置一个主数据库的信息,也是因为可以通过此机制获取整个主从复制的信息。

第二个interval,2,哨兵会每隔2秒向主从数据的__sentinel__:hello频道发送数据,其他哨兵监控数据__sentinel__:hello的频道来获取哨兵分享的消息来更新自己的认知。如果有发现新的哨兵加入,会将其加入哨兵列表,并建立连接。

第三个interval,1,哨兵每隔1秒会向所有的主从数据库,哨兵,发送PING命令,如果发现其在指定的时间内没有反馈,则主观认为其下线。如果下线的是主数据库,则向其他哨兵发送命令SENTINEL is_master_down_by_addr咨询其他哨兵该节点的情况,如果超过指定数量(配置文件中指定的quorun)的哨兵也主观认为该节点下线,则此节点客观下线。

当确认主数据库宕机,则需要进行故障恢复。为了让同一时刻只有一个哨兵来进行故障恢复,需要进行领头哨兵的选举。

领头哨兵的选举过程

如果哨兵发现主数据库主管下线,则向其他哨兵发起请求,让其他哨兵选举自己成为领头哨兵。

如果哨兵接到请求选举的时候,没有选择其他哨兵,则选举该哨兵为领头哨兵。

如果有超过半数且超过quorun的哨兵选举自己为领头哨兵,则自己将成为领头哨兵。

如果选不出领头哨兵,则等待一段时间,继续发起领头哨兵选举。

主数据的选择

领头哨兵会按如下优先级对从数据中选一个作为主数据库:
A)slave-priority高的优先
B)复制偏移量大的优先
C)ID小的优先
选举完毕后,会对选出来的从数据执行 slaveof no one,对其他数据库发送 slaveof来进行复制,旧的主数据库也将成为新的主数据库的从数据库。

哨兵的部署

尽量将哨兵的网络环境与节点保持一致,设置quorun为N/2+1,N为哨兵节点的数量,相对稳妥的方案,每个节点部署一个哨兵。

你可能感兴趣的:(redis)