国美工程师如何保障千亿级redis集群高可用?
国美在2015年开始使用redis,并将其封装成统一的中间件服务平台,应用到国美集团各类应用缓存场景中。目前已发展成为日请求超过数千亿,后端实例超过2000+的大规模集群。
历经多年数十次的大促高峰考验,且看国美工程师是如何保障redis集群高可用!
一、如何评判redis集群的健康度
我们把那些影响redis服务质量的因素,总体按照自底向上,由硬件-软件-部署架构的分层逻辑,分拆成四大类:主机硬件、操作系统、实例服务、部署架构,经过一次次bad case的不断补充修正,目前共25个细分指标,如下图展示:
为更直观体现redis集群服务的健康度及方便日常管理,我们结合各细分指标的监控值,设计了一套健康度评分规则,得分以百分制核算,得分越高代表服务越稳定可靠,以此得分为基础,对集群健康划分了4个等级,如下图。
具体的扣分逻辑按照影响redis集群不可用程度进行扣分。例如:
(1)redis集群中实例发生主从切换扣1分,虽然其本身不会造成服务的不可用,但也反映了服务存在着某种潜在风险,所以执行低分值扣分;
(2)若集群中主节点缺少备份从节点则扣10分,这种情况容易直接导致该实例的分片数据读写不可用,是一种高风险预警,执行高分值扣分。
健康度评分可以实时计算,也可以按天,也可以以星期为周期,对扣分进行累积,得出最终的周得分,如下图:
根据实际统计曲线图,在得分低于60分,极易出现服务重大故障;85分以上时服务是稳定的。
由此可见,集群健康度的高评分与服务高可用成正相关。
二、什么是保持集群高评分的关键
在我们收到监控的报警和预警信息后,标准的处理流程如下:
1. 结合业务经验及历史数据,对每个指标设置报警阈值,当触发阈值会通过短信和邮件发送报警至运营人员;
2.运营人员收到报警后,及时处理的同时,还需要在当天找到导致指标异常的根本原因,给出确切的整改方案和应对措施;
3.根据具体原因评估是否迭代指标体系及相应的报警阈值,达成指标、阈值、报警协同更新;
通过以上闭环操作,我们可以实现一天内处理报警,同类报警不会连续出现,从而保证缓存服务的持续高分。
所以,报警和预警信息的及时处理和指标体系的不断迭代是保持高分的关键!
三、如何轻松地保持集群健康高评分
某年双11大促前为保障redis集群服务健康度的高评分,必须针对多个集群扩缩容,为保障业务系统的稳定,只能在晚上11点到次日7点进行操作,涉及到数百个实例,连续通宵的高强度工作,使运维人员苦不堪言。
除了集群扩缩容,日常的大规模redis集群日常运维还包含:热点key分拆、槽迁移、实例迁移等等,所有的运维操作都面临相同挑战:
1.操作往往都要业务低峰的凌晨进行,可操作窗口小;
2.人为操作的效率低且不可靠。
为高效应对这些复杂运维场景的挑战,我们开发了3大类自动化运维工具:
其中:(1)自动部署脚本主要负责服务器新增、删除redis实例;(2)集群管理类工具主要包括添加删除节点,槽迁移,客户端超时处理工具,批量执行config,统计类工具;(3)状态查询工具主要集成大部分运维工具,方便运维人员随时随地通过PC/手机查询信息等。
俗话说“防患于未然”,如果在平常能够提前发现集群中存在的隐患,就可以提前规划好时间进行治理。为了实现这个目标,我们结合了一些redis的特性,针对相应的指标(比如内存占用率、连接数等)开发了一套预警监控系统。通过设置合理的监控阀值,在集群快要出现风险前,提前将预警信息发送给相关运维人员进行处理,使运维人员减少大量的被动运维。
由此可见,丰富完善的自动化运维工具和预警监控工具,使我们国美运维人员非常得轻松。
四、如何避免集群健康评分中不必要的扣分
在多年的运营过程中,我们碰到过一个set的value数十兆的、一个HashKey的大小数G使用hgetall获取数据、使用keys命令获取当前实例中所有key的列表、使用list缓存所有价格信息、不小心使用FLUSHDB命令等等不规范或者高危操作的案例,除了第二、三种情况可能会直接阻塞redis进程导致服务短暂不可用的情况而被直接扣分,其他案例虽然在平常的使用中没有任何问题,但是在迁移扩缩容过程中或者慢日志排查时,也可以带来很大的障碍,间接的对业务系统产生影响。
面对以上诸多不规范的使用及挑战,我们整理出《Redis使用规范》,不断给业务同事进行培训,使他们了解不同业务场景针对redis的最佳实践;通过封装的中间件客户端,增加权限控制,限制高危命令使用,强制限制用户写入数据的最大长度等等,最大限度避免redis集群服务因用户不合理使用,造成的额外扣分。
综上,一套科学的评分体系、报警case及时持续的迭代、完善的自动化工具、简洁的使用规范及合理的sdk封装是助力国美工程师是轻松保障大规模集群高可用的秘诀!
========================================================
下面插播一则招聘广告:
中间件架构师(急聘)
岗位职责:
1.负责统一消息队列服务,千亿级缓存服务,容器化编排服务,分库分表等基础中间件服务的稳定运营
2.规划并带领团队建设下一代中间件技术引擎
3.负责国美中间件团队的日常管理,管理8-10人的技术团队
4.沉淀技术并提升国美技术影响力
岗位要求:
1.精通java,3年以上大规模复杂系统架构经验
2.有千亿级规模的缓存,消息系统或其他大规模主流中间件设计开发及运营经验
3.对主流中间件服务有丰富的实践经验及深刻理解
4.有团队管理经验,对技术钻研比较痴迷
5.开源代码贡献者,技术分享爱好者优先考虑
6. 统招本科学历,211、985类学校优先考虑
容器化专家
岗位职责:
1.负责容器管理平台建设及运营,为业务提供服务容器化、应用编排等相关服务及产品。
2.推动业务应用容器化,负责疑难问题定义及解决,结合业务引进相应的解决方案
3.构建多机房,混合云的多环境容器发布能力,实现快速扩容及高可用服务
岗位要求:
1. 深入理解虚拟化相关原理,熟悉至少一个主流云厂商的弹性计算相关产品。
2. 熟悉linux系统内核及原理,具备丰富的 Linux系统问题处理、优化经验。熟悉TCP/IP协议及相关排查工具使用且有丰富的处理经验。
3. 熟悉容器技术原理,熟悉至少一种主流的开源容器编排技术:Docker Swarm, Kubernate,mesos等,有丰富的容器服务运维、或研发相关经验。
4. 熟悉JAVA/GO/Python至少具有一种语言的开发经验
5. 具备良好的客户沟通能力及技巧,工作积极主动,认真负责,心理素质好,能承受较大工作压力。
6. 对Docker社区有贡献者,有大规模的docker实施经验优先
7. 统招本科学历,211、985类学校优先考虑
java 研发工程师
岗位职责:
1.负责数据平台&中间件核心组件开发
2.负责相应组件的日常稳定运营及持续优化
3.跟进相应的前沿技术,引进落地助力提升业务
岗位要求:
1.1-3年的JAVA开发经验,具备丰富的JAVA开发项目经验,有分布式大数据开发经验优先
2.熟悉JVM内存结构,扎实的JAVA基础,熟悉io、多线程、集合等基础框架;
3.熟练使用Linux常用命令,能进行简单shell编程;有高并发 高吞吐量系统开发经验优先;
4.具有较好的沟通能力,思路清晰,善于思考,能独立分析和解决问题。
5.了解hadoop生态,对大数据开发有强烈欲望,熟悉常见NoSQL存储,如Hbase、memcached、redis、mongodb等;
6.有大规模高并发互联网应用的设计和开发经验,熟悉常规的分布式架构,熟悉缓存、消息队列等开源中间件。
7.统招本科学历,211、985类学校优先考虑(5-6二选一);
DBA工程师
岗位要求:
1. 负责公司MySQL、oracle 数据库的日常维护
2. 负责数据库的优化、集群架构的改造。
3. 协助开发完成数据库表的设计以及SQL调优。
4. 根据培训计划,对开发人员、实施人员和技术支持人员进行数据库管理和操作的培训
职位要求:
1. 3年以上数据库及相关应用工具的运行、管理工作经验;
2. 熟悉MySQL或oracle数据库的运行机制和体系架构
3. 熟悉shell,perl,python等语言中的一种
4. 熟悉主流数据库的原理、精通数据库核心参数的设置和调整,有丰富的线上调优经验
5. 具备大型网站数据库高并发量设计经验者优先
6. 统招本科学历,211、985类院校优先考虑;
心动小伙伴,速速发邮件给:fujie8 at gome.com.cn!
========================================================
文章作者简介:
黄威,国美架构部中间件Gcache负责人,主要负责国美高性能缓存中间件Gcache的研发和运营工作。