欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

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

程序员文章站 2022-03-05 09:54:35
...

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

哨兵的使用

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

# port <sentinel-port>
# The port that this sentinel instance will run on
port 26379
# sentinel monitor <master-name> <ip> <redis-port> <quorum>
#
# Tells Sentinel to monitor this master, and to consider it in O_DOWN
# (Objectively Down) state only if at least <quorum> 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