Collectd
collectd的安装就不再赘述了,一般都是用到了collectd的同学才会来看这篇文章的。我的目的很简单,将collectd的数据既能存到数据库,也能存到redis用来做即时访问的缓存。因为一个QPS比较高的系统的话,我要读数据还是从redis读更快速。
首先是从collectd的官网看到了支持的redis插件有两个,write_redis和redis,分别是写数据到redis和从redis查询数据。所以今天的主角是write_redis。
write_redis
我是在ubuntu系统上配置的,其实原本是应该在centos的机器上,但是那台机器挂掉了,没办法,换个机器。
首先你得有个redis或者redis集群,目前我只测试了没有密码的情况,有密码的坑还没踩完,测试中。redis的搭建在以前的博客中也分享过了 极简模式
但是目前我只测试了单机版的,集群版的要重新启动,有点麻烦,暂缓。
官网的文档给的插件是这样的
<Plugin "write_redis"><Node "example">Host "localhost"Port "6379"Timeout 1000Prefix "collectd/"Database 1MaxSetSize -1MaxSetDuration -1StoreRates true</Node></Plugin>
但是如果你就这样用,在ubuntu上是会报错,在centos上还没测试。
在log中报错的内容是,Timeout后面的配置项都是无法识别的,因此得把它们删除,所以配置项得是这样
<Plugin "write_redis"><Node "example">Host "localhost"Port "6379"Timeout 1000</Node></Plugin>
这样就能连接到redis服务器了,但是你这时候在redis中是找不到数据的。并且在collectd的log中还是会报错,报错是connection reset,看着这样子,还不清楚是谁的问题。当我把redis关掉之后,发现报错变成了connection refused,也就是说之前的是连接上了redis,但是写数据出错了。这样看来,好像是redis的问题。
我在redis的配置文件中,找到了几个关键配置,都是与tcp连接有关的
# Close the connection after a client is idle for N seconds (0 to disable)
timeout 0# TCP keepalive.
#
# If non-zero, use SO_KEEPALIVE to send TCP ACKs to clients in absence
# of communication. This is useful for two reasons:
#
# 1) Detect dead peers.
# 2) Take the connection alive from the point of view of network
# equipment in the middle.
#
# On Linux, the specified value (in seconds) is the period used to send ACKs.
# Note that to close the connection the double of the time is needed.
# On other kernels the period depends on the kernel configuration.
#
# A reasonable value for this option is 60 seconds.
tcp-keepalive 0
这两个是用来控制redis和其他进程通信的,默认值都是0。个人感觉是问题出在这里,因此我把这两个配置都改成了60。
果然,问题就在这两个配置上。重启redis,重启collectd,连接成功,这时候在redis中可以看到采集到数据了。用命令查询所有的key
keys *
这些key都是自动生成的,而且数据结构是sorted set,每个key中以timestap排序。这个结构不符合我的要求,估计要自己写相关插件进行配置了。