zabbix的安装;主动模式proxy以及数据采集;邮件通知
介绍:适用于任何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
#安装数据库: . /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
#配置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
#尝试启动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
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
保存/var/www/html/zabbix/conf/zabbix.conf.php文件
登录成功:
启动zabbix agent:
# /apps/zabbix_server/sbin/zabbix_agentd
验证
#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
#遇见问题
现象使用/apps/zabbix_server/sbin/zabbix_server -c /apps/zabbix_server/etc/zabbix_server.conf可以启动,修改启动文件RestartSec=10s到RestartSec=20s,问题解决可以启动成功;
问题截图
修改前:
修改后:
#遇见问题2
修改RestartSec=20s服务器重启后还是无法启动,注销#TimeoutSec=infinity该行,重启后无法情动问题解决;
Web界面中文菜单环境:
当前版本
图表内的还有英文:
在window上控制面板找到字体,选择自己喜欢的中文字体,复制到桌面
将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');
#刷新网页后查看
#查询启动状态 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
被动模式数据采集
安装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
systemctl start zabbix-agent.service
systemctl status zabbix-agent.service
被动模式:
zabbix web界面添加被监控主机:按照如下点击
点击克隆:
关联监控模板
按照如下添加模板
选择模板
点击添加
经过一段时间的数据采集后,验证zabbix server是否有刚添加完成主机的监控数据和图形,图形显示如下:
主动模式的监控:
删除之前的主机被动模式的主机192.168.37.106,重新修改为主动模式;
修改106的配置文件
systemctl start zabbix-agent.service netstat -tanlp | grep 106
创建主动模式的模板
1)点击一个模板进行克隆;修改名称
2)点击监控项;进行监控项主动模式修改;批量选中监控项名称;点击最下方批量更新;
3)修改类型为主动式;
配置主机项
关联模板:
修改自动发现间隔:
监控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
创建监控脚本:
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
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
/apps/zabbix_server/bin/zabbix_get -s 192.168.37.107 -k "linux_tcp_status["tcp_status","ESTAB"]"
4:在模板中添加监控项或者在主机上添加监控项
创建模板
模板命名:
创建监控项;选择创建监控项
进入监控项配置:
创建图形,选择创建图形;
添加图形
查看该监控项的图形;
重复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"]"
进入模板,进入linux_tcp_status-active的模板,进入监控项,克隆穿件剩余10种TCP状态的监控项;
结果:
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
chmod a+x CPU.sh
在服务器上进行测试
/apps/zabbix_server/bin/zabbix_get -s 192.168.37.107 -k "linux_test"
添加监控项和图形:测试成功
给报警媒介创建:
用户添加报警报警媒介:
创建动作:配置-->动作-->创建动作:
创建操作:
主题: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}
创建恢复操作:
恢复主题:恢复{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}
创建触发器:配置,模板,主机,触发器
结果验证: