基于改造后的REDIS的实时监控架构,改造后redis
- 摘要
要做到秒级的数据采集,最重要的就是要快,同时在采集数据时,尽可能少的暂用业务进程的资源。同时,我们可以把任何统计指标建模成一个计数器。
这里使用了一种方法,利用REDIS的高性能以及对计数器的支持,能帮助实现秒级监控数据采集。
- 源码
GITHUB:https://github.com/gilbertwang1981/redis_3.2.5_plus.git
- 架构
单个Redis实例对计数器的处理能力,能达到每秒10W以上。同时,整体架构支持Redis水平扩展,在客户端对指标做适当的分片。
对REDIS的源代码做了一定的改造,增加了一个自定义的命令,新增的命令格式如下:
PEG counter_name counter_delta
我们也可以使用系统命令INCR(只需要设置Redis的环境变量来切换)。通过在REDIS服务端通过开关控制,复用INCR接口,而不需要重新实现一个新的命令,这样可以复用现有的REDIS client。
比如:
[root@gilbertwang-visam src]# ./redis-cli -h IP
ip:6379> peg umc_counter_0 35
OK
ip:6379> peg umc_counter_1 12
OK
- 流程
- 秒级数据采集数据结构
REDIS内部数据结构如下,用于秒级数据统计:
- Q&A
- 如何将统计数据从Redis中暴露给应用程序?
开发人员可以通过编写动态链接库,来自定义数据的处理,该库是在Redis运行期间,定时收集收集统计数据的时候,动态加载动态链接库,并且调用用户自定义回调函数,达到和外部系统通信的目的。
- 如何编写自定义统计处理动态库?
- 自定义回调函数,创建c文件,ts_plugin.c
int ts_plugin_next(char * counter_name , int second ,int counter_value , int eof , int bof) {printf("%s %d %d %d %d\n" , counter_name , second , counter_value , eof , bof);return 0;}
- 编译成动态库
gcc -fPIC -shared ts_plugin.c -o libts_plugin.so
- 在redis启动脚本中增加环境变量
export TS_PLUGIN_PATH=/root/libts_plugin.so
- 启动Redis动态加载插件。
- 性能对比
通过复用REDIS的标准命令INCR,进行性能压测对比,环境相同(虚拟机),一个是原始的INCR命令,一个是改造后的INCR统计命令,1秒钟处理的请求数6W+,性能无损。