介绍:适用于任何IT基础架构,服务,应用程序和资源监控的解决方案

瓶颈:mysql数据库的性能将会是zabbix的最大瓶颈

核心任务:数据的采集、储存、展示,其次告警通知

重点:模板制作(重点);分布式监控(proxy);邮件微信通知;故障自愈;agent的批量安装;AIP

zabbix web:已web的形式展示采集到的服务器数据

zabbix-server:zabbix的核心服务组件

zabbix proxy:当服务集群规模比较大的时候需要加入zabbix proxy,不然zabbix-server服务会更新速度非常慢

zabbix agent:安装在需要被监控的服务器上,负责收集该服务器的信息,来发送给zabbix proxy或者zabbix_proxy

zabbix的安装:

zabbix的主动模式和被动模式区别:

无论是模式还是被动模式,都是站在zabbix_agent角度来说的工作模式;

被动模式:zabbix_agent被动接受zabbix_server发送来的指令来收集数据,然后通过TCP协议发送至zabbix_server服务器上,zabbix server不发送zabbix agent就一直不响应,所以zabbix agent也不用关心其监控项和数据采集周期间隔时间。缺点是被动模式会加大zabbix_server的工作量,在数百台服务器以上的环境下,zabbix_server轮训一遍所有的服务器会zabbix_server自身的负载很高,还会导致不能及时获得最新的数据;但是被动模式的配置较为简单,被设置成默认模式;

主动模式:zabbix_agen主动将收集到的数据周期性的发送给

主动模式是由zabbix agent主动向zabbix server的10051端口发起tcp连接请求,因此主动模式下必须在zabbixagent配置文件中指定zabbix server的IP或者主机名(必须可以被解析为IP地址),在连接到zabbix server之前zabbix agent是不知道自己要采集那些数据以及间隔多久采集一次数据的,然后在连接到zabbix server以后获取到自己的监控项和数据采集间隔周期时间,然后再根据监控项采集数据并返回给zabbix server,在主动模式下不再需要zabbix serve向zabbix agent发起连接请求,因此主动模式在一定程度上可减轻zabbix server打开的本地随机端口和进程数,在一定程度就减轻看zabbix server的压力;

1)zabbix的安装:

1:编译安装zabbix

wget https://jaist.dl.sourceforge.net/project/zabbix/ZABBIX%20Latest%20Stable/4.0.16/zabbix-4.0.16.tar.gz

groupadd -g 1001 zabbix

useradd -u 1001 -g 1001 zabbix

tar xf zabbix-4.0.30.tar.gz

cd zabbix-4.0.30/

#依赖关系

yum install gcc libxml2-devel net-snmp net-snmp-devel curl curl-devel php php-bcmath php-mbstring mariadb mariadb-devel libevent-devel java-1.6.0-openjdk-devel php-mysqlc php-gd php-xmlwriter php-ldap -y

./configure --prefix=/apps/zabbix_server --enable-server --enable-agent --with-mysql --with-net-snmp --with-libcurl --with-libxml2 --enable-java && make install

2:准备数据库


#安装数据库:

. /etc/init.d/functions

PA=mariadb-10.2.25-linux-x86_64.tar.gz

getent passwd mysql || groupadd -r -g 306 mysql && useradd -r -u 306 -g 306 -d /data/mysql -s /sbin/nologin mysql

mkdir /data/mysql 

chown 306:306 /data/mysql

tar xf ${PA} -C /usr/local/ && action "文件已解压至$INPATH" || action "解压失败" fales

cd /usr/local/

ln -sv ` echo $PA | sed -nr 's@(.*)\.tar\.gz@\1@p'` mysql &> /dev/null && action "创建软链接成功"

chown -R root:root mysql/ 

cd /usr/local/mysql/

./scripts/mysql_install_db --datadir=/data/mysql --user=mysql && action "创建数据库文件"

mkdir /etc/mysql/

cp support-files/my-huge.cnf /etc/mysql/my.cnf 

sed -i '/\[mysqld\]/a\datadir=/data/mysql' /etc/mysql/my.cnf && action "而配置文件完成"

cp /usr/local/mysql/support-files/mysql.server /etc/init.d/mysqld

chkconfig --list

chkconfig --add mysqld

chkconfig --list

service mysqld start

service mysqld stop

systemctl start mysqld.service && action "mysql程序启动成功"

mysql -uroot -h192.168.37.105 -e "create database zabbix_server character set utf8 collate utf8_bin;"

mysql -uroot -h192.168.37.105 -e "grant all on abbix_server.* to zabbix@'192.168.37.%' identified by 'lijian';"

#在zabbix_server服务器上进入数据路,执行这3条数据初始化,有顺序之分;

mysql -uzabbix -plijian -h192.168.37.105 zabbix_server < schema.sql

mysql -uzabbix -plijian -h192.168.37.105 zabbix_server < images.sql 

mysql -uzabbix -plijian -h192.168.37.105 zabbix_server < data.sql

zabbix95计费教程_服务器


#配置zabbix_server

vim /apps/zabbix_server/etc/zabbix_server.conf

grep "^[a-Z]" /apps/zabbix_server/etc/zabbix_server.conf

LogFile=/tmp/zabbix_server.log

DBHost=192.168.37.105

DBName=zabbix_server

DBUser=zabbix

DBPassword=lijian

DBPort=3306

Timeout=4

LogSlowQueries=3000

zabbix95计费教程_服务器_02


#尝试启动zabbix_server

/apps/zabbix_server/sbin/zabbix_server -c /apps/zabbix_server/etc/zabbix_server.conf

tail /tmp/zabbix_server.log

#拷贝php文件

mkdir /var/www/html/zabbix 

/usr/local/src/zabbix-4.0.30 

cd /usr/local/src/zabbix-4.0.30/frontends/php/

cp -a . /var/www/html/zabbix/

#安装并启动httpd

systemctl start httpd

#解决php报错

zabbix95计费教程_php_03


vim /etc/php.ini

post_max_size=16M

max_execution_time=300

max_input_time=300

date.timezone =Asia/Shanghai

systemctl restart mysqld

systemctl restart httpd

zabbix95计费教程_mysql_04

zabbix95计费教程_mysql_05

保存/var/www/html/zabbix/conf/zabbix.conf.php文件

登录成功:

zabbix95计费教程_mysql_06

启动zabbix agent:

# /apps/zabbix_server/sbin/zabbix_agentd

验证

zabbix95计费教程_mysql_07

#zabbix server启动文件


#先停止当前zabbix server进程

pkill zabbix_server

cat > /etc/systemd/system/zabbix-server.service << EOF

[Unit]

Description=Zabbix Server

After=syslog.target

After=network.target

[Service]

Environment="CONFFILE=/apps/zabbix_server/etc/zabbix_server.conf"

EnvironmentFile=-/etc/default/zabbix-server

Type=forking

Restart=on-failure

PIDFile=/tmp/zabbix_server.pid

KillMode=control-group

ExecStart=/apps/zabbix_server/sbin/zabbix_server -c \$CONFFILE

ExecStop=/bin/kill -SIGTERM \$MAINPID

RestartSec=20s

#TimeoutSec=infinity

[Install]

WantedBy=multi-user.target

EOF

systemctl daemon-reload

systemctl enable --now zabbix-server.service

zabbix95计费教程_mysql_08

#遇见问题

现象使用/apps/zabbix_server/sbin/zabbix_server -c /apps/zabbix_server/etc/zabbix_server.conf可以启动,修改启动文件RestartSec=10s到RestartSec=20s,问题解决可以启动成功;

问题截图

修改前:

zabbix95计费教程_服务器_09

修改后:

zabbix95计费教程_zabbix95计费教程_10

#遇见问题2

修改RestartSec=20s服务器重启后还是无法启动,注销#TimeoutSec=infinity该行,重启后无法情动问题解决;

zabbix95计费教程_mysql_11

Web界面中文菜单环境:

当前版本

zabbix95计费教程_php_12

图表内的还有英文:

zabbix95计费教程_php_13

在window上控制面板找到字体,选择自己喜欢的中文字体,复制到桌面

zabbix95计费教程_服务器_14

将windows 字体文件上传至zabbix web目录,具体路径为/ZABBIX/WEB/PATH/assets/fonts/,如下:


cd /var/www/html/zabbix/assets/fonts

chown zabbix.zabbix ./*

#修改两行

vim /var/www/html/zabbix/include/defines.inc.php

define('ZBX_GRAPH_FONT_NAME', 'msyh'); // font file name

define('ZBX_FONT_NAME', 'msyh');

zabbix95计费教程_php_15

#刷新网页后查看

zabbix95计费教程_mysql_16


#查询启动状态

journalctl -u zabbix-server -f 

#agent启动文件

pkill zabbix_agentd

cat > /etc/systemd/system/zabbix-agent.service <<EOF

[Unit]

Description=Zabbix Agent

After=syslog.target

After=network.target

[Service]

Environment="CONFFILE=apps/zabbix_server/etc/zabbix_agentd.conf"

EnvironmentFile=-/etc/default/zabbix-agent

Type=forking

Restart=on-failure

PIDFile=/tmp/zabbix_agentd.pid

KillMode=control-group

ExecStart=/apps/zabbix_server/sbin/zabbix_agentd -c \$CONFFILE

ExecStop=/bin/kill -SIGTERM \$MAINPID

RestartSec=10s

User=zabbix

Group=zabbix

[Install]

WantedBy=multi-user.target

EOF

systemctl daemon-reload

systemctl status zabbix-agent.service

2)实现zabbix的主动模式proxy以及数据采集

被动模式数据采集

安装zabbix-agen

yum install zabbix40-agent.x86_64

配置文件:


# vim /etc/zabbix/zabbix_agentd.conf

##### Passive checks related #被动检查相关配置

Server=192.168.37.106 #指向当前zabbix server

### Option: ListenPort

ListenPort=10050 #监听端口

ServerActive=192.168.37.106 #主动模式的zabbix server地址

### Option: StartAgents

StartAgents=3 #被动状态时默认启动的实例数(进程数),为0不监听任何端口

### Option: Hostname

Hostname=192.168.37.106 #区分大小写且在zabbix server唯一的值

Include=/etc/zabbix/zabbix_agentd.d/*.conf

zabbix95计费教程_php_17


systemctl start zabbix-agent.service

systemctl status zabbix-agent.service

zabbix95计费教程_zabbix95计费教程_18

被动模式:

zabbix web界面添加被监控主机:按照如下点击

zabbix95计费教程_php_19

点击克隆:

zabbix95计费教程_mysql_20

关联监控模板

zabbix95计费教程_mysql_21

按照如下添加模板

zabbix95计费教程_zabbix95计费教程_22

选择模板

zabbix95计费教程_php_23

点击添加

zabbix95计费教程_php_24

经过一段时间的数据采集后,验证zabbix server是否有刚添加完成主机的监控数据和图形,图形显示如下:

zabbix95计费教程_mysql_25

主动模式的监控:

删除之前的主机被动模式的主机192.168.37.106,重新修改为主动模式;

修改106的配置文件

zabbix95计费教程_服务器_26


systemctl start zabbix-agent.service

netstat -tanlp | grep 106

zabbix95计费教程_php_27

创建主动模式的模板

1)点击一个模板进行克隆;修改名称

zabbix95计费教程_mysql_28

2)点击监控项;进行监控项主动模式修改;批量选中监控项名称;点击最下方批量更新;

zabbix95计费教程_服务器_29

3)修改类型为主动式;

配置主机项

zabbix95计费教程_mysql_30

关联模板:

zabbix95计费教程_zabbix95计费教程_31

修改自动发现间隔:

zabbix95计费教程_php_32

监控TCP的11中状态的连接数:

CLOSED:端口默认是关闭状态。

LISTEN: 服务器程序开始监听一个端口,就是LISTEN状态。

SYN_RCVD:三次握手的第二次握手后的端口状态,是收到了客户端发送的SYN_SENT数据包之后的状态,这个状态很短暂,正常在服务器上是很少看到的,除非服务器故意不发送最后一次握手数据包,服务器返回给客户端SYN确认之后就会将在自己的端口置为SYN_RCVD。

SYN_SENT:SYN_SENT状态表示客户端已发送SYN=1的请求连接报文,发送之后客户端就会将自己的端口状态置为SYN_SENT。

ESTABLISHED:表示已经连接成功,客户端收到服务器的确认报文会回复服务器,然后就将端口置为ESTABLISHED,服务器第三次收到客户端的Ack确认就会将端口置为ESTABLISHED并开始传输数据。

FIN_WAIT_1:出现在主动关闭方,FIN_WAIT_1状态实际上是当SOCKET在ESTABLISHED状态时,当任意一方想主动关闭连接,向对方发送了FIN=1的断开连接请求报文,此时该SOCKET即 进入到FIN_WAIT_1状态。而当对方回应ACK报文后,则进入到FIN_WAIT_2状态,当然在实际的正常情况下,无论对方何种情况下,都应该马 上回应ACK报文,所以FIN_WAIT_1状态一般是比较难见到的,而FIN_WAIT_2状态还有时常常可以用netstat看到。

FIN_WAIT_2:出现在主动关闭方,当被动方回应FIN_WAIT_1的ACK报文后,则进入到FIN_WAIT_2状态

TIME_WAIT:出现在主动关闭方,表示收到了对方的FIN请求关闭报文,并发送出了ACK报文,就等2*MSL(Max Segment Lifetime)后即可回到CLOSED可用状态了。如果FIN_WAIT_1状态下,收到了对方同时带FIN标志和ACK标志的报文时,可以直接进入到 TIME_WAIT状态,而无须经过FIN_WAIT_2状态。

CLOSING: 这种状态比较特殊,实际情况中应该是很少见,属于一种比较罕见的例外状态。正常情况下,当你发送FIN报文后,按理来说是应该先收到(或同时收到)对方的 ACK报文,再收到对方的FIN报文。但是CLOSING状态表示你发送FIN报文后,并没有收到对方的ACK报文,反而却也收到了对方的FIN报文。什 么情况下会出现此种情况呢?其实细想一下,也不难得出结论:那就是如果双方几乎在同时close一个SOCKET的话,那么就出现了双方同时发送FIN报 文的情况,也即会出现CLOSING状态,表示双方都正在关闭SOCKET连接。

CLOSE_WAIT: 表示在等待关闭端口,这种状态存在于被动关闭的一方。

LAST_ACK: 是被动关闭方在主动关闭一方在发送FIN报文后,最后等待对方的ACK报文,当再次收到ACK报文后,也即可以进入到CLOSED可用状态了。

监控主机ip:192.168.37.105

编译安装zabbix_agent:

1:安装zabbix_agent并通过命令或者脚本 采集到监控项的数据

脚本:


#!/bin/bash

tar xvf zabbix-agent-onekey-install-4.0.30.tar.gz

cd zabbix-agent-onekey-install-4.0.30

DIR=`pwd`

ZBX_VERSION="4.0.30"

grep "Ubuntu" /etc/issue &> /dev/null

if [ $? -eq 0 ];then

apt update

apt-get -y install iproute2 ntpdate tcpdump telnet traceroute nfs-kernel-server nfs-common lrzsz tree openssl libssl-dev libpcre3 libpcre3-dev zlib1g-dev ntpdate tcpdump telnet traceroute gcc openssh-server lrzsz tree openssl libssl-dev libpcre3 libpcre3-dev zlib1g-dev ntpdate tcpdump telnet traceroute iotop unzip zip make

fi

grep "Kernel" /etc/issue &> /dev/null

if [ $? -eq 0 ];then

yum install vim iotop bc gcc gcc-c++ glibc glibc-devel pcre pcre-devel openssl openssl-devel zip unzip zlib-devel net-tools lrzsz tree ntpdate telnet lsof tcpdump wget libevent libevent-devel bc systemd-devel bash-completion traceroute -y

fi

tar xvf zabbix-${ZBX_VERSION}.tar.gz && cd zabbix-${ZBX_VERSION} && ./configure --prefix=/apps/zabbix_agent --enable-agent && make && make install

useradd zabbix

mkdir /apps/zabbix_agent/pid

mkdir /apps/zabbix_agent/logs

\cp ${DIR}/zabbix-agent.service /lib/systemd/system/zabbix-agent.service

\cp ${DIR}/zabbix_agentd.conf /apps/zabbix_agent/etc/zabbix_agentd.conf

\cp ${DIR}/zabbix_agentd.conf.d/* /apps/zabbix_agent/etc/zabbix_agentd.conf.d/

HOST_IP=`ifconfig eth0 | grep -w inet | awk '{print $2}'`

sed -i "s/Hostname=/Hostname=${HOST_IP}/g" /apps/zabbix_agent/etc/zabbix_agentd.conf

chown zabbix.zabbix -R /apps/zabbix_agent/

systemctl daemon-reload && systemctl enable zabbix-agent && systemctl restart zabbix-agent

zabbix95计费教程_zabbix95计费教程_33

创建监控脚本:


cat > /etc/zabbix/zabbix_agentd.d/tcp_conn_plugin.sh <<EOF

#!/bin/bash

tcp_conn_status(){

       TCP_STAT=\$1

      ss -ant | awk 'NR>1 {++s[$1]} END {for(k in s) print k,s[k]}' > /tmp/tcp_conn.txt

       TCP_NUM=\$(grep "\$TCP_STAT" /tmp/tcp_conn.txt | cut -d ' ' -f2)

       if [ -z \$TCP_NUM ];then

               TCP_NUM=0

       fi

       echo \$TCP_NUM

}

main(){      case \$1 in

          tcp_status)

              tcp_conn_status \$2;

              ;;

       esac

}

main \$1 \$2

EOF

2:在zabbix_agent配置添加自定义的监控项并重启zabbix_agent


cd /apps/zabbix_agent/etc/zabbix_agentd.conf.d

cat > /apps/zabbix_agent/etc/zabbix_agentd.conf.d/all.conf << EOF

UserParameter=linux_tcp_status[*],/apps/zabbix_agent/etc/zabbix_agentd.conf.d/tcp_conn.sh "$1" "$2" 

EOF

3:zabbix_server服务器上中通过zabbix_get命令测试能否获取监控项的数据

/apps/zabbix_server/bin/zabbix_get -s 192.168.37.107 -k "linux_tcp_status["tcp_status","ESTAB"]"

zabbix95计费教程_mysql_34

4:在模板中添加监控项或者在主机上添加监控项

创建模板

zabbix95计费教程_服务器_35

模板命名:

zabbix95计费教程_zabbix95计费教程_36

创建监控项;选择创建监控项

zabbix95计费教程_php_37

进入监控项配置:

zabbix95计费教程_服务器_38

创建图形,选择创建图形;

zabbix95计费教程_mysql_39

添加图形

zabbix95计费教程_zabbix95计费教程_40

查看该监控项的图形;

zabbix95计费教程_mysql_41

重复34步骤,将TCP剩余10中连接状态全部添加;


/apps/zabbix_server/bin/zabbix_get -s 192.168.37.107 -k "linux_tcp_status["tcp_status","CLOSED"]"

/apps/zabbix_server/bin/zabbix_get -s 192.168.37.107 -k "linux_tcp_status["tcp_status","LISTEN"]"

/apps/zabbix_server/bin/zabbix_get -s 192.168.37.107 -k "linux_tcp_status["tcp_status","SYN-RCVD"]"

/apps/zabbix_server/bin/zabbix_get -s 192.168.37.107 -k "linux_tcp_status["tcp_status","SYN-SENT"]"

/apps/zabbix_server/bin/zabbix_get -s 192.168.37.107 -k "linux_tcp_status["tcp_status","FIN-WAIT-1"]"

/apps/zabbix_server/bin/zabbix_get -s 192.168.37.107 -k "linux_tcp_status["tcp_status","FIN-WAIT-2"]"

/apps/zabbix_server/bin/zabbix_get -s 192.168.37.107 -k "linux_tcp_status["tcp_status","TIME-WAIT"]"

/apps/zabbix_server/bin/zabbix_get -s 192.168.37.107 -k "linux_tcp_status["tcp_status","CLOSING"]"

/apps/zabbix_server/bin/zabbix_get -s 192.168.37.107 -k "linux_tcp_status["tcp_status","CLOSE-WAIT"]"/apps/zabbix_server/bin/zabbix_get -s 192.168.37.107 -k "linux_tcp_status["tcp_status","LAST-ACK"]"

zabbix95计费教程_mysql_42

进入模板,进入linux_tcp_status-active的模板,进入监控项,克隆穿件剩余10种TCP状态的监控项;

zabbix95计费教程_php_43

结果:

zabbix95计费教程_php_44

4)zabbix的邮件,微信通知

邮件通知:

获取QQ邮箱的授权码;riwodlkjkafvbiea (可以使用)

vkdxsaeqbsdtbghb

创建测试脚本:


vim /apps/zabbix_agent/etc/zabbix_agentd.conf.d/all.conf

UserParameter=linux_test[*],/apps/zabbix_agent/etc/zabbix_agentd.conf.d/CPU.sh

这里直接使用了一个echo 输出至,方便模拟cpu负载情况(直接改数字就行)

zabbix95计费教程_zabbix95计费教程_45

chmod a+x CPU.sh

在服务器上进行测试

/apps/zabbix_server/bin/zabbix_get -s 192.168.37.107 -k "linux_test"

zabbix95计费教程_php_46

添加监控项和图形:测试成功

zabbix95计费教程_服务器_47

给报警媒介创建:

zabbix95计费教程_zabbix95计费教程_48

用户添加报警报警媒介:

zabbix95计费教程_php_49

创建动作:配置-->动作-->创建动作:

zabbix95计费教程_php_50

创建操作:

主题:Problem: {EVENT.NAME}故障{TRIGGER.STATUS},服务器:{HOSTNAME1}发生: {TRIGGER.NAME}故障!

内容:告警主机:{HOSTNAME1}

告警时间:{EVENT.DATE} {EVENT.TIME}

告警等级:{TRIGGER.SEVERITY} 告警信息: {TRIGGER.NAME}

告警项目:{TRIGGER.KEY1}

问题详情:{ITEM.NAME}:{ITEM.VALUE}

当前状态:{TRIGGER.STATUS}:{ITEM.VALUE1}

事件ID:{EVENT.ID}

创建恢复操作:

zabbix95计费教程_mysql_51

恢复主题:恢复{TRIGGER.STATUS}, 服务器:{HOSTNAME1}: {TRIGGER.NAME}已恢复!

恢复信息:告警主机:{HOSTNAME1}

告警时间:{EVENT.DATE} {EVENT.TIME}

告警等级:{TRIGGER.SEVERITY}

告警信息: {TRIGGER.NAME}

告警项目:{TRIGGER.KEY1}

问题详情:{ITEM.NAME}:{ITEM.VALUE}

当前状态:{TRIGGER.STATUS}:{ITEM.VALUE1}

事件ID:{EVENT.ID}

创建触发器:配置,模板,主机,触发器

zabbix95计费教程_服务器_52

结果验证:

zabbix95计费教程_zabbix95计费教程_53