array(2) { ["docs"]=> array(10) { [0]=> array(10) { ["id"]=> string(3) "428" ["text"]=> string(77) "Visual Studio 2017 单独启动MSDN帮助(Microsoft Help Viewer)的方法" ["intro"]=> string(288) "目录 ECharts 异步加载 ECharts 数据可视化在过去几年中取得了巨大进展。开发人员对可视化产品的期望不再是简单的图表创建工具,而是在交互、性能、数据处理等方面有更高的要求。 chart.setOption({ color: [ " ["username"]=> string(8) "DonetRen" ["tagsname"]=> string(55) "Visual Studio 2017|MSDN帮助|C#程序|.NET|Help Viewer" ["tagsid"]=> string(23) "[401,402,403,"300",404]" ["catesname"]=> string(0) "" ["catesid"]=> string(2) "[]" ["createtime"]=> string(10) "1511400964" ["_id"]=> string(3) "428" } [1]=> array(10) { ["id"]=> string(3) "427" ["text"]=> string(42) "npm -v;报错 cannot find module "wrapp"" ["intro"]=> string(288) "目录 ECharts 异步加载 ECharts 数据可视化在过去几年中取得了巨大进展。开发人员对可视化产品的期望不再是简单的图表创建工具,而是在交互、性能、数据处理等方面有更高的要求。 chart.setOption({ color: [ " ["username"]=> string(4) "zzty" ["tagsname"]=> string(50) "node.js|npm|cannot find module "wrapp“|node" ["tagsid"]=> string(19) "[398,"239",399,400]" ["catesname"]=> string(0) "" ["catesid"]=> string(2) "[]" ["createtime"]=> string(10) "1511400760" ["_id"]=> string(3) "427" } [2]=> array(10) { ["id"]=> string(3) "426" ["text"]=> string(54) "说说css中pt、px、em、rem都扮演了什么角色" ["intro"]=> string(288) "目录 ECharts 异步加载 ECharts 数据可视化在过去几年中取得了巨大进展。开发人员对可视化产品的期望不再是简单的图表创建工具,而是在交互、性能、数据处理等方面有更高的要求。 chart.setOption({ color: [ " ["username"]=> string(12) "zhengqiaoyin" ["tagsname"]=> string(0) "" ["tagsid"]=> string(2) "[]" ["catesname"]=> string(0) "" ["catesid"]=> string(2) "[]" ["createtime"]=> string(10) "1511400640" ["_id"]=> string(3) "426" } [3]=> array(10) { ["id"]=> string(3) "425" ["text"]=> string(83) "深入学习JS执行--创建执行上下文(变量对象,作用域链,this)" ["intro"]=> string(288) "目录 ECharts 异步加载 ECharts 数据可视化在过去几年中取得了巨大进展。开发人员对可视化产品的期望不再是简单的图表创建工具,而是在交互、性能、数据处理等方面有更高的要求。 chart.setOption({ color: [ " ["username"]=> string(7) "Ry-yuan" ["tagsname"]=> string(33) "Javascript|Javascript执行过程" ["tagsid"]=> string(13) "["169","191"]" ["catesname"]=> string(0) "" ["catesid"]=> string(2) "[]" ["createtime"]=> string(10) "1511399901" ["_id"]=> string(3) "425" } [4]=> array(10) { ["id"]=> string(3) "424" ["text"]=> string(30) "C# 排序技术研究与对比" ["intro"]=> string(288) "目录 ECharts 异步加载 ECharts 数据可视化在过去几年中取得了巨大进展。开发人员对可视化产品的期望不再是简单的图表创建工具,而是在交互、性能、数据处理等方面有更高的要求。 chart.setOption({ color: [ " ["username"]=> string(9) "vveiliang" ["tagsname"]=> string(0) "" ["tagsid"]=> string(2) "[]" ["catesname"]=> string(8) ".Net Dev" ["catesid"]=> string(5) "[199]" ["createtime"]=> string(10) "1511399150" ["_id"]=> string(3) "424" } [5]=> array(10) { ["id"]=> string(3) "423" ["text"]=> string(72) "【算法】小白的算法笔记:快速排序算法的编码和优化" ["intro"]=> string(288) "目录 ECharts 异步加载 ECharts 数据可视化在过去几年中取得了巨大进展。开发人员对可视化产品的期望不再是简单的图表创建工具,而是在交互、性能、数据处理等方面有更高的要求。 chart.setOption({ color: [ " ["username"]=> string(9) "penghuwan" ["tagsname"]=> string(6) "算法" ["tagsid"]=> string(7) "["344"]" ["catesname"]=> string(0) "" ["catesid"]=> string(2) "[]" ["createtime"]=> string(10) "1511398109" ["_id"]=> string(3) "423" } [6]=> array(10) { ["id"]=> string(3) "422" ["text"]=> string(64) "JavaScript数据可视化编程学习(二)Flotr2,雷达图" ["intro"]=> string(288) "目录 ECharts 异步加载 ECharts 数据可视化在过去几年中取得了巨大进展。开发人员对可视化产品的期望不再是简单的图表创建工具,而是在交互、性能、数据处理等方面有更高的要求。 chart.setOption({ color: [ " ["username"]=> string(7) "chengxs" ["tagsname"]=> string(28) "数据可视化|前端学习" ["tagsid"]=> string(9) "[396,397]" ["catesname"]=> string(18) "前端基本知识" ["catesid"]=> string(5) "[198]" ["createtime"]=> string(10) "1511397800" ["_id"]=> string(3) "422" } [7]=> array(10) { ["id"]=> string(3) "421" ["text"]=> string(36) "C#表达式目录树(Expression)" ["intro"]=> string(288) "目录 ECharts 异步加载 ECharts 数据可视化在过去几年中取得了巨大进展。开发人员对可视化产品的期望不再是简单的图表创建工具,而是在交互、性能、数据处理等方面有更高的要求。 chart.setOption({ color: [ " ["username"]=> string(4) "wwym" ["tagsname"]=> string(0) "" ["tagsid"]=> string(2) "[]" ["catesname"]=> string(4) ".NET" ["catesid"]=> string(7) "["119"]" ["createtime"]=> string(10) "1511397474" ["_id"]=> string(3) "421" } [8]=> array(10) { ["id"]=> string(3) "420" ["text"]=> string(47) "数据结构 队列_队列实例:事件处理" ["intro"]=> string(288) "目录 ECharts 异步加载 ECharts 数据可视化在过去几年中取得了巨大进展。开发人员对可视化产品的期望不再是简单的图表创建工具,而是在交互、性能、数据处理等方面有更高的要求。 chart.setOption({ color: [ " ["username"]=> string(7) "idreamo" ["tagsname"]=> string(40) "C语言|数据结构|队列|事件处理" ["tagsid"]=> string(23) "["246","247","248",395]" ["catesname"]=> string(12) "数据结构" ["catesid"]=> string(7) "["133"]" ["createtime"]=> string(10) "1511397279" ["_id"]=> string(3) "420" } [9]=> array(10) { ["id"]=> string(3) "419" ["text"]=> string(47) "久等了,博客园官方Android客户端发布" ["intro"]=> string(288) "目录 ECharts 异步加载 ECharts 数据可视化在过去几年中取得了巨大进展。开发人员对可视化产品的期望不再是简单的图表创建工具,而是在交互、性能、数据处理等方面有更高的要求。 chart.setOption({ color: [ " ["username"]=> string(3) "cmt" ["tagsname"]=> string(0) "" ["tagsid"]=> string(2) "[]" ["catesname"]=> string(0) "" ["catesid"]=> string(2) "[]" ["createtime"]=> string(10) "1511396549" ["_id"]=> string(3) "419" } } ["count"]=> int(200) } 222 第十八章《redis哨兵》 - 爱码网

redis sentinel(redis哨兵)
一、redis哨兵简介
特殊的redis节点,不是数据节点。用来监控数据节点,如果数据节点故障,能够对该节点进行下线标识,如果故障的节点是主节点,sentinel可以实现自动的故障切换。

二、故障转移的流程
1.主节点发生故障后,客户端连接主节点失败,两个从节点连接主节点失败,复制中断;
2.如果主节点无法正常启动,需要选出一个从节点(slave-1) ,对其执行slaveof no one
命令使其成为新的主节点;
3.更新应用方的主节点设置,让应用方连接到新的主节点;
4.客户端命令另一个从节点(slave-2)去复制新的主节点;
5.原来的主节点恢复后,让它作为从节点去复制新的主节点。

三、为什么sentinel要以集群的方式存在?
单个sentinel来监控数据节点会出现两个问题:
1.一旦sentinel节点故障,无法监控并自动故障转移;
2.由于网络或其他问题可能导致sentinel对数据节点故障的误判;
由于以上问题,所以一般用3个或更多的sentinel节点;

四、sentinel的选举
(1) sentinel节 点会监控数据节点以及其他的sentinel节点,如果发现主节点故障,sentinel会将信息发送给其他的sentinel节点,如果大多数sentinel节点都认为主节点下线了,就会选出一个leader节点去执行故障转移;
达到一半+1数量的sentinel节点同意选出leader节点

启动sentinel节点的命令:
(1)redis-sentinel sentinel.conf
(2)redis-server sentinel.conf --sentinel

sentinel的命令:
1.sentinel masters 或 sentinel master mastername
查看sentinel监控的主节点信息:
2.sentinel slaves mastername:
查看mastername集群的从节点信息:
3.sentinel sentinels mastername
查看其他sentinel节点的信息
4.sentinel reset mastername/
清除主节点的相关状态,重新发现主节点和sentinel节点
5.sentinel failover mastername
对指定的mastername进行强制故障转移(没有和其他的sentinel节点商量),当故障转移完成后再将信息发送给其他的sentinel节点,使其更新自身配置。
6.sentinel ckquorum mastername
检测当前主机点的哨兵是否达到quorum的个数
7.sentinel flushconfig
将sentinel节点的配置信息强制写到磁盘上
8.sentinel remove mastername
取消当前sentinel节点对于mastername主节点的监控;
9.sentinel monitor mastername ip port quorum
指定主节点ip、端口、quorum等

sentinel实现监控和故障转移的原理:
sentinel的3个定时任务
(1)每隔秒给主节点发送info命令获取集群的拓扑结构
(2)每隔2秒,向redis的_sentinel_:hello频道发送sentinel节点对于主节点的判断以及当前sentinel节点的信息;
sentinel节点之间进行主节点状态信息的交换,作为后面客观下线和leader sentinel节点选举的依据;
(3)每隔一秒,每隔sentinel节点会向主节点、从节点,其他sentinel节点发送一条ping命令做心跳检测,来确认这些节点的存活状态

主观下线:
当sentinel节点在超过down-after-millisencons 这个配置设置的时间没有收到主节点的回应,就会主观的认为主节点下线了,就会在频道里发送节点下线信息;

客观下线:
sentinel节点主观判断主节点下线后,会在频道里发送sentinel is-master-down-by-addr <current_epoch> 这个命令,如果超过quorum个sentinel都认为主节点下线,那么就是客观下线,接下来就是选举leader,执行故障转移;

当等于 “ * ”时候,作用是sentinel节点之间交换对主节点下线的判断,当等于当前sentinel节点的runid时,作用是希望其他sentinel节点同意自己成为leader的请求。

实际部署需要注意的点:
1.不要将多个sentinel节点部署在同一台服务器上;
2.一般部署3个或多余3个的奇数个sentinel节点;
3.我们可以用一套sentinel集群来监控多个主节点,也可以每个主节点都部署一套sentinel集群;
(1)一套sentinel监控多个主节点:
优点:降低维护成本,方便维护
缺点:一旦sentinel集群出现问题,多个主从的故障转移就会失败
(2)每个主节点都部署一条
优点:每套sentinel都是彼此隔离的,相互不受影响
缺点:造成资源浪费

五、哨兵实验:
先配置一主两从
关闭所有的防火墙
master节点
修改配置文件
第十八章《redis哨兵》
第十八章《redis哨兵》
第十八章《redis哨兵》
第十八章《redis哨兵》
启动redis
第十八章《redis哨兵》
进入redis
第十八章《redis哨兵》
两个slave节点
修改配置文件
第十八章《redis哨兵》
第十八章《redis哨兵》
第十八章《redis哨兵》
第十八章《redis哨兵》
第十八章《redis哨兵》
启动redis
第十八章《redis哨兵》
进入redis
第十八章《redis哨兵》
三台复制配置文件
第十八章《redis哨兵》
修改配置文件
第十八章《redis哨兵》
第十八章《redis哨兵》
三台启动命令
redis-sentinel sentinel1.conf

进入
第十八章《redis哨兵》
查看主节点信息
第十八章《redis哨兵》
故障转移shutdown之后等待30秒登录
验证一下
第十八章《redis哨兵》
去从节点看一下节点信息
第十八章《redis哨兵》

主节点的redis-server宕机,然后主节点的redis-cli就无法登录,等30秒之后登录redis-cli -p 26379,输入命令sentinel master mymaster或者sentinel sentinels mymaster查看sentinel的主节点信息,查看是否切换成功,去从节点登录redis-cli,输入info replication查看节点信息
主节点宕机,故障切换,其中的一个从就变成了主,然后把主节点重启,主节点就会变成从节点

相关文章: