一、概述
1.为什么选择Zabbix?
Zabbix是一款能够监控各种网络参数以及服务器健康性和完整性的软件。Zabbix使用灵活的通知机制,允许用户为几乎任何事件配置基于邮件的告警。这样可以快速反馈服务器的问题。基于已存储的数据,Zabbix提供了出色的报告和数据可视化功能。这些功能使得Zabbix成为容量规划的理想方案。
以上一段摘抄于Zabbix官方手册,根据我自己的使用经验,我认为上述描述有些含蓄,Zabbix不止能够监控网络参数、服务器健康等,它几乎能监控你能想到的任何服务器、软件或应用的任何指标,并通过触发器和其他zabbix组件为这些指标配置及时的邮件、短信等告警,并且提供了强大的可视化功能。
就我个人来讲,Zabbix只有配置底层监控脚本时需要耗费点精力,其灵活性和功能碾压市面上绝大多数商用or开源监控软件,并且足以作为一个大型公司的监控骨架,例如之前看到的一篇58的分布式监控产品介绍,看完之后的感想基本就是:这产品提供的功能如果用Zabbix搭我上我也行!在接下来的几篇笔记中我也会逐一示例如何搭建一个完整的数据库监控系统。
我从官网上随便copy了一副Zabbix可以达到的效果图:(zabbix的界面支持中文本例只是copy的官方示例)
2.关于Zabbix的架构
Zabbix的组件有以下几个:
Zabbix Server、Zabbix proxy、Zabbix agent、数据库、Zabbix web界面。
其中agent是安装于各个被监控主机的客户端,负责收集监控信息。server是负责接收监控信息并进行数据存储和web页面渲染的,proxy是可选的安装组件可以代替server进行监控信息收集从而分担负载或者说充当到server的跳板机,数据库是存储监控信息的,web页面则是进行监控信息的展示、提供诸如添加主机、创建用户等等的页面操作功能。
熟悉Zabbix的数据流是灵活使用Zabbix的基础,从上述描述可以大致知道Zabbix的数据流,这其中涉及到的一些对象名非常重要,将会贯穿整个Zabbix的配置和使用。
-
监控项(item)是server上负责接收数据信息的,其结构就是一个指定了返回数据类型的key-value,key名字自定义,对应的value就是获取监控值的脚本命令。
-
监控项超过某个阈值之后需要告警,为了实现这种告警就需要为监控项创建触发器(trigger),默认的trigger被触发后告警自动显示在仪表板(dashboard)。
-
默认告警是显示在仪表板(dashboard)的,为了实现短信或邮件告警,就需要创建告警媒介(media types),同时还需要为用户添加告警媒介这样才能将告警发送至用户的邮箱。
-
为了更好地对监控项进行分类,可以把相似的监控项放在同一个应用集(applications)中。
-
为了更好的对主机进行分类,可以将功能相同的主机放在同一个host group中。
3.本例的安装环境
CentOS release 6.10 (Final),内核版本2.6.32-754.el6.x86_64。
Zabbix Server IP:10.0.0.200,mysql数据库已经预先安装,版本是5.7.26(有一些向8.0看齐的坑,建议安装5.7.22及以下的版本)。
本例中web服务器使用LAMP环境,因此安装httpd。
Zabbix的安装有多种方式(rpm,容器安装等),本例中使用可以自定义位置和启动项的源码安装方式。
4.本例的主要参考网址
1.下载安装包
wget https://nchc.dl.sourceforge.net/project/zabbix/ZABBIX%20Latest%20Stable/3.4.15/zabbix-3.4.15.tar.gz
如果上述地址失效,到https://www.zabbix.com/download寻找相应的zabbix安装包。
2.解压源码tar包,创建zabbix用户(server、agent端都需要创建用户)
groupadd --system zabbix
useradd --system -g zabbix -d /usr/lib/zabbix -s /sbin/nologin -c "Zabbix Monitoring System" zabbix
tar -zxvf zabbix-3.4.15.tar.gz
3.安装依赖包
yum -y install pcre pcre-devel libevent libevent-devel OpenIPMI OpenIPMI-devel libssh2 libssh2-devel net-snmp-devel libcurl libcurl-devel unixODBC-devel libxml2-devel
4.Server端LAMP架构的安装
4.1 安装php,zabbix服务端程序由php编写,因此需要安装php依赖。
参考:https://www.zabbix.com/documentation/3.4/manual/installation/requirements
//php解释器版本需要>=5.4版本才可以,本例中安装5.6版本的php(如果是Centos7版本请尝试安装php7.0及以上版本,5.x版本的php在linux7上的支持度很差)。 //首先安装相关的yum源,然后安装php相关的包。 #Linux 6: rpm -Uvh http://mirror.webtatic.com/yum/el6/latest.rpm yum -y --nogpgcheck install php56w php56w-gd php56w-bcmath php56w-xml php56w-mbstring php56w-ldap php56w-mysql #Linux 7: rpm -Uvh http://mirror.webtatic.com/yum/el7/epel-release.rpm http://mirror.webtatic.com/yum/el7/webtatic-release.rpm yum -y --nogpgcheck install php72w php72w-gd php72w-bcmath php72w-xml php72w-mbstring php72w-ldap php72w-mysql //如果发现报错也不要慌,一般是你已经安装了其他源里的php,yum list|grep php一下,然后把已安装的非base源里的php全部卸载(先确保没有被其他应用在使用)。 //当然用其他源里的php也可以,只要能保证满足官网的那些php requirements即可。 //如果上述yum源也失效了,那么到网上搜索下其他的php的yum源。
4.2 安装http,zabbix的web页面展示需要httpd(必须是1.3.12版本及以上)。
yum -y install httpd
4.3 安装mysql(步骤略)
需要注意的是my.cnf文件中一定要添加character_set_server=utf8的选项(或gbk),否则Zabbix无法支持中文界面。此外必须安装mysql时必须安装mysql-devel的包,否则zabbix server可能会安装失败。
5.编译安装Zabbix Server(root用户执行)
./configure --prefix=/usr/local/zabbix --enable-server --enable-agent --with-mysql --with-net-snmp --with-libcurl --以上各项含义参考:./configure --help,--enable-server表示安装server,proxy和agent的安装以此类推。 --安装mysql时必须安装mysql-devel否则会编译失败。
make && make install
6.配置mysql数据库
完成zabbix安装后开始初始化数据库的表结构,zabbix提供了data.sql、images.sql、schema.sql这3个sql脚本来初始化mysql数据库,因为zabbix监控的数据都是要存到这个mysql库以便进行web展示的,以上表模板的位置在解压tar包目录下的database/mysql中。
mysql> create database zabbix default charset utf8; mysql> grant all on zabbix.* to zabbix@localhost identified by 'zabbix'; mysql> grant all on zabbix.* to zabbix@'%' identified by 'zabbix'; //需要注意的是虽然zabbix 3.4对mysql版本没要求,但是却要求Innodb存储引擎,因此为避免麻烦尽量装5.5以后的mysql版本吧(默认innodb存储引擎)。
在server端执行全部的脚本:
mysql> source schema.sql
mysql> source images.sql
mysql> source data.sql
7.编辑server端的配置文件
本例中zabbix的安装位置为/usr/local/zabbix,因此server的conf文件为/usr/local/zabbix/etc/zabbix_server.conf。
老版的Zabbix中会有zabbix_agent.conf和zabbix_agentd.conf两个配置文件,这是agent端使用的配置文件,其中前者用超级服务(xinetd)的方式来启动,后者是以独立进程的方式来启动的,无论使用哪种方式都可以启动agent。
3.4版本只保留了zabbix_agentd.conf,本例使用zabbix_agentd来启动agent端:
//处理下配置文件中一大堆的注释,看不习惯:
cd /usr/local/zabbix/etc/
mv zabbix_server.conf zabbix_server.conf.bak
mv zabbix_agentd.conf zabbix_agentd.conf.bak
cat zabbix_server.conf.bak |grep -v "^$"|grep -v "^#">zabbix_server.conf
cat zabbix_agentd.conf.bak |grep -v "^$"|grep -v "^#">zabbix_agentd.conf
vi zabbix_server.conf(在本例中只要加个DBPassword=zabbix即可):
LogFile=/tmp/zabbix_server.log
DBName=zabbix
DBUser=zabbix
DBPassword=zabbix
Timeout=4
LogSlowQueries=3000
8.启动zabbix Server
/usr/local/zabbix/sbin/zabbix_server
三、启动并配置zabbix web
mkdir /var/www/html/zabbix
cp -ar /root/zabbix-3.4.15/frontends/php/* /var/www/html/zabbix/
--/root/zabbix-3.4.15/是我zabbix解压目录。
service httpd start --启动httpd
至此可以通过http://10.0.0.200/zabbix来访问zabbix了,10.0.0.200是我Zabbix Server服务器的IP地址。
可以看到有几项php的配置不符合要求,我们改正之:
vi /etc/php.ini
post_max_size = 16M
max_execution_time = 300
max_input_time = 300
date.timezone = Asia/Shanghai
always_populate_raw_post_data = -1 //这项默认是注释的
重启httpd服务后刷新,全部通过。
填入数据库的账号密码即可。
根据提示我们下载zabbix.conf.php文件,然后放置到指定位置:/var/www/html/zabbix/conf/
最后的登陆界面如下所示:(默认的账号是admin,密码是zabbix)
四、agent客户端安装配置
前边我们已经在agent节点添加了zabbix用户并下载了zabbix源码安装包,这里只需要直接使用即可:
//在本例中server端也要被监控因此也需要安装agent组件,但其实server在编译安装过程中已经包含了agent的功能,因此在server端直接编辑agent配置文件并启动就可以了。
./configure --prefix=/usr/local/zabbix --enable-agent
make && make install
cd /usr/local/zabbix/etc/
mv zabbix_agentd.conf zabbix_agentd.conf.bak
cat zabbix_agentd.conf.bak |grep -v "^$"|grep -v "^#">zabbix_agentd.conf
然后修改/usr/local/zabbix/etc/zabbix_agentd.conf文件:
LogFile=/tmp/zabbix_agentd.log //passive与active模式的区别在于,前者是server或proxy端主动来获取数据,后者是客户端主动向server/proxy发送数据,因此后者压力更小。 #Server参数表示zabbix server的IP地址,可以有多个,表示agent只会接收来自于此IP的连接,默认的相当于passive模式。 Server=10.0.0.200 #ServerActive参数表示与server进行active check的配置,IP:port格式,可以写多个。 ServerActive=10.0.0.200:10051 //一般server端的监听端口是10051,agent端使用的端口是10050。
所谓active check是指agent主动的请求server,获取监控信息,然后将自己的监控数据返回给server进行展示,需要注意的是进程active check时agent端配置文件里的hostname必须与server里设置的host对象的名字一样,否则agent日志会报active check失败以及host not found的错误,如果不使用active check那么配置文件中的hostname可以与web上不同,但是此时配置文件中需要去掉ServerActive参数,否则agent日志总是会尝试active check但是不通并报错,导致agent日志增长很快。
此外agentd配置文件中的ServerActive只是表明agent端会做active check的操作,但是具体的item项是否会通过active check发送给server还要看item本身的获取类型是否是zabbix agent(active)。
Zabbix的active check是一个两次握手的过程:https://www.zabbix.com/documentation/3.4/manual/appendix/items/activepassive
1.首先agent根据ServerActive参数向server发送active的request。
2.server端将此agent下的所有类型为zabbix agent(active)的item list发送给agent,完成一次握手。
3.接下来agent根据收集的interval(或者说delay)将收集的监控值周期性的发送给server。
4.server端回复一个已收到的信息,这算是二次握手。
//启动agentd:
/usr/local/zabbix/sbin/zabbix_agentd && ps -ef|grep zabbix_agentd
//关闭agentd:
for p in `ps -ef|grep zabbix_agentd|grep -v grep|awk '{print $2}'`;do kill -9 $p;done && ps -ef|grep zabbix_agentd
五、web端主机配置
之前已经完成了zabbix server和agent端的基本配置,但想要实现正常的监控还需要在web端添加所有的agent主机信息(本例中有3个,即2个agent服务器和server端的agent)。
我们先在所有agent节点的配置文件中添加:
Hostname=<为agent自定义的主机名(可以与服务器主机名不一样)或者直接写IP>
然后在web界面的配置-->主机中添加所有需要监控的agent主机,这里添加的主机名称必须与agent配置文件中设置的Hostname一致(如果所有items都不使用active check那么不一样也可以)。官网的原文描述如下:
With Zabbix agent running on the host you are configuring, the agent configuration file parameter Hostname must have the same value as the host name entered here. The name in the parameter is needed in the processing of active checks.
DNS名称可以不填,如果要填就要和/etc/hosts文件或DNS服务中的DNS条目一致。
下例添加的agent主机就是zabbix server本身,因为zabbix server本身也要被监控嘛,可以看到使用的端口是10050(agent端口)。
更新后返回主机页面点击状态的按钮使其成为开启状态(或者在添加主机时直接勾选已启用):
实际上由于zabbix默认的自动发现规则的存在,server端的agent是会被自动发现的,只需要你在agent配置文件中自定义一个Hostname,并配置了active check,那么server端是会自动为你添加主机的,自动发现实际上就是省去了你手动添加主机的步骤,不过客户端还是需要自己布的,如果客户端的部署也能用自动化工具完成的话,那么就可以大大简化部署工作。
至此,zabbix的基本配置已经完毕,以后只需要按需求为主机添加模板或监控项进行监控即可。