关于如何降低Redis的运维成本,可以参考AliRedis和Reborndb。
4.3.1 阿里AliRedisAliRedis是来自阿里巴巴的基于Redis改造的缓存产品,目前还未开源。网上只能搜到这么一篇资料《AliRedis单机180w QPS, 8台服务器构建1000w QPS Cache集群》。
AliRedis采取“多线程Master + N*Worker的工作模式。Master线程负责监听网络事件, 在接收到一个新的连接后, Master会把新的fd注册到Worker的epoll事件中, 交由worker处理这个fd的所有读写事件。这样Master线程就可以完全被释放出来接收更多的连接, 同时又不妨碍worker处理业务逻辑和IO读写。”
AliRedis对Redis架构上非常类似Nginx的Master-Worker架构模式,那Nginx中的Master进程都有哪些作用呢?(《Nginx工作进程模型》)
- 读取和校验配置文件
- 创建、绑定、关闭套接字
- 启动、终止、维护所配置数目的worker进程
- worker进程接受、处理来自客户端的连接
- 不中断服务刷新配置文件
- 不中断服务升级程序
- 反向代理和过滤功能
因此,每台服务器上由一个Master管理这台机器上的所有Redis实例,达到充分利用多核多线程。同时每台服务器只需维护一个AliRedis实例,大大降低运维成本的目的。也可以根据需要,实现类似Nginx中Master的各种功能。
4.3.2 豆瓣ReborndbReborndb基本是从Codis衍生出来的,但相比Codis多了一个Agent组件。agent主要是部署在Redis实例的机器上,类似AliRedis的Master,但Agent不负责处理请求。它负责监管Redis实例的生命周期,例如Redis部署、启动、停止、重启以及升级等等。它通过一套RESTFul接口来暴露这些操作。此外,它还担当着Redis高可用性协调者的角色,类似官方HA方案的Sentinel。
4.3.3 Master vs. ProxyMaster与Redis实例在一台机器上,Master负责建立连接,之后的I/O读写都交给Worker进程处理。因此,这与《Netty 4源码解析:请求处理》介绍过的主从Reactor模式里的主Reactor非常像!只不过Netty的模型是在一个进程里通过线程实现的,而AliRedis是类似Nginx用进程实现的。
而Proxy的责任要比Master大得多,它负责请求和响应处理的全过程,而不是建立连接后直接交给后端。所以Proxy的压力也不小,一般与Redis实例不部署在一台机器上。实际上,它与Master并不矛盾。Proxy模式负责解决协议解析、请求的过滤转发、结果聚合等问题,而Master-Worker模式则让Redis享受到多核的速度、不停机程序升级、降低运维成本等。