个人公众号“运维开发故事”。
擅长领域:Zabbix基础设施运维以及Zabbix图形化展示。
MQTT协议简介
MQTT(消息队列遥测传输)是ISO 标准(ISO/IEC PRF 20922)下基于发布/订阅范式的物联网通信协议。它工作在 TCP/IP协议族上,是为硬件性能低下的远程设备以及网络状况糟糕的情况下而设计的发布/订阅型消息协议。MQTT被广泛用于汽车,制造业,电信,石油和天然气等行业以及通过卫星链路与代理通信的传感器、与医疗服务提供者的拨号连接,以及一系列家庭自动化和小型设备场景。它也是移动应用的理想选择,因为它体积小,功耗低,数据包最小,并且可以有效地将信息分配给一个或多个接收器。
MQTT有两个组件:
-
MQTT代理:MQTT代理是通信的中心点。代理负责在客户端之间分派所有消息。
-
MQTT客户端:MQTT客户端是连接到broker的任何设备。发送消息的客户端是发布者。接收消息的客户端是订阅者。要接收消息,客户端必须订阅该消息的主题。
部署mqtt协议的服务
实现了mqtt协议的服务器有很多种,这里我使用了mosquitto服务在centos上部署
mkdir data && cd data
wget http://mosquitto.org/files/source/mosquitto-1.6.8.tar.gz
tar -zxvf mosquitto-1.6.8.tar.gz
cd mosquitto-1.6.8
make && make install
ln -s /usr/local/lib/libmosquitto.so.1 /usr/lib/libmosquitto.so.1
ldconfig
我们可以编辑配置文件mosquitto.conf,修改监听地址,并设置认证用户密码,并在启动的时候使用-c 参数指定配置文件
部署完成后启动borker服务,我这里使用默认配置
mosquitto -v
订阅sensor主题
mosquitto_sub -v -t sensor
向sensor主题发布内容
mosquitto_pub -t sensor -m 12
发布完之后便会在订阅者客户段接收到
使用zabbxi agent2收集发布者发布的消息
zabbix agent2在这里扮演的是一个订阅者的角色,zabbix agent2使用GO语言开发,这样我们可以通过go语言编写一些自定义插件来实现我们的监控需求,插件相对于自定义脚本优点之一是插件是长连接的,而自定义脚本每次处理用户指标时都会fork一个新进程,关于agent与agent2的区别可以查看官方文档
点击查看官方文档
本文通过zabbix自定义插件实现mqtt协议的消息采集,关于agent2自定义插件介绍可查看官方文档
点击查看官方文档
或者查看Zabbix认证专家米宏翻译的文章(特别好)
01-下载zabbix agent2源码并将自定义插件编译
mqtt插件由维塔利·朱拉夫列夫(Vitaly Zhuravlev)编写,地址https://github.com/v-zhuravlev/zbx_plugin_mqtt,就是下面这位大神,其实刮了胡子还是挺帅的,当然仅次于我。
点击加入峰会向更多讲师学习
yum install golang
git clone https://git.zabbix.com/scm/zbx/zabbix.git --depth 1 zabbix-agent2
cd zabbix-agent2
git submodule add https://github.com/v-zhuravlev/zbx_plugin_mqtt.git src/go/plugins/mqtt
02-导入mqtt插件
vi src/go/plugins/plugins.go
package plugins
import (
_ "zabbix.com/plugins/log"
_ "zabbix.com/plugins/systemrun"
_ "zabbix.com/plugins/zabbix/async"
_ "zabbix.com/plugins/zabbix/stats"
_ "zabbix.com/plugins/zabbix/sync"
_ "zabbix.com/plugins/mqtt"
)
03-编译安装zabbix agent2
./bootstrap.sh
pushd .
cd src/go/
go mod vendor
popd
./configure --enable-agent2 --enable-static
make install
04-编辑配置文件
这里我调整了日志级别,方便前台调试
可选参数
-
Plugins.MQTTSubscribe.Username = <mqtt用户名>
-
Plugins.MQTTSubscribe.Password = <mqtt密码>
-
Plugins.MQTTSubscribe.ClientID = zabbix-agent2-mqtt-client //如果未设置将自动生成ClientID
-
Plugins.MQTTSubscribe.Timeout = 5 //定义此插件的连接超时时间,如果不定义将使用zabbix agent2的超时时间
05- 启动zabbix_agent2
cd /root/zabbix_agent/src/go/bin
./zabbix_agent2 -c ../conf/zabbix_agent2.conf
MQTT插件实现了一个Watcher接口,Watcher接口使用的push模型,当有新数据产生,会主动push给服务器
08- Zabbix创建监控项
键值示例如下
mqtt.subscribe[<MQTT broker URL>,<MQTT topic>]
注意监控项类型必须是主动式
我们可以通过mqtt client来发送一些数据
可以在zabbix agent2前台看到数据实时推送给了zabbix server,当没有新数据产生的时候,agent2也会每隔两分钟(默认)连接server的10051端口来请求有关监控项的信息