Collectd与Redis--数据传输

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 1000
        Prefix "collectd/"
        Database 1
        MaxSetSize -1
        MaxSetDuration -1
        StoreRates 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排序。这个结构不符合我的要求,估计要自己写相关插件进行配置了。

2020/08/09补充

Collectd连接Redis集群

在另外的机房开了一个redis集群,由于collectd采集的数据要跨主机传输到redis集群,因此有一些注意的地方。

首先,redis要关闭保护模式,各位看以下的提醒即可

Node 10.160.105.178:7001 DENIED Redis is running in protected mode because protected mode is enabled, no bind address was specified, no authentication password is requested to clients. In this mode connections are only accepted from the loopback interface. If you want to connect from external computers to Redis you may adopt one of the following solutions: 1) Just disable protected mode sending the command ‘CONFIG SET protected-mode no’ from the loopback interface by connecting to Redis from the same host the server is running, however MAKE SURE Redis is not publicly accessible from internet if you do so. Use CONFIG REWRITE to make this change permanent. 2) Alternatively you can just disable the protected mode by editing the Redis configuration file, and setting the protected mode option to ‘no’, and then restarting the server. 3) If you started the server manually just for testing, restart it with the ‘–protected-mode no’ option. 4) Setup a bind address or an authentication password. NOTE: You only need to do one of the above things in order for the server to start accepting connections from the outside.

长话短说,我采用了第一种做法,直接取消保护模式,但是要确保你的redis集群只能在局域网内被访问,不然你就加密码,但是加密码collectd就没有权限写数据了,因为write_redis插件不支持Password的配置项。可能还有别的办法,目前还没测试出来。

取消保护模式的方法:
1、配置文件取消
2、redis-cli打开客户端,在客户端输入两条命令,应该是要每个node都要这样设置一遍。

#取消保护模式
CONFIG SET protected-mode no
#持久化到配置文件
CONFIG REWRITE

这时候collectd就能连接到redis集群了,但是发现redis中只有01和04这两个主从节点有数据。搞了很久,尝试了下往collectd中加redis node的配置项,因为我原先只有01的node节点,修改完是这样的

<Plugin write_redis>
        <Node "redis_01">
                Host "10.166.33.33"
                Port "7001"
                Timeout 1000
        </Node>
        <Node "redis_02">
                Host "10.166.33.33"
                Port "7002"
                Timeout 1000
        </Node>
        <Node "redis_03">
                Host "10.166.33.33"
                Port "7003"
                Timeout 1000
        </Node>
<Plugin write_redis>

经测试,数据全部存到redis集群中了。下一步,让redis中存储的数据变成我们想要的格式,比如json这样,准备写个插件。待续…

©️2020 CSDN 皮肤主题: 大白 设计师:CSDN官方博客 返回首页