Skip to end of metadata
Go to start of metadata

近期在开源社区日益火热的Kubernetes项目中用到一款重要组件etcd,渐渐为人们所关注。etcd 是一个分布式键值对存储,设计用来可靠而快速的保存关键数据并提供访问。通过分布式锁,leader选举和写屏障(write barriers)来实现可靠的分布式协作。etcd集群是为高可用,持久性数据存储和检索而准备,还可以用于配置共享和服务发现。Etcd相对于和它有类似功能的zookeeper来说更加轻量级。

在日常使用etcd过程中,存储在etcd的数据会随着应用程序各类操作而动态变化。我们做监控的人看到动态变化的数据,就会想哪能否通过Zabbix来监控这些数据从而实现应用程序的监控?下面我通过一个简单的例子演示一下,如何使用Zabbixetcd里面存储数据监控起来。

01. Etcd的安装

a.首先我们把传说中etcd安装起来,依次运行以下命令或者整成脚本运行:

以上是测试环境安装过程,为方便我们使用。要上生产环境可以参照官方文档

对于etcd不太熟悉的小伙伴,可以去这里学习。基本操作都在里面了。

b.启动etcd单机模式

运行以下命令启动etcd:

/tmp/etcd-download-test/etcd


当看到embed: ready to serve client requests 你的etcd单机模式就已经启动成功了。

c.验证是否正常运行:

首先export一下环境变量:

export ETCDCTL_API=3

etcd数据库写入数据:

/tmp/etcd-download-test/etcdctl put Zabbixtest 888888


etcd读取数据:

02. Etcd客户端编写

到了这里测试环境的etcd就搭建完成,接下来我们通过go语言写一个读取etcd的客户端,并把数据通过Zabbix sender发送到Zabbix server

这段代码中用到2个第三方库,一个是go.etcd.io/etcd/clientv3用于连接到etcd,另外一个是github.com/fujiwara/go-Zabbix-get/Zabbix 用于实现Zabbix sender协议的。通过go get url 可以从公共仓库取下来。

代码中有几个变量需要修改环境对应信息。HostName:主机名,Zabbix里面配置agent的主机名;

ZabbixServerZabbix serverip地址;

endpoints:etcdip地址。

通过go run 命令把上面的代码运行起来。成功运行的话看到以下返回结果

03. Zabbix监控项配置

我们需要Zabbix添加一个监控项用于接收etcd客户端发过去的数据。

选择一台需要监控的主机(etcd客户端配置的主机名一致的主机),新建一个监控项,监控项的type选择【Zabbix trapper(Zabbix采集器)Key要和etcd客户端一致才能接收到数据。为方便调试,数据存储类型选择 Text类型。

04. 数据发送测试

通过命令行往etcd写几条数据,模拟应用程序操作。看下Zabbix能否正常接收到数据。

etcd写入数据:

Etcd命令行

写入2条数据,etcd检测数据的变化,自动发通知给Zabbix。如下下图:

Etcd客户端

Zabbix监控数据

05. 小结

以上的例子基于etcd watch机制的客户端开发出来,可以实时检测到etcd数据变化并发送到Zabbix server。当然例子比较简单,只是把获取的结果直接返回Zabbix server。但只要在此基础上进行一些简单改造,就可以实现实时的应用程序的监控。下面我举几个可能实现的场景:

  1. 高可用集群监控,应用程序会把高可用的选举标志放在etcd中,通过监控这个标志状态来实现应用程序高可用集群监控;
  2. 分布式服务发现的监控,在实现分布式服务过程中,会把服务上线和下线信息注册到etcd中。通过监控etcd中的数据就可以实现分布式服务实时动态监控;
  3. 应用程序数据监控,例如kubernetes会把配置存储etcd中,比如网络配置数据,存储配置数据,pod的配置数据等等。同样可以把他们监控起来。