这篇文章主要介绍了分布式监控系统之Zabbix 使用SNMP、JMX信道采集数据,本文给大家介绍的非常详细,对大家的学习或工作就有一定的参考借鉴价值,需要的朋友可以参考下
前文我们了解了zabbix的被动、主动以及web监控相关话题,回顾请参考https://www.jb51.net/article/200679.htm;今天我们来了解下zabbix使用SNMP和JMX信道采集数据的相关话题;
1、SNMP协议介绍
SNMP是英文“Simple Network Management Protocol”的缩写,中文意思是“简单网络管理协议,SNMP是一种简单网络管理协议,它属于TCP/IP五层协议中的应用层协议,用于网络管理的协议,SNMP主要用于网络设备的管理。SNMP的基本思想:为不同种类的设备、不同厂家生产的设备、不同型号的设备,定义为一个统一的接口和协议,使得管理员可以是使用统一的外观面对这些需要管理的网络设备进行管理。通过网络,管理员可以管理位于不同物理空间的设备,从而大大提高网络管理的效率,简化网络管理员的工作。SNMP协议是TCP/IP协议簇的一个应用层协议,在1988年被制定,并被Internet体系结构委员会(IAB)采纳作为一个短期的网络管理解决方案,由于SNMP的简单性,在Internet时代得到了蓬勃的发展,1992年发布了SNMPv2版本,以增强SNMPv1的安全性和功能,SNMP的协议版本目前有SNMP v1、SNMP v2c和SNMP v3三种版本,其具体差别如下:
SNMP v1采用社区名(Community Name)认证,社区名用来定义SNMP NMS和SNMP Agent的关系,如果SNMP报文携带的社区名没有得到设备的认可,该报文将被丢弃,社区名起到了类似于密码的作用,用来限制SNMP NMS对SNMP Agent的访问。
SNMP v2c也采用社区名认证,它在兼容SNMP v1的同时又扩充了SNMP v1的功能,它提供了更多的操作类型(GetBulk和InformRequest)、支持更多的数据类型(Counter64等)、提供了更丰富的错误代码且能够更细致地区分错误。
SNMP v3提供了基于用户的安全模型(USM,User-Based Security Model)的认证机制,用户可以设置认证和加密功能,认证用于验证报文发送方的合法性,避免非法用户的访问,加密则是对NMS和Agent之间的传输报文进行加密,以免被窃听。通过有无认证和有无加密等功能组合,可以为SNMP NMS和SNMP Agent之间的通信提供更高的安全性。
2、SNMP工作机制
SNMP的工作机制SNMP网络元素分为NMS和Agent两种:NMS(Network Management Station,网络管理站)是运行SNMP客户端程序的工作站,能够提供非常友好的人机交互界面,方便网络管理员完成绝大多数的网络管理工作。Agent是驻留在设备上的一个进程,负责接收、处理来自NMS的请求报文。在一些紧急情况下,如接口状态发生改变等,Agent也会主动通知NMS。NMS是SNMP网络的管理者,Agent是SNMP网络的被管理者。NMS和Agent之间通过SNMP协议来交互管理信息。
3、SNMP数据交互
SNMP管理进程与代理进程之前为了交互信息,定义了5种报文:
get-request操作:从代理进程处提取一个或多个参数值。
get-next-request操作:从代理进程处提取一个或多个参数的下一个参数值。
set-request操作:设置代理进程的一个或多个参数值。
get-response操作:返回的一个或多个参数值。这个操作是由代理进程发出的。
trap 操作:代理进程主动发出的报文,通知管理进程有某些事情发生。
SNMP数据交互示意图
4、SNMP组织结构
一套完整的SNMP系统主要包括以下几个方面:SNMP报文协议。管理信息结构(SMI, Structure ofManagement Information),一套公用的结构和表示符号。管理信息库(MIB,Management Information Base),管理信息库包含所有代理进程的所有可被查询和修改的参数。OID(Object Identifiers),一个OID是一个唯一的键值对,用于标识具体某一个设备的某个具体信息(对象标识),如端口信息、设备名称等。
5、SNMP MIB
所谓(MIB)管理信息库,就是所有代理进程包含的、并且能够被管理进程进行查询和设置的信息的集合。MIB是基于对象标识树的,对象标识是一个整数序列,中间以”.”分割,这些整数构成一个树型结构,类似于 DNS或Unix的文件系统,MIB被划分为若干个组,如system、 interfaces、 at(地址转换)和ip组等。iso.org.dod.internet.private.enterprises( 1.3.6.1.4.1)这个标识,是给厂家自定义而预留的,比如华为的为1.3.6.1.4.1.2011,华三的为1.3.6.1.4.1.25506。
Centos 部分常用的OID
6、在Linux上启用SNMP
[root@node05 ~]# yum install -y net-snmp
提示:以上安装是安装snmp agent,运行在被监控端;
安装snmp客户端工具
[root@node05 ~]# yum install -y net-snmp-utils
配置snmp允许那些社区的客户端获取数据,以及对snmp有哪些权限,允许获取那些数据
提示:以上配置表示,首先将社区名public映射为一个安全的名称notConfigUser;其次映射安全名notConfigUser映射为组名notConfigGroup,并将安全模式v1和v2c加入到组内,这表示只要在这个组内的成员都兼容v1 和v2c两个版本的安全模式;第三是创建一个视图,名为systemview,并配置允许那些叶子节点或子树的oid加入到此视图;最后授权notConfigGroup组里的任何用户,用任何安全模式都对systemview拥有只读权限,不拥有写权限,也没有例外;简单点讲以上配置表示只要是public社区的用户,都将识别为notConfigGroup里的用户,而对应组里的用户拥有systemview授权的子树只读权限;这里需要注意,子树就是我们要获取的数据对象的标识(oid);我们授权只需要修改对应systemview拥有那些子树或叶子节点即可;授权一颗子树意味着该子树下的所有叶子节点或子树都可以被访问,授权一个叶子节点表示精确只能看到对应叶子节点;
示例:授权systemview视图拥有对操作系统cpu负载1分钟的数据
提示:只需要将对应cpu1分钟负载对应oid加入到systemview视图即可;
启动snmpd
[root@node05 ~]# systemctl start snmpd.service [root@node05 ~]# ss -unl State Recv-Q Send-Q Local Address:Port Peer Address:Port UNCONN 0 0 *:161 *:* UNCONN 0 0 127.0.0.1:323 *:* UNCONN 0 0 ::1:323 :::* [root@node05 ~]#
提示:请确保udp的161端口正常监听;
验证:使用snmpget工具来获取node05上的cpu1分钟负载数据
[root@node05 ~]# snmpget -c public -v 2c node05 .1.3.6.1.4.1.2021.10.1.3.1 UCD-SNMP-MIB::laLoad.1 = STRING: 0.00 [root@node05 ~]# uptime 20:57:49 up 35 min, 1 user, load average: 0.00, 0.02, 0.05 [root@node05 ~]#
提示:可以看到用snmpget工具获取的数据和我们使用uptime命令获取的数据一样;指定获取数据可以使用oid来指定,也可以使用mib来获取;
[root@node05 ~]# snmpget -c public -v 2c node05 UCD-SNMP-MIB::laLoad.1 UCD-SNMP-MIB::laLoad.1 = STRING: 0.00 [root@node05 ~]#
使用snmpwalk工具获取非叶子节点下所有数据
首先授权snmp能够看到对应子树
提示:以上红框中内容表示systemview包含.1.3.6.1.2.1.25这个子树,这意味着其下的所有子树和叶子节点都可以看到;
重启snmpd
[root@node05 ~]# systemctl restart snmpd.service [root@node05 ~]# ss -unl State Recv-Q Send-Q Local Address:Port Peer Address:Port UNCONN 0 0 *:161 *:* UNCONN 0 0 127.0.0.1:323 *:* UNCONN 0 0 ::1:323 :::* [root@node05 ~]#
获取系统进程列表
[root@node05 ~]# snmpwalk -c public -v 2c node05 .1.3.6.1.2.1.25.4.2.1.2 HOST-RESOURCES-MIB::hrSWRunName.1 = STRING: \"systemd\" HOST-RESOURCES-MIB::hrSWRunName.2 = STRING: \"kthreadd\" HOST-RESOURCES-MIB::hrSWRunName.3 = STRING: \"ksoftirqd/0\" HOST-RESOURCES-MIB::hrSWRunName.5 = STRING: \"kworker/0:0H\" HOST-RESOURCES-MIB::hrSWRunName.7 = STRING: \"migration/0\" HOST-RESOURCES-MIB::hrSWRunName.8 = STRING: \"rcu_bh\" HOST-RESOURCES-MIB::hrSWRunName.9 = STRING: \"rcu_sched\" HOST-RESOURCES-MIB::hrSWRunName.10 = STRING: \"watchdog/0\" HOST-RESOURCES-MIB::hrSWRunName.11 = STRING: \"watchdog/1\" HOST-RESOURCES-MIB::hrSWRunName.12 = STRING: \"migration/1\" HOST-RESOURCES-MIB::hrSWRunName.13 = STRING: \"ksoftirqd/1\" HOST-RESOURCES-MIB::hrSWRunName.14 = STRING: \"kworker/1:0\" HOST-RESOURCES-MIB::hrSWRunName.15 = STRING: \"kworker/1:0H\" HOST-RESOURCES-MIB::hrSWRunName.17 = STRING: \"kdevtmpfs\" HOST-RESOURCES-MIB::hrSWRunName.18 = STRING: \"netns\" HOST-RESOURCES-MIB::hrSWRunName.19 = STRING: \"khungtaskd\" HOST-RESOURCES-MIB::hrSWRunName.20 = STRING: \"writeback\" HOST-RESOURCES-MIB::hrSWRunName.21 = STRING: \"kintegrityd\" HOST-RESOURCES-MIB::hrSWRunName.22 = STRING: \"bioset\" HOST-RESOURCES-MIB::hrSWRunName.23 = STRING: \"kblockd\" HOST-RESOURCES-MIB::hrSWRunName.24 = STRING: \"md\" HOST-RESOURCES-MIB::hrSWRunName.25 = STRING: \"kworker/0:1\" HOST-RESOURCES-MIB::hrSWRunName.30 = STRING: \"kswapd0\" HOST-RESOURCES-MIB::hrSWRunName.31 = STRING: \"ksmd\" HOST-RESOURCES-MIB::hrSWRunName.32 = STRING: \"khugepaged\" HOST-RESOURCES-MIB::hrSWRunName.33 = STRING: \"crypto\" HOST-RESOURCES-MIB::hrSWRunName.41 = STRING: \"kthrotld\" HOST-RESOURCES-MIB::hrSWRunName.42 = STRING: \"kworker/u256:1\" HOST-RESOURCES-MIB::hrSWRunName.43 = STRING: \"kmpath_rdacd\" HOST-RESOURCES-MIB::hrSWRunName.44 = STRING: \"kworker/1:1\" HOST-RESOURCES-MIB::hrSWRunName.45 = STRING: \"kpsmoused\" HOST-RESOURCES-MIB::hrSWRunName.47 = STRING: \"ipv6_addrconf\" HOST-RESOURCES-MIB::hrSWRunName.66 = STRING: \"deferwq\" HOST-RESOURCES-MIB::hrSWRunName.98 = STRING: \"kauditd\" HOST-RESOURCES-MIB::hrSWRunName.265 = STRING: \"kworker/1:2\" HOST-RESOURCES-MIB::hrSWRunName.282 = STRING: \"ata_sff\" HOST-RESOURCES-MIB::hrSWRunName.283 = STRING: \"scsi_eh_0\" HOST-RESOURCES-MIB::hrSWRunName.284 = STRING: \"scsi_tmf_0\" HOST-RESOURCES-MIB::hrSWRunName.285 = STRING: \"scsi_eh_1\" HOST-RESOURCES-MIB::hrSWRunName.286 = STRING: \"scsi_tmf_1\" HOST-RESOURCES-MIB::hrSWRunName.289 = STRING: \"mpt_poll_0\" HOST-RESOURCES-MIB::hrSWRunName.290 = STRING: \"mpt/0\" HOST-RESOURCES-MIB::hrSWRunName.298 = STRING: \"scsi_eh_2\" HOST-RESOURCES-MIB::hrSWRunName.299 = STRING: \"scsi_tmf_2\" HOST-RESOURCES-MIB::hrSWRunName.300 = STRING: \"ttm_swap\" HOST-RESOURCES-MIB::hrSWRunName.375 = STRING: \"kdmflush\" HOST-RESOURCES-MIB::hrSWRunName.376 = STRING: \"bioset\" HOST-RESOURCES-MIB::hrSWRunName.387 = STRING: \"kdmflush\" HOST-RESOURCES-MIB::hrSWRunName.388 = STRING: \"bioset\" HOST-RESOURCES-MIB::hrSWRunName.401 = STRING: \"bioset\" HOST-RESOURCES-MIB::hrSWRunName.402 = STRING: \"xfsalloc\" HOST-RESOURCES-MIB::hrSWRunName.403 = STRING: \"xfs_mru_cache\" HOST-RESOURCES-MIB::hrSWRunName.404 = STRING: \"xfs-buf/dm-0\" HOST-RESOURCES-MIB::hrSWRunName.405 = STRING: \"xfs-data/dm-0\" HOST-RESOURCES-MIB::hrSWRunName.406 = STRING: \"xfs-conv/dm-0\" HOST-RESOURCES-MIB::hrSWRunName.407 = STRING: \"xfs-cil/dm-0\" HOST-RESOURCES-MIB::hrSWRunName.408 = STRING: \"xfs-reclaim/dm-\" HOST-RESOURCES-MIB::hrSWRunName.409 = STRING: \"xfs-log/dm-0\" HOST-RESOURCES-MIB::hrSWRunName.410 = STRING: \"xfs-eofblocks/d\" HOST-RESOURCES-MIB::hrSWRunName.411 = STRING: \"xfsaild/dm-0\" HOST-RESOURCES-MIB::hrSWRunName.467 = STRING: \"kworker/1:1H\" HOST-RESOURCES-MIB::hrSWRunName.468 = STRING: \"kworker/0:1H\" HOST-RESOURCES-MIB::hrSWRunName.482 = STRING: \"systemd-journal\" HOST-RESOURCES-MIB::hrSWRunName.506 = STRING: \"lvmetad\" HOST-RESOURCES-MIB::hrSWRunName.511 = STRING: \"systemd-udevd\" HOST-RESOURCES-MIB::hrSWRunName.544 = STRING: \"xfs-buf/sda1\" HOST-RESOURCES-MIB::hrSWRunName.545 = STRING: \"xfs-data/sda1\" HOST-RESOURCES-MIB::hrSWRunName.546 = STRING: \"xfs-conv/sda1\" HOST-RESOURCES-MIB::hrSWRunName.547 = STRING: \"xfs-cil/sda1\" HOST-RESOURCES-MIB::hrSWRunName.548 = STRING: \"xfs-reclaim/sda\" HOST-RESOURCES-MIB::hrSWRunName.549 = STRING: \"xfs-log/sda1\" HOST-RESOURCES-MIB::hrSWRunName.550 = STRING: \"xfs-eofblocks/s\" HOST-RESOURCES-MIB::hrSWRunName.551 = STRING: \"xfsaild/sda1\" HOST-RESOURCES-MIB::hrSWRunName.554 = STRING: \"nfit\" HOST-RESOURCES-MIB::hrSWRunName.598 = STRING: \"kworker/u257:0\" HOST-RESOURCES-MIB::hrSWRunName.599 = STRING: \"hci0\" HOST-RESOURCES-MIB::hrSWRunName.600 = STRING: \"hci0\" HOST-RESOURCES-MIB::hrSWRunName.602 = STRING: \"kworker/u257:2\" HOST-RESOURCES-MIB::hrSWRunName.624 = STRING: \"auditd\" HOST-RESOURCES-MIB::hrSWRunName.648 = STRING: \"rsyslogd\" HOST-RESOURCES-MIB::hrSWRunName.649 = STRING: \"systemd-logind\" HOST-RESOURCES-MIB::hrSWRunName.650 = STRING: \"polkitd\" HOST-RESOURCES-MIB::hrSWRunName.651 = STRING: \"dbus-daemon\" HOST-RESOURCES-MIB::hrSWRunName.653 = STRING: \"chronyd\" HOST-RESOURCES-MIB::hrSWRunName.660 = STRING: \"NetworkManager\" HOST-RESOURCES-MIB::hrSWRunName.662 = STRING: \"irqbalance\" HOST-RESOURCES-MIB::hrSWRunName.669 = STRING: \"crond\" HOST-RESOURCES-MIB::hrSWRunName.674 = STRING: \"agetty\" HOST-RESOURCES-MIB::hrSWRunName.877 = STRING: \"tuned\" HOST-RESOURCES-MIB::hrSWRunName.976 = STRING: \"sshd\" HOST-RESOURCES-MIB::hrSWRunName.1029 = STRING: \"zabbix_agentd\" HOST-RESOURCES-MIB::hrSWRunName.1030 = STRING: \"zabbix_agentd\" HOST-RESOURCES-MIB::hrSWRunName.1031 = STRING: \"zabbix_agentd\" HOST-RESOURCES-MIB::hrSWRunName.1032 = STRING: \"zabbix_agentd\" HOST-RESOURCES-MIB::hrSWRunName.1033 = STRING: \"zabbix_agentd\" HOST-RESOURCES-MIB::hrSWRunName.1034 = STRING: \"zabbix_agentd\" HOST-RESOURCES-MIB::hrSWRunName.1074 = STRING: \"master\" HOST-RESOURCES-MIB::hrSWRunName.1075 = STRING: \"pickup\" HOST-RESOURCES-MIB::hrSWRunName.1076 = STRING: \"qmgr\" HOST-RESOURCES-MIB::hrSWRunName.1240 = STRING: \"sshd\" HOST-RESOURCES-MIB::hrSWRunName.1242 = STRING: \"bash\" HOST-RESOURCES-MIB::hrSWRunName.1333 = STRING: \"kworker/u256:2\" HOST-RESOURCES-MIB::hrSWRunName.1666 = STRING: \"kworker/0:0\" HOST-RESOURCES-MIB::hrSWRunName.1732 = STRING: \"anacron\" HOST-RESOURCES-MIB::hrSWRunName.1883 = STRING: \"kworker/0:2\" HOST-RESOURCES-MIB::hrSWRunName.1960 = STRING: \"snmpd\" HOST-RESOURCES-MIB::hrSWRunName.1970 = STRING: \"snmpwalk\" [root@node05 ~]#
配置zabbix web使用snmp信道采集node05上的数据,并链接Template OS Linux SNMPv2模板
链接模板
查看主机列表,看看node05对应的SNMP信道是否变绿了?
添加snmp item
提示:在主机列表中找到对应主机上的item,然后点击create item ,填写好item名称,选择SNMP v2 agent;这里的key就只是起一个标识作用,尽量不要和已有的内建key和自定义key重复即可;最重要的是要填写好对应主机的snmp监听的ip地址和端口,以及要采集数据对应的oid或mib和社区名称;社区名称可以写宏,默认就有一个{$SNMP_COMMUNITY}其值就是public;调用对应的宏也是可以的;
查看我们定义的item是否采集到数据呢?
以上就是zabbix使用snmp信道采集数据配置和演示;接下我们再来说说zabbix 使用jmx信道监控java程序
jmx是Java Management Extensions的缩写,即Java管理扩展,它可以跨平台实现灵活的开发无缝集成的系统、网络和服务管理应用。在zabbix 上使用jmx信道采集对应java程序的相关指标数据,首先zabbix原生是不支持jmx,它依赖zabbix-java-gateway这个服务;其次对应被监控主机上运行的java程序要打开jmx功能;zabbix-java-gateway我们可以理解为zabbix jmx的代理服务,它负责zabbix server 委派给它使用jmx信道采集数据,将采集到数据发送给zabbix server ;所以要想使用jmx信道来采集数据,首先我们得安装并启动zabbix java gateway服务,然后配置zabbix server ,告诉zabbix server java gateway服务地址和端口;最后在对应的被监控端开启jmx;
安装zabbix java gateway
[root@node04 ~]# yum install -y zabbix-java-gateway
提示:这个服务可以安装在zabbix server 上,也可以独立一台服务器,也可安装在被监控端;总之zabbix server 能够正常和它通信即可;
配置zabbix java gateway
[root@node04 ~]# grep -Ei \"^[a-z]\" /etc/zabbix/zabbix_java_gateway.conf LISTEN_IP=\"0.0.0.0\" LISTEN_PORT=10052 PID_FILE=\"/var/run/zabbix/zabbix_java.pid\" START_POLLERS=5 TIMEOUT=3 [root@node04 ~]#
提示:以上是java gateway的默认配置,保持默认配置即可;如果后续觉得java gateway的poller少了,可以更改;
启动zabbix java gateway
[root@node04 ~]# systemctl start zabbix-java-gateway.service [root@node04 ~]# ss -tnl State Recv-Q Send-Q Local Address:Port Peer Address:Port LISTEN 0 128 *:6379 *:* LISTEN 0 128 *:80 *:* LISTEN 0 128 *:22 *:* LISTEN 0 100 127.0.0.1:25 *:* LISTEN 0 128 *:10050 *:* LISTEN 0 128 :::80 :::* LISTEN 0 128 :::22 :::* LISTEN 0 100 ::1:25 :::* LISTEN 0 50 :::10052 :::* [root@node04 ~]#
提示:默认java gateway监听在10052端口,启动后请确保该端口处于监听即可;
配置zabbix server
提示:在zabbix server配置文件中找到java gateway的配置,配置Java gateway的ip地址,端口,以及启动的poller数量和超时时间即可;
重启zabbix server
[root@node03 ~]# systemctl restart zabbix-server.service [root@node03 ~]# ss -tnl State Recv-Q Send-Q Local Address:Port Peer Address:Port LISTEN 0 128 *:22 *:* LISTEN 0 100 127.0.0.1:25 *:* LISTEN 0 128 *:10050 *:* LISTEN 0 128 *:10051 *:* LISTEN 0 128 :::22 :::* LISTEN 0 100 ::1:25 :::* LISTEN 0 128 :::10051 :::* [root@node03 ~]#
提示:请确保zabbix server能够正常启动起来;对应端口能够正常处于监听状态;
在node05上安装tomcat服务
[root@node05 ~]# yum install -y tomcat-admin-webapps tomcat-webapps tomcat-docs-webapp tomcat
开启tomcat的jmx功能
完整配置文件内容
[root@node05 ~]# grep -Ei \"^[a-z]\" /etc/tomcat/tomcat.conf TOMCAT_CFG_LOADED=\"1\" TOMCATS_BASE=\"/var/lib/tomcats/\" JAVA_HOME=\"/usr/lib/jvm/jre\" CATALINA_HOME=\"/usr/share/tomcat\" CATALINA_TMPDIR=\"/var/cache/tomcat/temp\" CATALINA_OPTS=\"-Dcom.sun.management.jmxremote=true -Dcom.sun.management.jmxremote.port=12345 -Dcom.sun.management.jmxremote.authenticate=false -Dcom.sun.management.jmxremote.ssl=false -Djava.rmi.server.hostname=192.168.0.45\" JAVA_OPTS=\"-Djavax.sql.DataSource.Factory=org.apache.commons.dbcp.BasicDataSourceFactory\" SECURITY_MANAGER=\"false\" [root@node05 ~]
启动tomcat
[root@node05 ~]# systemctl start tomcat [root@node05 ~]# ss -tnl State Recv-Q Send-Q Local Address:Port Peer Address:Port LISTEN 0 128 *:80 *:* LISTEN 0 128 *:22 *:* LISTEN 0 100 127.0.0.1:25 *:* LISTEN 0 128 *:10050 *:* LISTEN 0 128 127.0.0.1:199 *:* LISTEN 0 100 :::8080 :::* LISTEN 0 128 :::80 :::* LISTEN 0 128 :::22 :::* LISTEN 0 50 :::12345 :::* LISTEN 0 100 ::1:25 :::* LISTEN 0 128 :::10050 :::* LISTEN 0 1 ::ffff:127.0.0.1:8005 :::* LISTEN 0 50 :::44229 :::* LISTEN 0 50 :::35589 :::* LISTEN 0 100 :::8009 :::* [root@node05 ~]#
提示:请确保对应的端口都处于监听状态,jmx我们刚才指定的是12345端口,默认在zabbix使用的端口也是12345,所以这两个端口保持一致即可;
在zabbix web上添加node05并指定使用jmx接口来采集数据
链接模板
查看node05上的jmx信道是否变绿?
查看是否采集到对应模板上的监控项数据呢?
提示:可以看到我们链接的模板,对应很多监控项都采集到数据了;说明我们配置使用jmx采集数据没有什么问题;这里需要注意我们链接都模版,不一定所有都监控项都可以采集到数据;
到此这篇关于分布式监控系统之Zabbix 使用SNMP、JMX信道采集数据的文章就介绍到这了,更多相关Zabbix 分布式监控系统内容请搜索安全小天地以前的文章或继续浏览下面的相关文章希望大家以后多多支持安全小天地!
暂无评论内容