芒果 TV Redis 服务解决方案

原创
2015/02/11 10:37
阅读数 4.6K

简介

芒果 TV 的 Redis 服务解决方案大体上分为两个部分: 以 Python 为主要开发框架的 Web 应用程序 Redis-ctl, 及以 C++11 为开发语言的轻量数据代理程序 cerberus. 对于使用开发者而言, 在机器上直接部署一组 Redis 集群节点, 然后在 Redis-ctl 上注册这些节点并组建集群; 接下来启动一个 cerberus 程序, 即可通过 cerberus 使用缓存服务. 此外, Redis-ctl 还包括一个轮询进程, 用于监测各节点的基本信息, 如 CPU, 内存, 连接数等.

相对于旧有的应用自带单节点 redis 的做法, 此方案有如下优势

  • 首先, 采用集群替代单节点作为缓存容器, 一方面能提高总体缓存容量 (不再受限于单机内存容量), 另一方面也能提高可用性 (利用集群自有的主从切换故障恢复)
  • 在此基础上, 集群代理程序的自动请求分发/重试机制使得应用不必修改自身代码或更新 Redis 库
  • 集群的扩容/缩容特性使得对机器的使用更加灵活, 并且减少浪费. 简而言之, 可以在内存达到阈值再加入新 Redis 节点, 而不用重启应用或 Redis 等, 保持服务中的任何一环都能持续工作
  • 为所有 Redis 节点, 代理节点加上统一管理和状态监测, 可以查阅历史数据, 或在发生任何问题之后快速响应修复
  • 整体可用性提高, 对于 Redis 节点来说, 前述的主备切换令单点故障不成为问题; 而代理进程的无状态性使之可在故障后快速恢复, 不影响后端集群数据完整性
  • 作为一个 bonus, 由于集群在处理请求时会将运算分散到各个节点上, 所以在高并发的情况下集群的指令处理速度会显著超过单节点

整体结构

整体结构示意图

其中 Redis-trib 为 Redis-ctl 的一个子项目, 是 Python 直接操作 Redis 集群的 API 库.

Redis 节点可以分散在多台机器上, 主从节点亦可在不同机器上, 如此即使一台机器偶然整机故障, 仍可以通过其他机器上的从节点获取数据.

而 Redis-ctl 可以运行于任何只要能连接 Redis 节点的机器上, 轮询程序会至少 10 秒采集一次单节点数据, 因此不需要很高的带宽. 只要节点加入 Redis-ctl 就会自动开始状态轮询.

Cerberus 代理程序

因为目前 Redis 集群要求连接的客户端为 "聪明客户端", 即在客户端就能够针对集群的槽位分布进行请求分发或重试, 在这方面有些语言的库 (如 Java 的 Jedis) 实现较为完备, 但有些就惨不忍睹了. 而即使有较好的实现, 在使用集群时仍需要修改程序固有代码, 对各个项目组造成负担. 故我们决定开发一个轻量级的数据分发代理.

关于这部分的详细信息见此处.

Redis-Ctl

现阶段的 Redis-ctl 程序集成了 Redis 节点管理, 集群管理. 在页面上便能看到各个节点的基本信息.

节点基本信息列表

甚至可以在页面上发送组建/扩容集群操作 (测试中).

节点控制面板

此外, 项目中还包含一个守护进程程序, 独立于主进程, 专司对节点, cerberus 的状态监测 (通过发送 info 指令到 Redis 节点或 proxy 指定到 cerberus), 并将采集的数据整合发送到 influxdb, 以便用户查阅节点的历史状态.

节点历史状态图页面

展开阅读全文
打赏
2
5 收藏
分享
加载中
打赏
8 评论
5 收藏
2
分享
返回顶部
顶部