Sentinel其实是通过命令连接去给主从服务器发送消息的,但接收信息的时候是使用订阅连接的
在默认情况下,Sentinel会以每两秒一次的频率,通过命令连接向所有被监视的主服务器和从服务器发送以下格式的命令
publish sentinel:hello “…”
其实就是一个发布消息的命令,让主从服务器往_ sentinel _:hello的频道里面发送消息
主要有以下这些信息
| 参数 | 意义 |
| — | — |
| s_ip | Sentinel的IP地址 |
| s_port | Sentinel的端口号 |
| s_runid | Sentinel的运行ID |
| s_epoch | Sentinel当前的配置纪元 |
| m_name | 主服务器的名字 |
| m_ip | 主服务器的ip地址 |
| m_port | 主服务器的端口号 |
| m_epoch | 主服务器当前的配置纪元 |
注意,这里的m_开头的属性是被Sentinel监视的服务器的属性,一定是主服务器的信息,如果被监视的是主服务器,就是主服务器本身的信息,如果是从服务器就是从服务器正在复制的主服务器的信息。
s_开头的属性就是Sentinel本身的信息。
Sentinel系统通过命令连接,让服务器去发送自己想要的信息,然后Sentinel系统通过订阅连接,获取服务器发送在频道里面的信息,这就是整个发送与接收流程。
但为什么要采用订阅方式去实现呢?接收这些信息有什么用?如何区分这条消息是自己发送的呢?
-
Sentinel系统不止只有一个Sentinel服务器,当然每台主服务器也不止有一台Sentinel监视它,Sentinel系统里面的所有监视该主服务器的Sentinel都会去订阅主服务器的sentinel:hello频道,所以只要被监视的服务器往该频道上发送信息,所有监视该主服务器的Sentinel都是可以收到的
-
这些信息会被用于更新其他监视该服务器的Sentinel对被监视服务器的认知,同时也会更新其他监视该服务器的Sentinel对发送信息Sentinel的认知。
-
发送信息里面有一个参数s_runid,Sentinel会通过比较自己的RunId是否匹配,如果匹配,证明是自己发的,那么就不做处理直接丢弃,如果不匹配,证明不是自己发的,接收到信息的其他Sentinel会根据信息中的各个参数,对相应主服务器的实例结构进行更新
前面提到过,SentinelRedisInstance不仅会保存主服务器信息、从服务器信息,甚至还会保存其余Sentinel信息,主服务器信息有对应的master字典,从服务器信息有对应的slave字典,所以Sentinel信息也有自己的sentinels字典(这个字典与slave字典一样,也是被保存在主服务器实例对象里面的)。
-
Sentinels字典的键是Sentinel的名字,格式也是为ip:port(配置文件那里可以规定Sentinel的port)
-
Sentinels字典的值则是对应的Sentinel的实例结构
上面提到了,监视同一台服务器的Sentinel都可以收到服务器发送的信息(信息里面有要求发送的Sentinel的信息)。
当一个Sentinel收到了其他Sentinel的信息时(也就是服务器发送信息里面的Sentinel信息,通过匹配Runid来区分是不是自己要求发送的),目标Sentinel(接收到信息的Sentinel)就会从信息中分析并且提取出下面列出的两方面参数
-
与发送方Sentinel有关的参数:源Sentinel的ip地址、端口号、运行ID和配置纪元
-
与被监视的主服务器有关的参数:源Sentinel正在监视的主服务器的名字、ip地址、端口号和配置纪元
目标Sentinel收到主服务器有关的参数,就会去找自己master字典里面对应的主服务器实例(一般来说都会对应的上,因为只有监视同一台主服务器,才会订阅相同服务器的频道),找到主服务器实例之后,就找里面的sentinels字典,根据提出的源Sentinel相关的参数,去看看源Sentinel的实例是否已经存在。
对比完之后就会出现下面两种情况
-
源Sentinel的实例结构已经存在:那么对找到的源Sentinel实例进行信息更新即可
-
源Sentinel的实力结构不存在:那么说明了,这是一台新加入的Sentinel,该新加入的Sentinel与自己监视的主服务器还是同一台,目标Sentinel就会为其创建一个新的实例结构,并且将这个结构加入到Sentinels字典中去。
这也是为什么,在Sentinel的配置文件里面不需要专门去配置其他监视同一台服务器的Sentinel的地址信息,然后就构成了一个Sentinels系统。
自我介绍一下,小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。
深知大多数Java工程师,想要提升技能,往往是自己摸索成长或者是报班学习,但对于培训机构动则几千的学费,着实压力不小。自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!
因此收集整理了一份《2024年Java开发全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。
既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上Java开发知识点,真正体系化!
由于文件比较大,这里只是将部分目录截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且会持续更新!
如果你觉得这些内容对你有帮助,可以扫码获取!!(备注Java获取)
![img](https://i-blog.csdnimg.cn/blog_migrate/664ae4bb216a4d5583d8a5eb5590ea31.jpeg)
总结
我个人认为,如果你想靠着背面试题来获得心仪的offer,用癞蛤蟆想吃天鹅肉形容完全不过分。想必大家能感受到面试越来越难,想找到心仪的工作也是越来越难,高薪工作羡慕不来,却又对自己目前的薪资不太满意,工作几年甚至连一个应届生的薪资都比不上,终究是错付了,错付了自己没有去提升技术。
这些面试题分享给大家的目的,其实是希望大家通过大厂面试题分析自己的技术栈,给自己梳理一个更加明确的学习方向,当你准备好去面试大厂,你心里有底,大概知道面试官会问多广,多深,避免面试的时候一问三不知。
大家可以把Java基础,JVM,并发编程,MySQL,Redis,Spring,Spring cloud等等做一个知识总结以及延伸,再去进行操作,不然光记是学不会的,这里我也提供一些脑图分享给大家:
希望你看完这篇文章后,不要犹豫,抓紧学习,复习知识,准备在明年的金三银四拿到心仪的offer,加油,打工人!
《一线大厂Java面试题解析+核心总结学习笔记+最新讲解视频+实战项目源码》,点击传送门即可获取!
]
希望你看完这篇文章后,不要犹豫,抓紧学习,复习知识,准备在明年的金三银四拿到心仪的offer,加油,打工人!
《一线大厂Java面试题解析+核心总结学习笔记+最新讲解视频+实战项目源码》,点击传送门即可获取!