网易私有云Redis服务

达芬奇密码2018-06-22 13:12


网易私有云Redis服务,是网易杭研院后台技术中心数据库技术组在私有云平台上提供的一种统一、可靠、分钟级自动化部署的Redis服务,具有高可用高可靠故障自动恢复容量平滑伸缩等特色功能,上线不到一年,已经拥有200多个实例超过4TB内存资源,内存资源利用率达63%(redis容量/云主机容量),服务多个重量级产品。在这个还不不赖的成绩下,向大家分享下NCR(NetEase Cloud Redis)服务的功能和实现,一来推动大家都来认识NCR,了解我们缓存组正在从事的工作,二来也是邀请大家(各产品线)放心大胆的来使用NCR服务。

系统架构

作为攻城狮群体,第一道菜必然是系统架构,接图:


图中从左至右分为三部分:左边(蓝色)是web浏览器,产品和服务的管理员以web化方式对服务(实例)进行管理;中间(紫色)是管理服务,基于spring3.0框架开发,除提供针对实例的增、删、改、查基本功能外,还拥有监控预警、故障自动恢复、实例扩容、系统升级等增值配套功能;右边(绿色)是管理服务创建的实例,分为 单节点分布式两种规格的实例,前者支持全部Redis命令,适用于小容量的应用,后者支持绝大部分Redis命令(部分跨节点命令不支持),适用于大容量的应用。
鉴于云计算平台对网络安全的考虑,所以系统模块在部署上也有一定的要求,管理服务部署在控制节点网络,实例部署在租户的私有网络内,其中控制节点网络和租户私有网络只支持单向访问(租户网络访问控制网络),而租户间的私有网络是隔离不通的。

单节点实例


单节点实例 拥有 极简的架构 非常廉价的成本 ,以虚拟IP(VIP)作为业务系统接入接口。一个单节点实例对应一个group(redis节点主从组),group内配置主从双副本redis节点,分别部署在两台不同可用域的云主机上。图中的redis-agent同时连接着管理服务(manager模块)和主从redis节点,通过交叉探活(向节点发送ping指令和解析pong响应消息)获取节点的存活状态信息,并实时推送给manager模块,当两个redis-agent汇报的redis节点状态同时异常时,manager模块才认为(决策)该节点异常,如果该节点是主节点,则管理服务发起主从切换和VIP漂移流程。这里,redis-agent在探活redis节点的时候,支持重连机制,且只有当失连超过一段时间(可配置,比如10秒钟),才认为节点异常,这样设计的主要目的是考虑到云网络抖动带来的影响。redis-agent是一个mini的单线程进程,运行期占用不到1MB的内存资源,CPU资源则可以忽略不计。
在单节点实例下,manager模块需要参与实例的节点异常决策、主从切换和VIP漂移,功能上已经超越了它的定位。

分布式实例

分布式实例,顾名思义就是分布式的、有多个group的集群。图中右侧是核心业务流相关的模块,包括proxy、redis(redis-server)、redis-sentinel, 都是单线程的进程,所以从资源角度,尤其是CPU计算资源,是非常节约的(这也是NCR分布式实例可以多节点冗余部署的一个原因)。proxy是代理模块,用于数据分片,redis-server和redis-sentiniel是官方套件,后者用于redis节点探活及主从failover。部署上,一个分布式实例拥有多台分属不同可用域的云主机,一台云主机部署一个proxy节点和多个redis节点,同一个group内的主从redis节点部署在两台不同可用域的云主机上,同一个租户内多个实例共享一个redis-sentinel集群。
大家感兴趣的proxy模块,是 基于开源的twemproxy做的二次开发增加了支持redis节点高可用功能(根据 官方指导实现,自动切换到新主节点上,对业务来讲是透明的)、支持redis-sentinel节点异常自动切换、支持对接manager模块。proxy代理层的轻、薄、高效设计,以及负荷(CPU、Network IO)的离散,对整个集群的稳定、健康是非常有利的,特别是对于分布式系统来讲也是更理想、更友好的!
左侧的manager模块在分布式实例下,不参与redis节点探活和主从failover流程,聚焦于管理服务。
下面介绍下分布式实例架构的一些特点:

分层设计

分布式实例从上到下分为四层:

  • loadbalance集群层
  • proxy集群层
  • redis集群层
  • redis-sentinel集群层。

其中loadbalance层用于负载均衡,通过DR模式把应用的客户端请求分发给proxy集群,再由proxy集群对业务数据进行分片,计算key的哈希值把数据分片到各个group的redis主节点上,每个group也是主从双副本配置。redis-sentinel集群监控所有group下的redis节点,判断主节点存活状态并完成failover逻辑,同时proxy订阅redis-sentinel的主从切换频道,实时获取redis主节点状态变化信息,并完成切换到新的redis主节点功能。

去中心化设计

  • 节点判活选主:redis节点状态判断以及新主节点的选举,由官方redis-sentinel套件以集群投票(Raft协议)的形式完成;
  • 数据分片规则:proxy集群的数据分片规则不是由manager统一管理,而是由各个proxy节点按ketama hash ring来分片。

容灾设计

  • loadbalance集群:LVS+keepalived主从高可用;
  • proxy集群:无状态节点,异常时由loadbalance自动摘除,同时多节点冗余;
  • redis集群:每个group主从双副本,部署在不同的AZavailable zone,可用域,可以理解为不同物理机);
  • redis-sentinel集群:多节点冗余,部署在不同的AZ
  • virtual server:数据主从双副本,分布在不同云主机、不同AZ之上,所以一台云主机宕机不影响系统的可用性和数据的可靠性。

管理服务
manager模块规划有高可用,但考虑到私有云以及实例数据已经持久化至数据库的前提,优先级就不是很高了。除正常的增、删、改、查功能外,还支持以下功能:
  • 一键升级:支持线上集群的配置文件、脚本、二进制程序一键升级,支持版本比较、失败回滚等功能;
  • 故障恢复:支持主机级别的故障自动恢复功能:按原IP重新创建云主机,并恢复其上的各种节点;
  • 实例扩容:支持实例的纵向(scale up)和横向(scale out)扩容功能。

本文来自网易实践者社区,经作者何李夫授权发布。