Redis实践:使用Pub/Sub实现对服务器群的管理监控
程序员文章站
2022-05-13 12:53:45
...
一,背景描述
某个系统提供并发百万级的用户实时在线业务,部署了几十台接入服务器,十几台业务处理服务器。
由于历史原因,都是手动配置这些服务器,除了能够监控到这些服务器的网络,带宽,磁盘,内存
等硬件设备信息外,对于每个服务器应用程序的内部状态信息,程序的统计信息无法采集,导致只能通过
外围的一些信息去判断评估问题所在,不准确,耗时耗力,很痛苦。
为了准确监控每个服务器的内部状态,而且也不影响现有业务逻辑的情况,需要快速部署一个简单的
服务器集中监控系统。经过考虑,可以使用Redis的Pub/Sub功能来实现一个监控系统是非常好合适的。
二,解决方案
1,关于Redis的Pub/Sub机制
Pub/Sub 从字面上理解就是发布(Publish)与订阅(Subscribe),在Redis中,你可以设定对某一个key值
进行消息发布及消息订阅,当一个key值上进行了消息发布后,所有订阅它的客户端都会收到相应的消息。这一功能
可以用作实时消息系统。
2,系统结构
3,主要流程
3.1 应用服务器的初始化
- 所有应用服务器作为Redis的Client连接到Redis服务器,保持长连接。
- 每个应用服务器都会配置一个全局唯一的ServerID,每个应用服务器都会发布两个Channel,一个是状态的channel,名称为ServerID_State,另外一个是统计信息的 Channel,名称为ServerID_Statistic。
- 每个应用服务器也同时订阅一个属于自己的管理Channel,名字为ServerID_Manage,用于接收来自监控服务器的管理消息。
- 相应的Redis协议消息举例如下:
- PUBLISH AppSvr1_State "Server[AppSvr1] Keep-Alive"
- PUBLISH AppSvr1_Statistic "Online Server[AppSvr1] user total[10000], Calling user total[100]"
- SUBSCRIBE AppSvr1_Manage
3.2 监控服务器的初始化
- 监控服务器会订阅所有应用服务器的Channel,接收这些服务器的所有状态信息和统计信息,并且也可以通过ServerID_Manage
- 监控服务器的Redis协议消息举例如下:
- PSUBSCRIBE AppSvr*_State
- PSUBSCRIBE AppSvr*_Statistic
3.3 监控服务器收到的状态和统计消息举例如下:
- MESSAGE "Server[AppSvr1] Keep-Alive"
- MESSAGE "Online Server[AppSvr1] user total[10000], Calling user total[100]"
3.4 监控服务器可以向各应用服务器发布管理指令,比如重启,重新reload配置文件等等。
- 监控服务器向AppSvr1发出服务器重启命令
- PUBLISH AppSvr1_Manage “command=restart”
- 应用服务器收到后,执行重启过程,并向监控服务器报告自己的最新状态
- PUBLISH AppSvr1_State Server[AppSvr1] stop
- 应用服务器重启完毕后,会向监控服务器发布新状态
- PUBLISH AppSvr1_State Server[AppSvr1] startup
- 监控服务器先后收到的消息如下:
- MESSAGE Server[AppSvr1] stop
- MESSAGE Server[AppSvr1] startup
- MESSAGE Server[AppSvr1] Keep-Alive
3.5 通过WEB实时获取指定应用服务器的内部统计信息流程
- 收到WEB请求后通过phpredis发送如下消息
- PUBLISH AppSvr1_Manage command=get_user_online_stat
- 应用服务器收到该消息后,向phpredis的客户端发布对应的统计信息
- PUBLISH AppSvr1_Statistic Server[AppSvr1] online user total[10000]
三,方案总结
该方案不但实现了监控服务器对各应用服务器的状态监控和统计数据采集,而且通过双向订阅通道,也实现了向各应用服务器发起简单的管理维护命令。
基于该方案还可以深入开发更丰富的功能。