沃梦达 / 编程技术 / 数据库 / 正文

Memcache/Redis集群管理探索与实现:美图开源PaaS平台资源网关

虽然 reuse port 是在 linux 3.9 才被合并进来,但有 backport 到更早之前的版本(至少我们在使用的 2.6.32 是有的),很多博客在这点上有些误导。另外,在 reload 时候也不能简单将老的监听关闭,会导致 tcp backlo...

虽然 reuse port 是在 linux 3.9 才被合并进来,但有 backport 到更早之前的版本(至少我们在使用的 2.6.32 是有的),很多博客在这点上有些误导。另外,在 reload 时候也不能简单将老的监听关闭,会导致 tcp backlog 里面这些三次握手成功但未 accept 的连接丢失,业务在这些连接上发送数据则会收到 rst 包。

我们解决这个问题的方式是让监听连接都在 master 进程上面创建和维护,worker 进程只是在 fork 之后直接继承监听的连接,所以在 reload 的时候 master 就可以将老 worker 里面的监听连接迁移到新的 worker, 来保证 tcp backlog 里面的数据不会丢失。

具体代码见: nc_process.c#L172, 这种方式能够在进程数不变或者增多的场景下保证 backlog 里面的数据不会丢,进程数缩减时还是会丢失一些。

Redis 主从模式

在原生的 twemproxy 里面是不支持 Redis 主从模式的,这个应该主要是因为 twemproxy 把 Redis/Memcached 当做是缓存而不是存储,所以这种主从结构实际上是没有必要的,运维也比较简单。但是对于我们内部业务来说,有些并不是全部都是作为缓存,所以就需要这种主从结构。配置也比较简单:


如果检测到 server 的名字为 master 则认为该实例为主,一个池子里面只允许一个主,否则认为配置不合法。

统计指标

个人觉得 twemproxy 存在的另外一个问题是延时指标完全缺失,这个对于排查问题以及监控报警是比较不利的。针对这个问题,我们增加了两种延时指标:

request latency, 指的是客户端请求到返回的延时, 包含 twemproxy 内部以及 server 的耗时,这个指标更加接近业务的耗时;

server latency, 指的是 twemproxy 请求 server 的耗时,这个可以理解为 Redis/Memcached server 的耗时。

在偶发问题的场景下,根据两种延时可以定位是 twemproxy、server 还是客户端的问题(比如 GC)导致慢请求,另外也可以慢请求的比例进行监控报警。这两种指标是通过 bucket 的方式来记录的,比如 <1ms 的数目,<10ms 的数目等等。

仍然存在的问题

在 worker 数目减少的场景下,被销毁的老 Worker 的 tcp backlog 会丢失会导致一些连接超时;

unix socket 没有 reuse port 类似的机制,所以实际上还是单进程但可以支持在线 reload;

不支持 Memcached 二进制协议,几年前有人提供相关 PR 但一直都没有进入 master;

客户端的最大连接数有配置但实际上不生效,这个功能我们后续会加上;

命令支持不全(主要是没有 key 以及一些 blocking 的指令);

reload 期间新老进程的配置不一致会可能会导致脏数据。

性能压测

以下数据是在长连接小包场景下压测得出,主要是验证多进程版本是否跟预期的一致。没有其他硬件到达瓶颈之前,性能可以随着 CPU 核数线性增长。

压测环境如下:

CentOS 6.6

CPU Intel E5-2660 32 逻辑核

内存 64G

两张千兆网卡做 bond0


单个 worker 场景和 twemproxy 改造之前的性能差不多,在 10w 左右。随着 worker 数目增加,后面性能和 worker 基本是保持线上增长,符合预期。8 核以上的瓶颈是 bond0 模式下包接收不均匀导致单网卡性能达到瓶颈,数据无法作为参考。上面的数据也是我们自己环境的压测数据,大家可以自行验证。如果是多网卡需要注意绑定中断或者多队列到多个 CPU, 避免 CPU0 软中断处理成为瓶颈。

最后

多进程版本的 twemproxy 实现上算是比较简单,但过程中发现并修复不少 twemproxy 细节问题(一部分是使用方报告),比如 mbuf 一旦分配就不会收缩导致内存上涨之后不再下降的问题等等。很多功能细节我们也在不断优化,我们也只维护 Github 上的一个版本。

代码地址: https://github.com/meitu/twemproxy

除此之外,我们团队目前也开源其他一些项目:

golang 版本的 kafka consumer group

php 版本的 kafka consumer group

基于以太坊的 DPoS 实现

给大家推荐一个程序员学习交流群:863621962。群里有分享的视频,还有思维导图

群公告有视频,都是干货的,你可以下载来看。主要分享分布式架构、高可扩展、高性能、高并发、性能优化、Spring boot、Redis、ActiveMQ、Nginx、Mycat、Netty、Jvm大型分布式项目实战学习架构师视频。


本文标题为:Memcache/Redis集群管理探索与实现:美图开源PaaS平台资源网关

基础教程推荐