我们业务的 Cacti 已经运作了几年,添加的图形越来越多,意味着获取的数据越多服务器的压力就越大,如果某一个进程遇到了瓶颈,所有图形都出不了图,就要被领导吊死,所以我们运维人员常常都要多巡检,是否出现问题。

在这么大的业务量我是不敢去升级系统版本了,而且现在的 Cacti 新版听说已经跟旧版 Cacti 不是同一批人维护的,万一升级了导致数据全没了怎么办,那就只能维持现状。在这一年中,遇到的错误都可以修复,就简单说说我见过的故障以及当初的应急处理方法。

当然,重启可以解决 95% 的问题。我下面写的是我见过的故障,如果未来遇到没有见过的故障,到时候也会在文章里补充。

遇到 SQL Error 导致出不了图

当时值班同事遇到出不了图的情况,查看系统告警有:

03/31/2020 01:16:25 PM - CMDPHP: Poller[0] ERROR: SQL Cell Failed!, Error:'2006', SQL:"SELECT GET_LOCK('boost.single_ds.814', 1)"
03/31/2020 01:16:25 PM - CMDPHP: Poller[0] ERROR: SQL Cell Failed!, Error:'2006', SQL:"SELECT GET_LOCK('boost.single_ds.814', 1)"
03/31/2020 01:16:25 PM - CMDPHP: Poller[0] ERROR: SQL Cell Failed!, Error:'2006', SQL:"SELECT GET_LOCK('boost.single_ds.814', 1)"
03/31/2020 01:16:25 PM - CMDPHP: Poller[0] ERROR: SQL Cell Failed!, Error:'2006', SQL:"SELECT GET_LOCK('boost.single_ds.814', 1)"
03/31/2020 01:16:25 PM - CMDPHP: Poller[0] ERROR: SQL Cell Failed!, Error:'2006', SQL:"SELECT GET_LOCK('boost.single_ds.814', 1)"
03/31/2020 01:16:25 PM - CMDPHP: Poller[0] ERROR: SQL Cell Failed!, Error:'2006', SQL:"SELECT GET_LOCK('boost.single_ds.814', 1)"
03/31/2020 01:16:24 PM - CMDPHP: Poller[0] ERROR: SQL Cell Failed!, Error:'2006', SQL:"SELECT GET_LOCK('boost.single_ds.814', 1)"

当时预判是数据库崩了,只能修复数据库。

临时措施

  1. 万能办法:重启试试
  2. 通用方法:[控制台] - [系统工具] - [重建采集器缓存] (要等20分钟)
  3. 老实人办法:

    • 查看日志: [控制台] - [系统工具] - [查看 CactiEZ 日志]
    • 如果看到很多红色的错误,而且都是 SQL Error 那这种的话。估计数据库崩了,怎么修复呢?
    • 去 Cacti 的 SSH后台,执行以下命令
cd /var/www/html/cli/
php repair_database.php 
reboot # 如果故障未恢复就重启服务器

单个设备不出图

当时我们看有些交换机不出图,其他交换机图形正常,查看主机的当时延时已经超过了 1000ms,查看 Cacti 日志是这样的.

04/26/2020 10:55:42 AM - SPINE: Poller[0] Host[1480] TH[1] DS[171614] WARNING: SNMP timeout detected [1000 ms], ignoring host 'X.X.X.X'
04/26/2020 10:55:42 AM - SPINE: Poller[0] Host[1480] TH[1] DS[171614] WARNING: SNMP timeout detected [1000 ms], ignoring host 'X.X.X.X'
04/26/2020 10:55:42 AM - SPINE: Poller[0] Host[1480] TH[1] DS[171603] WARNING: SNMP timeout detected [1000 ms], ignoring host X.X.X.X'
04/26/2020 10:55:42 AM - SPINE: Poller[0] Host[1480] TH[1] DS[171603] WARNING: SNMP timeout detected [1000 ms], ignoring host 'X.X.X.X'

上面的告警是该 x.x.x.x 的设备,服务器获取设备的 SNMP 数据超时了 1 秒,会忽略掉该事件的数据。延时超过 1000ms 是什么问题呢?

  1. 交换机 SNMP 服务处理能力瓶颈(可能是CPU)
  2. 网络传输丢包问题
  3. 设备问题或服务问题

临时措施

如果无法从设备方面排障的话,但服务是正常的话,先缓解出不了图的问题,打开 [控制台] - [主机] - 找到这个主机详情,然后更改 [SNMP 选项] 的内容。

  • SNMP 超时:10000 或 以上
  • 获取请求的最大 OID:10 ~ 20 之间 (如果数值越大对服务器压力越高,得不偿失)

当然,这样做也有弊端,数据会更加不精准,毕竟每 1 分钟的取值因为延时原因,导致取值反差太大,系统再用平均值计算就有流量突升与突降的现象,但实际上是没问题的。