【.com原稿】IT运维离不开系统监控,就像鱼离不开水一样。强大的监控系统可以有力保障设备和业务的稳定性。图片来自PexelsToday,随着监控系统的不断涌现,Zabbix这个老牌监控系统依然屹立在监控系统的森林中。今天,我们就来看看Zabbix的系统架构以及它是如何工作的。Zabbix系统架构众所周知,Zabbix是一个优秀的监控系统,可以监控互联网上的设备和应用。在详细介绍它的实现之前,我们先看一下它的结构图:Zabbix架构图从上图可以看出,绿色部分就是被监控的设备。该设备的类型可以是服务器、交换机或网络打印机。这些受监控的设备称为主机,设备组称为主机组。可按地域、机房、应用等进行分组。从橙色部分的监控方式可以看出,Zabbix会为每个Host安装ZabbixAgent。它是Zabbix在Host上的客户端,负责将Zabbix需要监控的信息上传到ZabbixServer进行分析处理。但并不是所有的网络设备都可以安装ZabbixAgent。对于不能安装的设备,只要支持SNMP(SimpleNetworkManagementProtocol,简单网络管理协议)或者IPMI(IntelligentPlatformManagementInterface,智能平台管理接口)也可以被监控到。另外,如果需要监控Java应用,也可以通过JMX来实现。从监控内容橙色部分也可以看出,Zabbix支持通过JMX进行Java应用监控;支持通过IPMI监控硬件设备;通过SNMP支持网络设备。绿色区域和蓝色ZabbixServer之间有一个双向箭头。从ZabbixAgent直接到ZabbixServer的方式称为通用结构,类似于常说的C/S架构。但是在实际应用中更多的是采用分布式架构,即通过绿色区域连接到黄色ZabbixProxy,再连接到蓝色ZabbixServer的路径。图中右侧橙色区域为Zabbix的监控服务器,ZabbixServer主要负责配置和接收/发送监控信息(更详细的功能将在后面介绍)。处理后的信息会存储在Database中,Database可以指定MySQL或者Oracle等数据库源。此外,还将提供ZabbixUI来显示配置和监控信息。不仅如此,还为第三方应用提供了ZabbixAPI,通过它来自定义Zabbix规则。当然,考虑到稳定性,可以通过Keepalive等软件建立Master和Slave的HA机制。在Zabbix搭建监控系统的过程中,通过一张大图介绍了Zabbix的架构,详细学习了Zabbix的基本工作原理。我们再来看看这个思路,Zabbix架构安装配置步骤:Zabbix架构部署配置示意图PS:下面会介绍Zabbix的整个部署配置过程,安装配置的时候没有标注具体的命令配置。如果有同学需要安装配置过程,可以下载Zabbix使用手册,这里限于篇幅不再赘述。在Zabbix监控服务器上安装配置ZabbixServer/Agent/UI,安装ZabbixServer和ZabbixUI(Web)。ZabbixServer用于接收和发送监控细节,ZabbixUI(Web)用于配置ZabbixServer的各种功能。同时在被监控设备上安装ZabbixAgent。安装完成后,需要通过zabbix_agenttd.conf文件配置Server和ServerActive参数。由于ZabbixAgent有被动模式和主动模式。在被动模式下,ZabbixServer从ZabbixAgent获取数据。在主动模式下,ZabbixAgent主动向ZabbixServer上传信息。所以这两个参数的内容都是指ZabbixServer的IP地址。Server在被动模式下配置ZabbixServer的IP,ServerActive在主动模式下配置ZabbixServer的IP。当然,除此之外,还需要更新防火墙配置,打开Zabbix的访问端口(10050和10051)。最后,给被监控的设备(Host)一个Hostname,配置ZabbixServer时会用到。Server和ServerActive配置项HostGroups/Hosts配置完成ZabbixAgent后,回到ZabbixServer进行配置。前提是已经安装了ZabbixServer和ZabbixUI(Web),可以通过ZabbixUI(Web)访问配置界面。上面说了,每个被监控的设备都是一个Host,所以多个Host按照一定的方式分组,这个分组就是HostGroups。这里的分组方式包括地理位置、业务单元、机器使用情况、系统版本等。创建一个主机组,然后在其中创建一个主机。这个Host就是刚才安装ZabbixAgent的设备的ZabbixServer上的概念设备。配置Host时需要注意,这里的HostName与被监控设备中定义的HostName一致,方便识别。配置的IP为被监控设备的IP,端口号为10050。ZabbixServer创建HostconfigurationItems配置并配置Host后,需要告诉Zabbix在Host中监控哪些数据。需要监控的数据就是监控项,也叫Items。Items配置包括监控数据的方式、取值的数据类型、取值的时间间隔、历史数据的存储时间、趋势数据的存储时间、监控键的分组等信息。首先,您需要选择类型,这是要侦听的Zabbix客户端的类型。一般来说,安装ZabbixAgent后,这种就是ZabbixAgent。您还可以选择SNMP、IMPI或其他类型。其次,需要注意Key的选择。Key用于确定具体的监控项,对于同一个Host是唯一的。Zabbix默认有一些Key可以选择,比如:vm.memory.size[total],就是获取内存大小的Key。既然是为Host配置的,那么相应的HostIP和Port也会被指定。此外,还有一些其他数据需要配置。例如:数据更新间隔、更新周期、历史数据存储天数、趋势数据存储天数等。细心的同学在Items的示例配置图中会发现,上图中还有一个Applications的选项。它实际上是Item的集合,例如:要监控MySQL,可以定义一个MySQLApplication。将MySQL可用性、磁盘空间、处理器负载、每秒事务数、慢查询数等相关项目放入此应用程序中,以便于选择和管理。触发器配置前面说到Items是用来配置监控什么数据的,不是用来判断数据是否正常的。那么,Trigger的作用就是对采集到的数据进行判断。通常会设置判断规则或阈值,一旦满足某个规则或超过相应的阈值就会产生一个事件。同时Action会对满足条件的Trigger进行操作。这些规则由正则表达式定义。从收到消息到触发表达式判断的动作的示意图信息,会产生两种Trigger状态,OK(正常)和PROBLEM(异常)。每个Trigger对应一个Item,每个Item对应多个Trigger。同时Trigger可以设置不同的事件级别,可以根据这些级别设置多个告警。Trigger事件级别图主要是在配置Trigger时添加正则表达式。Zabbix会根据对应Item的Function生成对应的正则表达式。Trigger会根据监控的内容(Item)进行配置,例如:Item是检测Linux登录次数。选择项目作为“TemplateOSlinux:Numberofloggedinusers”。对应的Function是Last(mostrecent)T值=N。意思是获取最近一次登录的次数T,当T等于N时触发Trigger。这个N就是我们需要配置的值,比如填写2,即登录次数等于2时触发Trigger。配置完成后,会生成一个类似下图的正则表达式,{TemplateOSLinux:system.users.num.last()}>2。整个过程不需要你输入表达式,通过选择和配置即可完成。触发器配置示例图,内容与文中描述不同,但意思是一样的。上图中有个Tab项叫Dependencies,就是Trigger的告警依赖,在实际场景中很有用。它将用于特殊场景。比如整个IDC机房的路由出现故障,机房内所有机器的网络状态都会出现异常。这时候ZabbixServer会收到大量的异常告警。运维人员会被告警信息搞得不知所措,不知道故障的真正原因。此时可以在Dependencies中选择相应的规则,勾选MultiplePROBLEMeventsgeneration选项。之后会收到告警信息,“某IDC机房RouterX出现故障”,对其他告警信息进行聚合操作。Action配置如果Trigger定义了触发事件的规则,那么Action就是事件触发后的动作。即当Trigger条件满足时,Action会执行一些操作。例如:发送事件通知(短信、钉钉、邮件)、远程执行命令(重启服务)。Action的配置需要按照下图的步骤进行:Zabbix中的事件类型有很多种,Trigger只是其中的一种,例如:监控设备的自动发现、监控设备的自动注册等等。所以,首先选择事件的来源,当然我们这里选择Trigger作为来源。Action选择事件源,填写Action的基本信息。例如:姓名、主题、默认发送的消息内容、异常恢复主题、对应的消息内容。这里的填充可以是字符串,但是会用到更多的宏。其实就是一个替换字符,比如{TRIGGER.STATUS}表示触发器的状态,{ITEM.NAME}表示监控项的名称。这些宏和字符串拼接形成最终的信息。如下图所示:Action基本信息接下来是条件(Condition)的配置。由于一个Action可以面对一个或多个Trigger,因此每个Trigger都有一个或多个条件。为了保证其灵活性,条件可以组合为AND、OR、AND/OR。例如:可以用“AND”条件组合Maintenancestatusnotinmaintenance(机器不处于维修状态)和Triggervalue=PROBLEM(触发异常)这两个条件(Condition),表示触发是两个条件同时满足时触发Followup。Conditions就是图最后的配置例子,就是Operation的配置。包括执行操作的时间间隔、执行次数、每次执行的时间间隔、操作类型(发送消息、执行命令)、发送给哪些用户/用户组等。操作配置示例图模板配置如果需要配置的监控设备很多,工作量很大。所以Zabbix会将具有相同Item、Trigger、Application等的规则项放在一起,这样就会有一个模板(Template)。当您需要为同类型设备配置监控项时,可选择现成的模板。从而减轻运维工程师的工作量。创建模板时,需要输入模板名称和对应的组。模板基本信息如果需要继承模板,可以在关联模板中配置。模板继承可以理解为模板嵌套。比如预先定义一个基础模板,在Item中配置CPU、内存、硬盘、网卡等信息。如果需要在此基础模板上扩展其他模板,如:MySQL监控模板或Web监控模板。那么在配置模板的时候,可以继承基础模板而不用重新定义模板。模板创建完成后,可以添加Item、Trigger、Application等信息。具体方法与Item和Trigger配置类似。上面大段描述了Zabbix搭建监控系统的过程。为了方便记忆,这里做一个总结。Zabbix搭建监控系统,首先安装ZabbixAgenttoHost收集信息,ZabbixServer用于获取信息,ZabbixUI(Web)用于显示和配置信息。ZabbixAgent在Host中配置好监控服务器的IP和Port后,回到ZabbixServer,通过ZabbixUI(Web)配置需要监控的Host(被监控设备)。依次配置:Item(监控什么数据)、Trigger(故障触发条件)、Action(故障触发动作)。Zabbix的监控方式了解了Zabbix的架构和Zabbix的构建过程之后,我们来看看Zabbix的监控方式。前面提到的ZabbixAgent监控只是Zabbix监控方式中的一种。针对不同的情况,Zabbix还提供了SNMP、IPMI、JMX等方法。就连ZabbixAgent的方式也分主动和被动。下图描述了几种Zabbix监控方式与ZabbixServer的关系:Zabbix监控方式逻辑图ZabbixAgent监控方式该方式有Active(主动模式)和Passive(被动模式)。ZabbixServer和ZabbixAgent之间的通信是通过Zabbix特定的协议来完成的,数据格式为JSON。①ZabbixAgent被动模式默认情况下,ZabbixAgent工作在被动模式,ZabbixServer从ZabbixAgent获取信息。安装ZabbixAgent后,通过zabbix_agentd.conf文件中的Server参数设置被动数据采集的IP。被动模式流程图ZabbixAgent与ZabbixServer的通信过程如上图所示:ZabbixServer打开一个TCP连接。服务器向ZabbixAgent发送一个Key(agent.ping\n)。ZabbixAgent接收请求,并响应请求,将包含内容的消息发送到ZabbixServer。服务器接收返回的数据并进行处理。服务器关闭TCP连接。②ZabbixAgent主动模式在该模式下,ZabbixAgent会主动向ZabbixServer上报监控信息。ZabbixServer的IP可以通过zabbix_agentd.conf文件中的ActiveServer参数进行配置。同时需要在ZabbixServer上配置TypeofItems,设置为Zabbixagent(active)。主动模式流程图还是看主动模式流程图:ZabbixAgent建立到ZabbixServer的TCP连接。代理请求要检查的数据列表。Server响应Agent,发送一个Items列表,包括Itemkey和delay。代理响应请求。服务器收到请求数据并关闭TCP。SNMP监控方法是一种标准协议,用于管理基于IP的网络设备,包括路由器、交换机、UPS和打印机。尤其是被监控设备无法安装ZabbixAgent时。我们先来看一下SNMP架构,如下图所示:SNMP架构图NMS是网络管理系统(NetworkManagementSystem,又称网络管理站),集成在ZabbixServer中。Agent是SNMP接入的代理,为设备提供SNMP能力,负责设备与NMS的通信。MIB(管理信息库)是一个数据库,其中包含由受管设备维护的变量。例如:内存空间、磁盘大小。它通常以树状结构存在,每个叶子节点保存一条数据,一条记录由OID(ObjectIdentifier)唯一标识。MIB树形结构图如上图,如果要笼统地表示系统参数,使用1.3.6.1.2.1.1。如果是私人业务记录,则在1.3.6.1.4.1下。NMS通过SNMP与设备上的Agent通信,获取/修改MIB上的信息。SNMP目前共有三个版本,每个版本都是在之前版本的基础上逐步升级的。SNMP版本示例图以第三版本为例。在原有请求和响应的基础上,加入PDU算法对报文进行加解密。SNMPv3版本传输示意图IPMI监控方式IPMI(IntelligentPlatformManagementInterface)是一种智能平台管理接口。它最初是Intel架构下企业系统的外围设备采用的工业标准,后来成为业界的通用标准。用户可以通过IPMI监控服务器的物理特性,如:温度、电压、风扇工作状态、电源等。IPMI独立于CPUBIOS和操作系统,即在没有操作系统和管理软件的情况下,仍然可以监控硬件信息。Zabbix中的具体配置这里就不赘述了。JMX监控方式JMX(JavaManagementExtensions)是一个将管理功能植入Java应用程序的框架。它还是一组标准的代理和服务,用户可以在任何Java应用程序中使用。在Zabbix中,JMX监控数据的获取是通过一个专门的agent来实现的,即ZabbixJavaGateway负责采集数据,它与JMXJava程序通信获取数据。Zabbix-Server和ZabbixJavaGateway如下图所示:JMX示意图这里需要几个步骤来部署JMX,如下:选择一个单独的Server安装ZabbixJavaGateway,最好和ZabbixServer在不同的服务器上。在安装了ZabbixJavaGateway的服务器上配置zabbix_java_gateway.conf文件的参数。主要是网关监听服务器的IP和端口。目的是让Gateway找到要监听的设备。在ZabbixServer中配置zabbix_server.conf的参数。主要是配置Gateway的IP和Port,以及Java监控的进程数。目的是让Server找到Gateway。在受监控设备上,为Java应用程序启用JMX协议。返回ZabbixUI(Web)为JMX监控配置Java应用程序。总结作为一个老牌的监控系统,Zabbix的架构包括两部分:被监控设备和Zabbix监控服务器。ZabbixAgent运行在被监控设备上,负责与ZabbixServer通信,获取并控制被监控设备。它具有主动和被动工作模式。ZabbixServer作为监控的核心,可以直接连接ZabbixAgent,也可以通过ZabbixProxy连接,再由ZabbixProxy连接ZabbixAgent。后一种方式用于分布式监控场景。ZabbixServer获取的数据存储在ZabbixServer的数据库中,ZabbixUI(Web)可以读取服务器中的数据,并以图表的形式展示。Zabbix搭建流程分为安装ZabbixAgent/Server/UI、Host配置、Item配置、Trigger配置、Action配置。这个配置过程完美回答了“监控谁?监控什么?异常如何处理?”的问题。最后,针对不同的应用场景,Zabbix还支持多种监控方式,包括ZabbixAgent、SNMP、IPMI和JMX。作者:崔浩简介:十六年开发架构经验。曾在惠普武汉交付中心担任技术专家、需求分析师、项目经理,后在一家初创公司担任技术/产品经理。善于学习,乐于分享。目前专注于技术架构和研发管理。【原创稿件,合作网站转载请注明原作者和出处为.com】
