加入收藏 | 设为首页 | 会员中心 | 我要投稿 PHP编程网 - 黄冈站长网 (http://www.0713zz.com/)- 数据应用、建站、人体识别、智能机器人、语音技术!
当前位置: 首页 > 运营中心 > 网站设计 > 教程 > 正文

深入浅出百亿请求高可用Redis(codis)分布式集群揭秘

发布时间:2019-04-20 14:29:51 所属栏目:教程 来源:jackiej
导读:副标题#e# 一、背景 随着直播元年开启,越来越多的直播产品如春笋般出现,在拉动营收的过程中,产品竭尽全力思考着各种活动来刺激用户的消费欲望,而这类活动的基础形式就是榜单,在2016年我们基于cmem及扫描流水表的方式来实现榜单排名,2017开始,我们对

codis的架构本身分成proxy集群+redis集群,proxy集群的高可用,可以基于zk或者l5来做故障转移,而redis集群的高可用是借助于redis开源的哨兵集群来实现,那边codis作为非redis组件,需要解决的一个问题就是如何集成redis哨兵集群。本节将该问题分成三部分,介绍redis哨兵集群如何保证redis高可用,codisproxy如何感知redis哨兵集群的故障转移动作,redis集群如何降低“脑裂”的发生概率。

5.2.1 哨兵集群如何保证redis高可用

Sentinel(哨岗,哨兵)是Redis的高可用解决方案:由一个或多个Sentinel实例组成的Sentinel系统,可以监视任意多个主服务器,以及这些主服务器属下的所有的从服务器,并在被监视的主服务器进入下线状态时,自动将下线主服务器属下的某个从服务器升级为新的主服务器,然后由主服务器代替已下线的主服务器继续处理命令请求。

深入浅出百亿请求高可用Redis(codis)分布式集群揭秘

通常来说要达到服务的高可用的效果需要做2个事情:故障探测与故障转移(即选主并做主从切换)。

深入浅出百亿请求高可用Redis(codis)分布式集群揭秘

深入浅出百亿请求高可用Redis(codis)分布式集群揭秘

深入浅出百亿请求高可用Redis(codis)分布式集群揭秘

5.2.2 codis如何感知哨兵集群的故障转移动作

codis的架构本身分成proxy集群+redis集群,redis集群的高可用是由哨兵集群来保证的,那么proxy是如何感知redis主机故障,然后切换新主保证服务高可用的呢?

如上图所示,proxy本身会监听sentinle集群的+switch-master事件,该事件发出,意味着redis集群主机出现问题,sentinel集群开始进行选举并切换主机,proxy监听了sentinel的主从切换事件,收到主从切换事件之后,proxy会做一个动作,就是把所有sentinel上的集群所感知的当前认为的主机拉取出来,选取过半sentinel认为的主机当作目前的集群主机。

讲到这里,大家可能会忽略一个问题,就是配置存储,配置中心的存储还是旧的主机,一旦proxy重起,那拉取的依旧是故障的主机,其实dashboard和proxy也做了一样的事情,收到主从切换事件之后,就会将新主持久化到storage中(目前为zk)

5.2.3 脑裂处理

脑裂(split-brain)集群的脑裂通常是发生在集群中部分节点之间不可达而引起的。如下述情况发生时,不同分裂的小集群会自主的选择出master节点,造成原本的集群会同时存在多个master节点。,结果会导致系统混乱,数据损坏。

深入浅出百亿请求高可用Redis(codis)分布式集群揭秘

在这个问题上,这里simotang同学已经讲解的非常完善了,大规模codis集群的治理与实践,这里简单说一下,由于redis集群不能单纯的依赖过半选举的模式,因为redismaster自身没有做检测自身健康状态而降级的动作,所以我们需要一种master健康状态辅助判断降级的方式。具体实现为

1)降级双主出现的概率,让Quorums判断更加严格,让主机下线判断时间更加严格,我们部署了5台sentinel机器覆盖各大运营商IDC,只有4台主观认为主机下线的时候才做下线。

2)被隔离的master降级,基于共享资源判断的方式,redis服务器上agent会定时持续检测zk是否通常,若连接不上,则向redis发送降级指令,不可读写,牺牲可用性,保证一致性。

六、codis水平扩容细节&迁移异常处理

由于codis是针对redis分布式的解决方案,必然会面临着redis单点容量不足的情况下水平扩容的问题,本节主要针对codis水平扩容与迁移异常的细节做一下说明,大家先带着两个问题来看,问题一,迁移过程中,正在迁移的key的读写请求怎么处理,问题二,迁移过程中的异常(例如失败,超时)怎么处理。

6.1 Codis扩容迁移细节

深入浅出百亿请求高可用Redis(codis)分布式集群揭秘

【图】迁移流程

影响面:

一阶段期间的影响:通知到通知成功结束期间,proxy读写请求阻塞,不丢失,延时增高(时间极短,并行通知,仅仅修改状态,使proxy中slot状态达到一致)

迁移过程:可读,正在迁移批次的不可写,迁移完成的批次涉及到两次网络io

如上图所示,其实redis平滑迁移过程,主要是实现了3个点,迁移准备,迁移动作,迁移性能保证。

迁移准备

(编辑:PHP编程网 - 黄冈站长网)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

热点阅读