使用ganglia记录局域网内多台服务器的历史资源信息
使用云服务器或者如PVE的虚拟化平台时,软件提供的监控信息会显示过去一段时间内虚拟化的服务器的资源状态(如CPU占用、网络流量等)。但是在自己的Linux服务器上记录历史信息则需要额外的软件来实现这样功能。这里选用了一个轻量化的、支持集群的软件ganglia实现这样的功能。
以下内容只适用于Debian(包括Ubuntu、Raspbian、Armbian、ProxmoxVE等基于Debian的系统)。
ganglia是一个可同时支持多个集群、可分布式交换数据的资源监控软件。相对ServerStatus及其各个修改版本而言,ganglia支持记录多台服务器的历史数据;相对netdata等软件来说,ganglia较为轻量化(资源占用明显更少),不过同时它的前端面板也比较简陋,不过已经足够使用。
本文不详述ganglia的各种功能,只说明如何使用ganglia监控一个局域网内的若干台Linux设备,局域网也可以是利用zerotier或者tinc等软件组建的虚拟局域网。另外注意,在公网服务器上使用时需要注意数据安全性。
ganglia本身不区分客户端,每一个节点都可以保存其他节点的数据。但是本文仅作简单应用,用一台设备作服务端,其他节点仅向服务端发送数据,即均视为客户端。以下假设局域网中有一台IP为192.168.2.2的服务器,用作ganglia的服务端,另一台IP为192.168.2.3的服务器作为被ganglia采集数据的客户端。
服务器搭建
如果服务端不能识别到客户端IP的计算机名,则会以客户端IP的形式展示在前端页面的节点列表中。如果希望前端展示数据时,节点名以计算机名方式显示,则需要确保能够识别到客户端IP的计算机名,或者直接将客户端的IP和计算机名写入到hosts中。如果安装服务端后再修改计算机名,则前端页面会同时出现客户端的两个节点。
Debian源中已包含了最新版本的ganglia,使用apt命令直接安装即可。其中ganglia-webfrontend为网页前端,在安装时会自动安装apache2和php作为数据展示的前端。
sudo apt-get install ganglia-webfrontend gmetad ganglia-monitor
ganglia-monitor用于采集和发送数据,在客户端上仅安装该软件即可。服务端需要使用该软件接收数据,即ganglia同时会采集服务端上的数据。
将前端的相关文件链接到apache2的WebRoot中,以便通过浏览器访问:
sudo ln -s /usr/share/ganglia-webfrontend /var/www/html/ganglia
编辑/etc/ganglia/gmetad.conf文件。找到datasource行,将其修改
data_source "GangliaMonitor" 192.168.2.2
其中引号内为集群的名字,除非需要分别显示在多个集群中(可以使用多行data_source),否则后续客户端配置中需要使用相同的名字。此处采用相同的名字即可。之后的IP为服务端的IP,表示gmetad会从该IP中收集数据。如有多个数据收集的服务端,则可以填写多个IP,用空格隔开即可。此处仅填写接收采集数据的服务端的IP即可。
另外gridname行按需要取一个名字即可。该名字会显示在前端中集群名字之前的路径中。不设置不影响使用。
之后编辑/etc/ganglia/gmond.conf文件。找到cluster单元,将name改成上述的集群名字GangliaMonitor:
cluster {
name = "GangliaMonitor"
owner = "unspecified"
latlong = "unspecified"
url = "unspecified"
}
修改发送和接收的IP配置,将多播地址mcast_join注释掉或删除,添加host服务器地址:
udp_send_channel {
#mcast_join = 239.2.11.71
host = 192.168.2.2
port = 8649
ttl = 1
}
udp_recv_channel {
#mcast_join = 239.2.11.71
port = 8649
bind = 192.168.2.2
}
至此,服务器端配置完毕,重启服务即可:
sudo service gmetad restart
sudo service ganglia-monitor restart
然后访问http://192.168.2.2/ganglia,应该可以看到假设服务端的服务器开始记录的资源信息。
客户端配置
客户端上安装ganglia-monitor即可:
sudo apt-get install ganglia-monitor
之后编辑/etc/ganglia/gmond.conf文件。由于此场景下客户端无需接收数据,将global单元中的deaf设置为yes:
globals {
daemonize = yes
setuid = yes
user = ganglia
debug_level = 0
max_udp_msg_len = 1472
mute = no
deaf = yes
host_dmax = 0 /*secs */
cleanup_threshold = 300 /*secs */
gexec = no
send_metadata_interval = 0
}
cluster单元与服务器端一致:
cluster {
name = "GangliaMonitor"
owner = "unspecified"
latlong = "unspecified"
url = "unspecified"
}
udp_send_channel部分host地址填写服务端IP,并将udp_recv_channel注释或删除(不注释也可,应为已经设置deaf为yes使客户端不再打开接收数据的端口,只需向服务端发送数据)
udp_send_channel {
#mcast_join = 239.2.11.71
host = 192.168.2.2
port = 8649
ttl = 1
}
#udp_recv_channel {
# mcast_join = 239.2.11.71
# port = 8649
# bind = 192.168.2.3
#}
可以注释掉一些不需要的metric单元表示无需采集某些数据,不注释则默认全部采集。
之后重启服务即可:
sudo service ganglia-monitor restart
其他说明
服务端上,所有采集的数据默认存放在/var/lib/ganglia/rrds/文件夹中。如果删除了该文件夹,会清空所有已保存的数据,但ganglia不会重新创建该目录,需要手动创建,且其所有者必须为nobody。如需清空数据,删除该目录里的内容即可,不建议直接删除该目录。
在前端页面中,每个客户端节点回以IP形式表示。如果希望显示一个节点名字,则可将该节点的IP添加在/etc/hosts。
前端网页有移动端版本,本例中访问 http://192.168.2.2/ganglia/mobile.php 可直接进入移动版。