前言
Redis作为内存数据库,需要具备高可用的特点,不然如果服务器宕机,还在内存里的数据就会丢失。我们最常用的高可用方法就是搭建集群,master机器挂了,可以让slave机器顶上,继续提供服务。但是Redis集群是不会自动进行主从切换的,也就是说,如果主节点非常不争气的在凌晨3点挂了,那么运维同学就要马上起床,把从节点改成主节点,这样的操作是非常繁琐低效的。为此,Redis官方提供了一种解决方案:Redis Sentinel
简介
Redis Sentinel集群通常由3到5个节点组成,如果个别节点挂了,集群还可以正常运作。它负责监控Redis集群的健康情况。如果主节点挂掉,Sentinel集群会通过投票选择一个新的主节点。当原来的主节点恢复时,它会被当做新的主节点的从节点重新加入Redis集群。
基本原理
Sentinel集群通过指定的配置文件发现master,对其进行监控,并且会发送info指令获取master的从节点信息。Sentinel集群中的节点通过向其监控的主从节点发送hello信息(包含Sentinel本身的ip、端口和id等内容)来向其他Sentinel宣告自己的存在。
Sentinel集群通过订阅连接来接收其他Sentinel的hello信息。
Sentinel集群通过ping命令来检查监控的实例状态,如果在指定时间内没有返回,则认为该实例下线。
Sentinel触发failover主从切换后,并不会马上进行,只有指定(quorum)Sentinel授权后,master节点被标记为ODOWN状态。这时才真正开始投票选择新的master。
Sentinel选择新的master的原则是:首先判断优先级,选择优先级较小的;如果优先级相同,查看复制下标,选择复制数据较多的;如果复制下标也相同,就选择进程ID较小的。
Sentinel被授权后,它将会获得宕掉的master的一份最新配置版本号(config-epoch),当failover执行结束以后,这个版本号将会被用于最新的配置,通过广播形式通知其它Sentinel,其它的Sentinel则更新对应master的配置。
基本使用
我们以Python为例,简单说明一下在客户端如何使用Sentinel
from redis.sentinel import Sentinel if __name__ == '__main__': sentinel = Sentinel(['localhost', 26379], socket_timeout=0.1) print(sentinel.discover_master('mymaster')) print(sentinel.discover_slaves('mymaster')) master = sentinel.master_for('mymaster', socket_timeout=0.1) slave = sentinel.slave_for('mymaster', socket_timeout=0.1) master.set('follow', 'Jackeyzhe2018') follow = slave.get('follow') print(follow)
master_for和slave_for方法会从连接池中拿出一个连接来使用,如果从地址有多个,则会采用轮询的方法。
当redis发生了主从切换时,客户端如何知道地址已经变更了呢?我们从redis-py的源码里找一找答案。
可以看到,redis在创建一个新的连接时,会调用get_master_address方法来获取主节点地址。get_master_address方法中,客户端先查询主节点地址,然后与内存中的地址进行比较。如果不一致,则会断开连接,然后使用新的地址重新进行连接。
如果主节点没有挂,而Sentinel主动进行了主从切换,对于这种情况redis-py也做了处理。就是捕获一个ReadOnlyError的异常,然后断开连接,后续指令都需要重新进行连接了。当然,如果没有修改性指令,那么连接就不会切换,不过数据也不会被破坏,所以影响不大。
动手搭建
关于Sentinel的工作原理和使用方法我们已经有了大概的认识,为了加深理解,我们来自己动手搭建一套Sentinel集群。
首先搭建我们我需要的redis集群环境
安装好redis后,将redis目录下的配置文件redis.conf复制3份。分别命名为redis6379.conf,redis6380.conf,redis6381.conf。
在redis6381.conf文件中修改以下几项
bind 127.0.0.1 port 6381 logfile "6381.log" dbfilename "dump-6381.rdb"
在redis6379.conf中修改
bind 127.0.0.1 port 6379 logfile "6379.log" dbfilename "dump-6379.rdb" slaveof 127.0.0.1 6381
redis6380.conf的修改参照redis6379.conf。修改完成后,分别启动三个实例。就搭建好了我们想要的redis主从环境了。
我们连接上master节点,可以看到它的主从配置信息
接着,我们来配置Sentinel集群。这里我们同样配置三个实例。复制3份sentinel.conf文件,分别命名为sentinel-26379.conf,sentinel-26380.conf和sentinel-26381.conf。
sentinel-26379.conf文件中编辑以下内容
port 26379 daemonize yes logfile "26379.log" dir /home/xxx/redis/data sentinel monitor mymaster 127.0.0.1 6381 2 sentinel down-after-milliseconds mymaster 30000 sentinel parallel-syncs mymaster 1 sentinel failover-timeout mymaster 180000
sentinel-26380.conf和sentinel-26381.conf的内容与上述类似。配置好后,我们使用命令redis-sentinel来启动3个sentinel实例。
此时,我们用redis-cli命令连接26379的实例,查看sentinel的信息。
发现它已经开始监控我们的3个redis节点了。这时我们的整个集群就部署好了,接下来测试一下。
kill掉master节点,查看sentinel的日志,会发现sentinel已经按照我们前面说的步骤选择了新的master。
此时再来看sentinel信息。
此时,6380已经成了新的master。
恭喜你,以后都不需要在凌晨起床切换Redis主从实例了。
总结:
以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作具有一定的参考学习价值,如果有疑问大家可以留言交流,谢谢大家对的支持。
免责声明:本站资源来自互联网收集,仅供用于学习和交流,请遵循相关法律法规,本站一切资源不代表本站立场,如有侵权、后门、不妥请联系本站删除!
《魔兽世界》大逃杀!60人新游玩模式《强袭风暴》3月21日上线
暴雪近日发布了《魔兽世界》10.2.6 更新内容,新游玩模式《强袭风暴》即将于3月21 日在亚服上线,届时玩家将前往阿拉希高地展开一场 60 人大逃杀对战。
艾泽拉斯的冒险者已经征服了艾泽拉斯的大地及遥远的彼岸。他们在对抗世界上最致命的敌人时展现出过人的手腕,并且成功阻止终结宇宙等级的威胁。当他们在为即将于《魔兽世界》资料片《地心之战》中来袭的萨拉塔斯势力做战斗准备时,他们还需要在熟悉的阿拉希高地面对一个全新的敌人──那就是彼此。在《巨龙崛起》10.2.6 更新的《强袭风暴》中,玩家将会进入一个全新的海盗主题大逃杀式限时活动,其中包含极高的风险和史诗级的奖励。
《强袭风暴》不是普通的战场,作为一个独立于主游戏之外的活动,玩家可以用大逃杀的风格来体验《魔兽世界》,不分职业、不分装备(除了你在赛局中捡到的),光是技巧和战略的强弱之分就能决定出谁才是能坚持到最后的赢家。本次活动将会开放单人和双人模式,玩家在加入海盗主题的预赛大厅区域前,可以从强袭风暴角色画面新增好友。游玩游戏将可以累计名望轨迹,《巨龙崛起》和《魔兽世界:巫妖王之怒 经典版》的玩家都可以获得奖励。
更新日志
- 【雨果唱片】中国管弦乐《鹿回头》WAV
- APM亚流新世代《一起冒险》[FLAC/分轨][106.77MB]
- 崔健《飞狗》律冻文化[WAV+CUE][1.1G]
- 罗志祥《舞状元 (Explicit)》[320K/MP3][66.77MB]
- 尤雅.1997-幽雅精粹2CD【南方】【WAV+CUE】
- 张惠妹.2007-STAR(引进版)【EMI百代】【WAV+CUE】
- 群星.2008-LOVE情歌集VOL.8【正东】【WAV+CUE】
- 罗志祥《舞状元 (Explicit)》[FLAC/分轨][360.76MB]
- Tank《我不伟大,至少我能改变我。》[320K/MP3][160.41MB]
- Tank《我不伟大,至少我能改变我。》[FLAC/分轨][236.89MB]
- CD圣经推荐-夏韶声《谙2》SACD-ISO
- 钟镇涛-《百分百钟镇涛》首批限量版SACD-ISO
- 群星《继续微笑致敬许冠杰》[低速原抓WAV+CUE]
- 潘秀琼.2003-国语难忘金曲珍藏集【皇星全音】【WAV+CUE】
- 林东松.1997-2039玫瑰事件【宝丽金】【WAV+CUE】