redis集群 + 哨兵 + zookeeper_技术干货 | Redis的哨兵和集群

e4c87a4b408c6b9b83f9003b7576dabd.png

Redis全称REmote DIctionary Server,是一个开源的使用ANSI C语言编写、遵守BSD协议、支持网络、可基于内存亦可持久化的日志型、Key-Value数据库,并提供多种语言的API。它通常被称为数据结构服务器,因为值(value)可以是字符串(String), 哈希(Hash), 列表(list), 集合(sets) 和有序集合(sorted sets)等类型。

Redis经常会被用于数据的缓存,session共享等场景下,Redis的本身的高可用就特别值得关注,我们来针对常用的两种高可用架构进行说明。

◆◆Redis Sentinel(哨兵)◆◆

Redis Sentinel集群是由若干Sentinel节点组成的分布式集群,可以实现故障发现、故障自动转移、配置中心和客户端通知。Redis Sentinel的节点数量要满足2n+1(n>=1)的奇数个。

哨兵模式其实是有2个集群在同时工作,一个是sentinel的集群,一个是数据节点的集群。典型的一个高可用架构如下图所示:

640

Sentinel架构的主要作用是解决主从模式下主节点的故障转移工作的。这里如果主节点因为故障下线,那么某个sentinel节点发送检测消息给主节点时,如果在指定时间内收不到回复,那么该sentinel就会主观的判断该主节点已经下线,那么其会发送消息给其余的sentinel节点,询问其是否“认为”该主节点已下线,其余的sentinel收到消息后也会发送检测消息给主节点,如果其认为该主节点已经下线,那么其会回复向其询问的sentinel节点,告知其也认为主节点已经下线,当该sentinel节点最先收到超过指定数目(配置文件中配置的数目和当前sentinel节点集合数的一半,这里两个数目的较大值)的sentinel节点回复说当前主节点已下线,那么其就会对主节点进行故障转移工作。转移完成后,sentinel也会通知客户端进行节点的转移。

◆◆客户端实现◆◆

客户端从过去直接连接Redis ,变成先连接一个Sentinel实例使用 SENTINEL get-master-addr-by-name master-name 获取Redis地址信息。

连接返回的Redis地址信息,通过ROLE命令查询是否是Master。如果是,连接进入正常的服务环节。否则应该断开重新查询。

(可选)客户端可以通过SENTINEL sentinels 来更新自己的Sentinel实例列表。当Sentinel发起failover后,切换了新的Master,Sentinel会发送 CLIENT KILL TYPE normal命令给客户端,客户端需要主动断开对老的Master的链接,然后重新查询新的Master地址,再重复走上面的流程。这样的方式仍然相对不够实时,可以通过Sentinel提供的Pub/Sub来更快地监听到failover事件,加快重连。

◆◆生产环境推荐◆◆

对于一个最小集群,Redis应该是一个Master带上两个Slave,并且开启下列选项:

min-slaves-to-write 1

min-slaves-max-lag 10

这样能保证写入Master的同时至少写入一个Slave,如果出现网络分区阻隔并发生failover的时候,可以保证写入的数据最终一致而不是丢失,写入老的Master会直接失败。

Slave可以适当设置优先级,除了0之外(0表示永远不提升为Master),越小的优先级,越有可能被提示为Master。如果Slave分布在多个机房,可以考虑将和Master同一个机房的Slave的优先级设置的更低以提升他被选为新的Master的可能性。

考虑到可用性和选举的需要,Sentinel进程至少为3个,推荐为5个。如果有网络分区,应当适当分布(比如2个在A机房, 2个在B机房,一个在C机房)等。

◆◆Redis Cluster(集群)◆◆

Sentinel模式虽然解决了高可用的问题,但是单机的容量还是受到了限制,无法实现redis的分布式集群,限制了整个集群的容量和并发性能。

Redis Cluster集群节点最小配置6个节点以上(3主3从),其中主节点提供读写操作,从节点作为备用节点,不提供请求,只作为故障转移使用。

640

Cluster模式有众多的优点:

• 无中心架构;

• 数据按照slot存储分布在多个节点,节点间数据共享,可动态调整数据分布;

• 可扩展性:可线性扩展到1000多个节点,节点可动态添加或删除;

• 高可用性:部分节点不可用时,集群仍可用。通过增加Slave做standby数据副本,能够实现故障自动failover,节点之间通过gossip协议交换状态信息,用投票机制完成Slave到Master的角色提升;

• 降低运维成本,提高系统的扩展性和可用性。

限制条件

看起来很美好,cluster集群模式还是受到了一些使用上的限制:

1.Key批量操作支持有限。目前只支持同slot内的key执行批量操作(如mget,mset)。

2.Key事务操作支持有限。只支持多key在同一个节点上的事务操作,多个key分布在不同节点上时无法使用事务功能。

3.Key作为数据分区的最小粒度,因此不能将一个大的键值对象如hash,list等映射到不同节点。

4.不支持多数据库空间,集群模式下只能使用db0空间。

5.复制结构只支持一层,从节点只能复制主节点,不支持嵌套树状复制结构。

故障切换过程

故障节点变为客观下线后,如果下线节点是持有槽的主节点,则需要在它的从节点中选出一个替换它。从而保证集群高可用。下线主节点的所有从节点承担故障恢复的义务,当从节点通过内部定时任务发现自身复制的主节点进入客观下线时,将会触发故障恢复流程。

Sentinel模式提供了高可用的功能,由于redis本身的性能优异,很多企业内部的系统用这种模式足以应对。如果有些2C的应用,则推荐采用redis的cluster模式。

640

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/409835.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

[html] 移动端如何实现长按保存图片(图片上的二维码是动态的)?

[html] 移动端如何实现长按保存图片(图片上的二维码是动态的)? html -> canvas -> image -> a[download]html2canvas.js:可将 htmldom 转为 canvas 元素。传送门 canvasAPI:toDataUrl() 可将 canvas 转为 ba…

协作安装程序应用一例

所谓“协作安装程序”,在ddk文档里面称作co-installer,有人将它翻译成“共同安装程序”。但是, 从ddk文档对co-installer功能的描述来看,我个人觉得翻译成“协作安装程序”更恰当些。 ddk文档对co-installer的描述:A c…

foxitreadersdk 打开远程文件_一种最不为人知最简单最方便的用电脑操作手机上的文件...

(声明:此功能,只适用于安桌系统的手机)由于最近一年手机上的文件经常隔三差五地提示空间已满,我不得不经常痛心删除一些文件,或者将手机上的文件,移到电脑端。如果想通过QQ或者微信发送单个单个文件,总是不…

月球-I型,月份日历生成器----基于PHP7.3

生成月份周日的类<?php class mycalendar {function __construct($year,$mon){$this->nianyue$year.-.$mon.-.01;$this->firstdaystrtotime(date($this->nianyue));$this->m intval(date(m,$this->firstday));$this->wdaylistarray();$this->lday s…

python dict遍历_Python 容器(二):字典(Dict)

Python 容器(二)&#xff1a;字典(Dict)一、字典1、定义&#xff1a;Python的字典数据类型是基于hash散列算法实现的&#xff0c;采用键值对(key:value)的形式&#xff0c;根据key的值计算value的地址&#xff0c;具有非常快的查取和插入速度。2、特点&#xff1a;1&#xff09…

论得失。。。技术方向

得失&#xff0c;一直都是人们所在意的&#xff0c;一旦得那么久开开心心&#xff0c;一旦失。就闷闷不乐&#xff0c;其实不然&#xff0c;中国的词语博大精深。一句舍得。解开了万人的心声。舍得&#xff0c;舍得&#xff0c;没舍哪来得。其实做技术也是一样。往往你在这个领…

[html] 你有了解video的x5-video-player-type这个属性吗?它的作用是什么呢?

[html] 你有了解video的x5-video-player-type这个属性吗&#xff1f;它的作用是什么呢&#xff1f; 这个属性是限制微信的X5 内核的自动播放功能个人简介 我是歌谣&#xff0c;欢迎和大家一起交流前后端知识。放弃很容易&#xff0c; 但坚持一定很酷。欢迎大家一起讨论 主目…

路径级别

.. 上一级 ~/根目录转载于:https://www.cnblogs.com/maomiyouai/archive/2012/05/21/2511021.html

奥特曼传奇英雄存档丢了怎么找回_热血传奇:道士最帅武器—玄天

点击“传奇私服玩家群”加个关注☀ 欢迎传奇老司机&#xff01;在这里&#xff0c;分享最新传奇资讯&#xff0c;回忆当年的传奇年代。分享最热传奇手游&#xff0c;端游&#xff0c;找回昔日组队的热血时光。记得加个关注不迷路~☀ 微信公众号&#xff1a;diyisf777热血传奇中…

.Net Core下基于Emit的打造AOP

之前的基于DispatchProxy的AOP组件&#xff0c;实现了属性注入&#xff0c;但是这个依旧有很多限制 比如不支持构造器注入&#xff0c;继承DispatchProxy的子类必须是公开类 个人有点代码洁癖&#xff0c;不喜欢这种不能控制的方式&#xff0c;就学了几天Emit&#xff0c;参考了…

[html] iOS下页面如何启动加载时显示画面图片?如何设置大小?它有什么好处?

[html] iOS下页面如何启动加载时显示画面图片&#xff1f;如何设置大小&#xff1f;它有什么好处&#xff1f; <link rel"apple-touch-startup-image" href"start.png" media"(device-width: 1536px) and (orientation: portrait)"/> IOS…

google 确定某点海拔高_“湘能楚天”牌变电站的威宁之旅(一)|高海拔下如何实现与茫茫雪原环境的共生?...

“湘能楚天”牌变电站的威宁之旅——序从湘能楚天办公楼三楼坐电梯&#xff0c;出门左转上京珠高速再转杭瑞高速&#xff0c;根据百度地图的提醒&#xff0c;行车13小时40分&#xff0c;将抵达贵州威宁黑土河&#xff0c;全程1197公里&#xff0c;再前行就到了迤那。黑土河&…

.Net Core 3.0依赖注入替换 Autofac

今天早上&#xff0c;喜庆的更新VS2019&#xff0c;终于3.0正式版了呀~ 有小伙伴问了一句Autofac怎么接入&#xff0c;因为Startup.ConfigureServices不能再把返回值改成IServiceProvider了&#xff0c;原来的替换依赖注入容器就不可行了&#xff0c;我随口说了一下Host上面.Us…

designer一直未响应 qt_未雨绸缪及时清淤 曾是内涝重灾区 这次涵洞未积水

市政工人揭开井盖排水 楚天快报见习记者吴宜芝 通讯员王艳华城区几处铁路涵洞&#xff0c;曾经是城区内涝重灾区&#xff0c;每逢下雨&#xff0c;涵洞就成了一条无法逾越的鸿沟。然而此次持续6个多小时的降雨中&#xff0c;却均未出现严重的积水&#xff0c;也未影响交通。此次…

a标签点击事件_DOM事件机制

前言本文主要介绍DOM事件级别、DOM事件模型、事件流、事件代理和Event对象常见的应用&#xff0c;希望对你们有些帮助和启发&#xff01;一、DOM事件级别DOM级别一共可以分为四个级别&#xff1a;DOM0级、DOM1级、DOM2级和DOM3级。而DOM事件分为3个级别&#xff1a;DOM 0级事件…

如何开始了解一个新知识(Vuex)

我是歌谣 放弃很容易 但是坚持一定很酷 前言 每次做开发遇到一个新的知识点 总要思索着如何去实现这个新东西 最近来大概讲讲Vuex vuex是前端用的比较多的一个东西之一 通过一张图了解一下原理 原理和vuex产生原因 看完了整个的原理之后 安装就直接过去了 就是包管理工具 …

HDU2277_变色球

/* *题目大意: * 给定a, b, c&#xff0c;代表三种不同颜色的球的个数&#xff0c;然后规定 * 如果把任意两种不同颜色的球放在一起&#xff0c;那么它们两个 * 的颜色将变成第三种颜色的球的颜色。求判断最后所有的 * 球能否变成同一种颜色&#xff0c;如果能&#xff0c;…

.Net Core 3.0下AOP试水~~

昨天躺了一下3.0的依赖注入的雷 今天顺势把AOP做了一下调整&#xff0c;比如自动化的AOP注入 默认的Program里面的CreateHostBuilder方法增加一行 public static IHostBuilder CreateHostBuilder(string[] args) >Host.CreateDefaultBuilder(args).UseServiceProviderFactor…

golang 读取文件最后一行_测试用例是开发人员最后一块遮羞布

测试用例是开发人员最后一块遮羞布最近一周写一个比较复杂的业务模块&#xff0c;越写到后面真心越心虚。操作越来越复杂了&#xff0c;代码也逐渐凌乱了起来。比如一个接口&#xff0c;传入的是一个比较复杂的大json&#xff0c;我需要解析这个大json&#xff0c;然后根据json…

android 进度条_Android仿水波纹流球进度条控制器,实现高端大气的主流特效

今天看到一个效果挺不错的&#xff0c;就模仿了下来&#xff0c;加上了一些自己想要的效果&#xff0c;感觉还不错的样子&#xff0c;所以就分享出来了&#xff0c;话不多说&#xff0c;上图CircleView这里主要是实现中心圆以及水波特效package com.lgl.circleview;import andr…