亚马逊AWS官方博客
构建 ElastiCache for Redis Cluster 代理服务集群(下篇)
背景
本文延续 Redis Cluster 代理集群需求场景,在上篇中主要介绍了使用 RedisLabs 开源版本 Redis Cluster Proxy 搭建代理集群方案的过程,RedisLabs 官方文档明确表明此项目处于 alpha 版本,用于生产环境需要详细的技术评估。本篇会详细介绍另外一个 Golang 的 Redis Proxy 开源项目 Overlord,这个项目来自国内互联网公司B站,官方文档明确介绍这个项目是经过B站生产环境实际验证,以下会详细介绍如何在AWS环境中构建这套 Redis Cluster 代理集群。
Overlord 简介
Overlord 是哔哩哔哩基于Go语言编写的 Memcached 和 Redis & Cluster 的代理及集群管理功能,致力于提供自动化高可用的缓存服务解决方案。主要包括以下组件:
- proxy:轻量高可用的缓存代理模块,支持 Memcached 和 Redis 的代理,相当于 Twemproxy,不同在于支持Redis Cluster 及能将自己伪装为cluster模式。
- platform:包含 apiserver、mesos framework&executor、集群节点任务管理job等。
- GUI:web管理界面,通过dashboard可视化方便用于集群管理,包括创建删除、扩缩容、加减节点等。
- anzi:redis-cluster的数据同步工具,可服务化与apiserver进行配合工作。
- enri:redis-cluster的集群管理工具,可灵活的创建集群、迁移slot等。
- Overlord 已被哔哩哔哩用于生产环境。
Overlord Proxy 集群搭建
架构图
创建 EC2 服务器
基于 Ubuntu 18.04 LTS 系统构建 Overlord Proxy 服务预置镜像。
- 创建EC2
- 选择合适的存储大小,需要注意预留足够空间保存日志文件
安装 Overlord Proxy
创建 Overlord Proxy 配置文件
Overlord Proxy 需要两个配置文件,分别是 Proxy 和 Cluster 两个配置。
启动 Overlord Proxy 和 测试
配置 systemctl 管理 Overlord Proxy 服务
安装 CloudWatch Agent 增强对内存的监控
创建 Overlord Proxy 基础镜像
- 准备配置文件占位符
- 创建基础镜像
在控制台 EC2 界面,指定 overlord proxy 的服务器,创建基础镜像AMI
自动化部署 redis cluster overlord 代理集群
利用 CloudFormation 自动化部署 NLB + Overlord Proxy AutoScaling Group 架构。
- 准备 cloudwatch agent EC2 Role 权限
创建名为 CloudWatchAgentServerRole 的Role权限,具体策略 参考文档, EC2 可以有权限上报 metric。
- 准备 CloudFormation 模板
- 打开 AWS 控制台的 CloudFormation dashboard,使用以上模板创建集群。
- 配置 RedisCluster Endpoint 和 Conn Count
- 完成 CloudFormation 堆栈的创建,在 output 获取 NLB 地址
- 利用 Redis-cli 测试 NLB 连通性,最终完成 Overlord Proxy Cluster 代理集群的创建。
配置 Prometheus 和 Grafana 监控
Overlord Proxy 默认集成了 Prometheus 监控SDK,我们可以通过配置文件打开监控端口 8080,通过访问 http://URL:8080/metrics 可以获取到 QPS 和 Latency 两类监控数据。
如果我们的 EKS 集群中部署了 Prometheus 服务,可以通过添加一个 Service 的方式,直接添加对 Overlord 的监控,方便通过 Grafana 配置 Dashboard。
压力测试
利用 redis-benchmark 命令做压力测试,分别测试 pipline 和 非pipeline 两种场景,proxy机型为 c5.large, 以下为压测结果(代理集群不支持CONFIG命令):
- 非 pipeline 模式:
压测命令:redis-benchmark -h test-overlord-cluster.elb.us-west-2.amazonaws.com -t get,set,mset -n 500000 -q
- pipline 模式:
压测命令:redis-benchmark -h test-overlord-cluster.elb.us-west-2.amazonaws.com -t get,set,mset -n 500000 -P 16 -q
- 利用 memtier_benchmark 工具,可以有效的测试 Overlord 集群的负载均衡表现,通过观测集群 3 个节点的 CPU 负载变化,可以看到在压测过程中,流量是被均衡分发。
代理集群高可用
本方案是基于 NLB + Overlord AutoScaling Group 架构,默认设置按照CPU负载的百分比做集群的扩缩容,利用 NLB + AutoScaling Group 来保证代理集群的高可用。可以在代理集群完成构建后,手动去调整。
- 调整代理集群的弹性扩展数量
- 调整代理集群的扩展策略
- 为了测试高可用架构,手动触发任意 Shard 的Failover,观察 Overlord 集群的稳定性
触发 Shard 的 Failover,我们可以在控制台上直接手动触发
观察 ElastiCache Event,可以看到 Failover 的时间在 40 秒左右完成。由于我们在 Overlord 集群配置的是 ElastiCache Redis 的 Configuration Endpoint URL,Failover 过程本身是基于 DNS 的切换,不需要 Overlord 再进行配置更新。在集群恢复可用后,宕机节点在几分钟内也完成了故障恢复。
在Failover测试过程中,通过观察 Overlord 的 Target Group 监控,发现 3 台服务器没有发生宕机事件。集群始终保持高可用状态。
通过观察 Overlord 集群的 CPU 负载监控,发现在 Failover 发生后,集群负载下降,因为 ElastiCache Redis 集群不可用影响了对外服务。在大概 40 秒左右的时间,负载恢复,意味着服务正常对外提供。
观察 ElastiCache Redis Cluster 在 Failover 时刻 CPU 负载变化,可以看到 0001-002 节点的负载变为 0,其他节点 CPU 负载正常。(中间 CPU 负载中断,是因为压测工具检测到 Failover 异常退出导致)
观察 ElastiCache Redis Cluster 在 Failover 时刻连接数变化,可以看到 0001-002 节点连接数降为 0,连接数在40s左右立刻被 0001-001 节点接管。证明在 Failover 期间, Overlord 集群是稳定的,且能很快和提升的新主节点重建连接,保证整套 Proxy 集群的接入稳定性。
总结
Overlord Proxy 代理集群方案 相比 Redis Cluster Proxy 方案, 经过了B站实际线上生产环境的应用,并且使用Golang开发,相比C语言更容易维护。更推荐经过测试验证后用来解决升级到Redis Cluster后业务代码需要修改适配问题。
参考链接
- https://aws.amazon.com/cn/elasticache/redis
- https://aws.amazon.com/cn/elasticache/redis-details
- https://github.com/bilibili/overlord