高级运维

基于Zabbix构建企业级监控

2017-11-28  本文已影响317人  BruceLiu1
图片来自网络

文/Bruce.Liu1

文章大纲

  1. Zabbix简介
    1.1. Zabbix介绍
    1.2. Zabbix概述
    1.3. Zabbix进程介绍
    1.4. Zabbix说明
  2. Zabbix最佳实践
    2.1. 背景介绍
    2.2. 安装nginx
    2.3. PHP安装+NGINX配置
    2.4. 安装zabbix
    2.5. 智能监控的实现

1.Zabbix简介

1.1.Zabbix介绍

Zabbix是一个企业级的、开源的、分布式的监控套件解决方案,由一个国外的团队持续维护更新(Alexei Vladishev),当前处于活跃开发状态,Zabbix SIA提供支持;软件可以自由下载使用,运作团队靠提供收费的技术支持赢利。Zabbix通过C/S模式采集数据,通过B/S模式在web端展示和配置。
官方网站:http://www.zabbix.com

Zabbix可以监控网络和服务的监控状况. Zabbix利用灵活的告警机制,允许用户对事件发送基于Email的告警. 这样可以保证快速的对问题作出相应. Zabbix可以利用存储数据提供杰出的报告及图形化方式. 这一特性将帮助用户完成容量规划.

Zabbix支持polling和trapping两种方式. 所有的Zabbix报告都可以通过配置参数在WEB前端进行访问. Web前端将帮助你在任何区域都能够迅速获得你的网络及服务状况. Zabbix可以通过尽可能的配置来扮演监控你的IT基础框架的角色,而不管你是来自于小型组织还是大规模的公司.

Zabbix是零成本的. 因为Zabbix编写和发布基于GPL V2协议. 意味着源代码是免费发布的.
Zabbix公司也提供商业化的技术支持.

Alexei Vladishev创建了Zabbix项目,当前处于活跃开发状态,Zabbix SIA提供支持.

1.2.Zabbix概述

在知道zabbix是什么之后,我们最关心的是zabbix有什么特性,了解特性之后,我们才能决定是否会使用zabbix在知道zabbix是什么之后,我们最关心的是zabbix有什么特性,了解特性之后,我们才能决定是否会使用zabbix。
Zabbix是一个高度集成的网络监控套件,通过一个软件包即可提供如下特性:

数据收集

灵活的阀值定义

高级告警配置

实时绘图

扩展的图形化显示

历史数据存储

配置简单

模板使用

网络自动发现

快速的web接口

Zabbix API

权限系统

全特性、agent易扩展

二进制守护进程

具备应对复杂环境情况

1.3.Zabbix进程介绍

图片来自网络

zabbix_agentd
客户端守护进程,此进程收集客户端数据,例如cpu负载、内存、硬盘使用情况等

zabbix_get
zabbix工具,单独使用的命令,通常在server或者proxy端执行获取远程客户端信息的命令。通常用户排错。例如在server端获取不到客户端的内存数据,我们可以使用zabbix_get获取客户端的内容的方式来做故障排查。

zabbix_sender
zabbix工具,用于发送数据给server或者proxy,通常用于耗时比较长的检查。很多检查非常耗时间,导致zabbix超时。于是我们在脚本执行完毕之后,使用sender主动提交数据。

zabbix_server
zabbix服务端守护进程。zabbix_agentd、zabbix_get、zabbix_sender、zabbix_proxy、zabbix_java_gateway的数据最终都是提交到server
备注:当然不是数据都是主动提交给zabbix_server,也有的是server主动去取数据。

zabbix_proxy
zabbix代理守护进程。功能类似server,唯一不同的是它只是一个中转站,它需要把收集到的数据提交/被提交到server里。为什么要用代理?代理是做什么的?卖个关子,请继续关注运维生存时间zabbix教程系列。

zabbix_java_gateway
zabbix2.0之后引入的一个功能。顾名思义:Java网关,类似agentd,但是只用于Java方面。需要特别注意的是,它只能主动去获取数据,而不能被动获取数据。它的数据最终会给到server或者proxy。

1.4.Zabbix说明

具备常见的商业监控软件所具备的功能(主机的性能监控、网络设备性能监控、数据库性能监控、FTP等通用协议监控、多种告警方式、详细的报表图表绘制)支持自动发现网络设备和服务器;支持分布式,能集中展示、管理分布式的监控点;扩展性强,server提供通用接口,可以自己开发完善各类监控。

图片来自网络

Server
指安装zabbix服务的服务器(以下简称服务器端),是最重要的部份,主要安装在linux系统上(支持多种操作系统),采用mysql存储监控数据并使用apache+php的方式呈现。

proxy
指安装在被监控设备上的zabbix代理(以下简称代理),被监控设备上的数据由代理收集后统一上传到服务器端由服务器端收集、整理并呈现。

agent
指支持SNMP协议的设备(也可以是服务器),通过设定SNMP的参数将相关监控数据传送至服务器端(大部份的交换机、防火墙等网络设备都支持SNMP协议)。

2. Zabbix最佳实践

2.1.背景介绍

2.1.1.软件参考文档

参考文档:
官方文档:https://www.zabbix.com/documentation/3.4/

软件下载:
NGINX软件:http://nginx.org/download/nginx-1.5.1.tar.gz
PHP软件:http://www.php.net/downloads.php or http://php.net/get/php-5.5.38.tar.gz/from/a/mirror
MySQL5.7 Yum Repository:https://dev.mysql.com/get/mysql57-community-release-el6-11.noarch.rpmMySQL5.7
Zabbix软件:https://www.zabbix.com/download
redis软件:http://download.redis.io/releases/redis-2.8.23.tar.gz
python软件:https://www.python.org/ftp/python/2.7.13/Python-2.7.13.tgz
setuptools软件:https://pypi.python.org/pypi/setuptools
pip软件:https://pypi.python.org/pypi/pip#downloads

2.1.2.系统环境介绍
2.1.3.安装系统要求
# /etc/init.d/NetworkManager stop
# chkconfig NetworkManager off
# /etc/init.d/iptables stop
# chkconfig iptables off

/etc/selinux/config 改成disable

2.2.安装nginx

2.2.1.必要软件准备
yum install pcre* 
# yum install openssl*
2.2.2.安装nginx

--with-http_stub_status_module:支持nginx状态查询
--with-http_ssl_module:支持https
--with-http_spdy_module:支持google的spdy,想了解请百度spdy,这个必须有ssl的支持
--with-pcre:为了支持rewrite重写功能,必须制定pcre

执行如下命令:

# ./configure --prefix=/usr/local/nginx-1.5.1 \
--with-http_ssl_module --with-http_spdy_module \
--with-http_stub_status_module --with-pcre
2.2.3.启动、关闭、重置nginx
/usr/local/nginx-1.5.1/sbin/nginx
# curl -s http://localhost | grep nginx.com
<a href="http://nginx.com/">nginx.com</a>.</p>
/usr/local/nginx-1.5.1/sbin/nginx -s stop
/usr/local/nginx-1.5.1/sbin/nginx -s reload

2.3.PHP安装+NGINX配置

2.3.1.安装PHP 5.5.38
cd /usr/local/src/
wget http://www.php.net/get/php-5.5.38.tar.bz2/from/jp1.php.net/mirror
yum install gcc make gd-devel libjpeg-devel libpng-devel libxml2-devel bzip2-devel libcurl-devel -y

以下参数支持,ftp,图片函数,pdo等支持,因为使用了php自带的mysqlnd,所以不需要额外安装mysql的lib库了.如果你是64位系统,参数后面加上--with-libdir=lib64,如果不是可以跳过。

tar -xjf php-5.5.38.tar.bz2
cd php-5.5.38
./configure  --prefix=/usr/local/php-5.5.38 \
--with-config-file-path=/usr/local/php-5.5.38/etc --with-bz2 --with-curl \
--enable-ftp --enable-sockets --disable-ipv6 --with-gd \
--with-jpeg-dir=/usr/local --with-png-dir=/usr/local \
--with-freetype-dir=/usr/local --enable-gd-native-ttf \
--with-iconv-dir=/usr/local --enable-mbstring --enable-calendar \
--with-gettext --with-libxml-dir=/usr/local --with-zlib \
--with-pdo-mysql=mysqlnd --with-mysqli=mysqlnd --with-mysql=mysqlnd \
--enable-dom --enable-xml --enable-fpm --with-libdir=lib64 --enable-bcmath
make
make install

备注:如果PHP不需要curl和ftp的支持,可以将以上的--with-curl --enable-ftp去掉.

cp php.ini-production /usr/local/php-5.5.38/etc/php.ini
cp /usr/local/php-5.5.38/etc/php-fpm.conf.default /usr/local/php-5.5.38/etc/php-fpm.conf
/usr/local/php-5.5.38/sbin/php-fpm

执行以上命令,如果没报错一般情况下表示启动正常,如果不放心,也可以通过端口判断是PHP否启动

# netstat -lnt | grep 9000
tcp 0 0 127.0.0.1:9000 0.0.0.0:* LISTEN
2.3.2.配置nginx
mkdir -p /data/logs/nginx/ # 
mkdir -p /data/site/test.zabbix.com/ # 站点根目录
vim /data/site/test.zabbix.com/info.php
<?php
phpinfo();
?>
user  root;        # root用户启动nginx
worker_processes  1;

#error_log  logs/error.log;
#error_log  logs/error.log  notice;
#error_log  logs/error.log  info;

#pid        logs/nginx.pid;


events {
    worker_connections  1024;
}


http {
    include       mime.types;
    default_type  application/octet-stream;

    #log_format  main  '$remote_addr - $remote_user [$time_local] "$request" '
    #                  '$status $body_bytes_sent "$http_referer" '
    #                  '"$http_user_agent" "$http_x_forwarded_for"';

    #access_log  logs/access.log  main;

    sendfile        on;
    #tcp_nopush     on;

    #keepalive_timeout  0;
    keepalive_timeout  65;

    #gzip  on;
    #
server {
        listen       80;
        #server_name monitor.ttlsa.com;
        #access_log  /data/logs/nginx/monitor.ttlsa.com.access.log  main;
 
        index index.html index.php index.html;
        root /data/site/test.zabbix.com;        # 测试页面的临时站点
        # root /usr/share/zabbix;        #默认rpm安装的zabbix web前端站点目录就是/usr/share/zabbix
 
        location /
        {
                try_files $uri $uri/ /index.php?$args;
        }
 
        location ~ ^(.+.php)(.*)$ {
                fastcgi_split_path_info ^(.+.php)(.*)$;
                include fastcgi.conf;
                fastcgi_pass  127.0.0.1:9000;
                fastcgi_index index.php;
                fastcgi_param  PATH_INFO          $fastcgi_path_info;
        }
}
}

nginx将会连接回环地址9000端口执行PHP文件,需要使用tcp/ip协议,速度比较慢.建议大家换成使用socket方式连接。

/usr/local/nginx-1.5.1/sbin/nginx
2.3.3.访问测试
# curl http://localhost/info.php

!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml"><head>
<style type="text/css">
......  省略  ......

2.4.安装zabbix

2.4.1.安装Zabbix Server端
2.4.1.1.PHP参数

打开php.ini配置文件,修改如下参数为如下值,否则zabbix安装不了
/usr/local/php-5.5.38/etc/php.ini

[PHP]

......  省略  ......
max_execution_time = 300
memory_limit = 128M
post_max_size = 16M
upload_max_filesize = 2M
max_input_time = 300
date.timezone = Asia/Shanghai
post_max_size=16M
max_execution_time=300
max_input_time=300

[CLI Server]
2.4.1.2.安装Zabbix Web、Server
yum groupinstall "Development tools"

zabbix-server-mysql-3.4.4-2.el6.x86_64.rpm
zabbix-web-3.4.4-2.el6.noarch.rpm
zabbix-web-mysql-3.4.4-2.el6.noarch.rpm

# yum install zabbix-*

# rpm -qa | grep zabbix
zabbix-web-mysql-3.4.4-2.el6.noarch
zabbix-server-mysql-3.4.4-2.el6.x86_64
zabbix-web-3.4.4-2.el6.noarch
2.4.1.3.创建用户
# groupadd zabbix
# useradd -g zabbix zabbix
2.4.1.4.初始化数据库
shell> mysql -uroot -p<root_password>
mysql> create database zabbix character set utf8 collate utf8_bin;
mysql> grant all privileges on zabbix.* to zabbix@'192.168.217.%' identified by 'Zabbix';
mysql> quit;
# zcat /usr/share/doc/zabbix-server-mysql-3.4.4/create.sql.gz | mysql -h 192.168.217.130 -P3389 -uzabbix -p'Zabbix' zabbix
mysql: [Warning] Using a password on the command line interface can be insecure.
2.4.1.5.配置zabbix server
# mv /etc/zabbix/zabbix_server.conf  /etc/zabbix/zabbix_server.conf.bak
# cat /etc/zabbix/zabbix_server.conf.bak | grep -v "^#" | grep -v ^$ > /etc/zabbix/zabbix_server.conf
# vim /etc/zabbix/zabbix_server.conf

LogFile=/var/log/zabbix/zabbix_server.log
LogFileSize=0
PidFile=/var/run/zabbix/zabbix_server.pid
SocketDir=/var/run/zabbix
DBHost=192.168.217.130
DBPort=3389
DBName=zabbix
DBUser=zabbix
DBPassword=Zabbix
SNMPTrapperFile=/var/log/snmptrap/snmptrap.log
Timeout=4
AlertScriptsPath=/usr/lib/zabbix/alertscripts
ExternalScripts=/usr/lib/zabbix/externalscripts
LogSlowQueries=3000
# chmod -R 755 /usr/share/zabbix
# chmod -R 755 /etc/zabbix/web
# /etc/init.d/zabbix-server start
Starting Zabbix server:                                    [  OK  ]

# netstat -ntlp | grep 10051
tcp        0      0 0.0.0.0:10051               0.0.0.0:*                   LISTEN      126571/zabbix_serve 
tcp        0      0 :::10051                    :::*                        LISTEN      126571/zabbix_serve 
# tailf /var/log/zabbix/zabbix_server.log 

......  省略  ......
 23929:20171129:063930.487 current database version (mandatory/optional): 03040000/03040005
 23929:20171129:063930.488 required mandatory version: 03040000
 23929:20171129:063930.523 server #0 started [main process]
 23932:20171129:063930.526 server #3 started [alerter #2]
 23931:20171129:063930.526 server #2 started [alerter #1]
 23933:20171129:063930.526 server #4 started [alerter #3]
 23930:20171129:063930.529 server #1 started [configuration syncer #1]
 23934:20171129:063930.529 server #5 started [housekeeper #1]
 23936:20171129:063930.529 server #7 started [http poller #1]
 23935:20171129:063930.529 server #6 started [timer #1]
 23938:20171129:063930.532 server #9 started [history syncer #1]
 23937:20171129:063930.532 server #8 started [discoverer #1]
 23939:20171129:063930.535 server #10 started [history syncer #2]
 23940:20171129:063930.538 server #11 started [history syncer #3]
 23942:20171129:063930.538 server #13 started [escalator #1]
 23941:20171129:063930.540 server #12 started [history syncer #4]
 23944:20171129:063930.544 server #15 started [self-monitoring #1]
 23943:20171129:063930.544 server #14 started [proxy poller #1]
 23946:20171129:063930.550 server #17 started [poller #1]
 23948:20171129:063930.550 server #19 started [poller #3]
 23947:20171129:063930.550 server #18 started [poller #2]
 23949:20171129:063930.553 server #20 started [poller #4]
 23950:20171129:063930.553 server #21 started [poller #5]
 23951:20171129:063930.555 server #22 started [unreachable poller #1]
 23952:20171129:063930.555 server #23 started [trapper #1]
 23953:20171129:063930.557 server #24 started [trapper #2]
 23954:20171129:063930.562 server #25 started [trapper #3]
 23945:20171129:063930.564 server #16 started [task manager #1]
 23955:20171129:063930.567 server #26 started [trapper #4]
 23956:20171129:063930.578 server #27 started [trapper #5]
 23957:20171129:063930.580 server #28 started [icmp pinger #1]
 23958:20171129:063930.580 server #29 started [alert manager #1]
 23959:20171129:063930.583 server #30 started [preprocessing manager #1]
 23960:20171129:063930.590 server #31 started [preprocessing worker #1]
 23961:20171129:063930.590 server #32 started [preprocessing worker #2]
 23962:20171129:063930.591 server #33 started [preprocessing worker #3]
2.4.2.配置Zabbix Web端
# cp -p /usr/share/zabbix/conf/zabbix.conf.php.example /etc/zabbix/web/zabbix.conf.php
# vim /etc/zabbix/web/zabbix.conf.php 
<?php
// Zabbix GUI configuration file.
global $DB;

$DB['TYPE']             = 'MYSQL';
$DB['SERVER']           = '192.168.1.120';
$DB['PORT']             = '3389';
$DB['DATABASE']         = 'zabbix';
$DB['USER']             = 'zabbix';
$DB['PASSWORD']         = 'Zabbix';
// Schema name. Used for IBM DB2 and PostgreSQL.
$DB['SCHEMA']           = '';

$ZBX_SERVER             = 'localhost';
$ZBX_SERVER_PORT        = '10051';
$ZBX_SERVER_NAME        = '';

$IMAGE_FORMAT_DEFAULT   = IMAGE_FORMAT_PNG;
# vim /usr/local/nginx-1.5.1/conf/nginx.conf

......  省略  ......
        # root /data/site/test.zabbix.com;        # 测试页面的临时站点
        root /usr/share/zabbix;        #默认rpm安装的zabbix web前端站点目录就是/usr/share/zabbix
......  省略  ......
# /usr/local/nginx-1.5.1/sbin/nginx -s stop
# /usr/local/nginx-1.5.1/sbin/nginx

通过浏览器访问:http://192.168.217.131,默认账户、密码:Admin、zabbix

图片来自原创
2.4.3.安装Zabbix Agent端
# cat /etc/hosts

......  省略  ......
192.168.217.130 db1
# mkdir /etc/zabbix_agentd.conf.d
# chown -R zabbix:zabbix /etc/zabbix_agentd.conf.d/
# rpm -ivh zabbix-agent-3.4.4-2.el6.x86_64.rpm 
warning: zabbix-agent-3.4.4-2.el6.x86_64.rpm: Header V4 RSA/SHA512 Signature, key ID a14fe591: NOKEY
Preparing...                ########################################### [100%]
   1:zabbix-agent           ########################################### [100%]
# vim /etc/zabbix/zabbix_agentd.conf
PidFile=/var/run/zabbix/zabbix_agentd.pid
LogFile=/var/log/zabbix/zabbix_agentd.log
LogFileSize=0
EnableRemoteCommands=1
Server=192.168.217.131
ListenPort=10050
StartAgents=10
ServerActive=192.168.217.131
Hostname=db1
BufferSend=5
BufferSize=2000
Timeout=30
Include=/etc/zabbix_agentd.conf.d/
# /etc/init.d/zabbix-agent restart

如果Server端采集不到数据等问题,zabbix-get-3.4.4-2.el6.x86_64配合 Server 端、Agent端日志进行分析处理

2.4.4.配置监控一台主机
图片来自原创 图片来自原创 图片来自原创 图片.png

如果监控数据还是没有,请使用zabbix_get测试Server和agent之间采集数据是否正常# zabbix_get -s 192.168.217.130 -p 10050 -k agent.ping

图片.png

2.5.智能监控的实现

2.5.1.安装配置redis
2.5.1.1.编译redis
tar -zxvf redis-2.8.23.tar.gz 
cd redis-2.8.23
make
make install
2.5.1.2.创建redis目录
mkdir -p /data1/redis/10680/
mkdir /etc/redis
2.5.1.3.创建配置文件
# vim /etc/redis/10680.conf

daemonize yes 
pidfile /var/run/redis_10680.pid
port 10680
tcp-backlog 511
timeout 50
tcp-keepalive 20
loglevel notice
logfile /var/log/redis_10680.log
databases 1
dbfilename dump.rdb
dir /data1/redis/10680/

#requirepass foobared
#slaveof 192.168.217.131 10680
#masterauth <master-password>
#slave-serve-stale-data yes

slave-read-only no
repl-diskless-sync no
repl-timeout 6000
repl-disable-tcp-nodelay no
repl-backlog-size 100mb
#repl-backlog-ttl 3600
slave-priority 100

#rename-command shutdown "" 
#rename-command flushall "" 
#rename-command flushdb "" 
#rename-command keys "" 

maxclients 10000
maxmemory 8gb 
maxmemory-policy volatile-lru
appendonly no 
appendfilename "appendonly.aof"
appendfsync everysec
no-appendfsync-on-rewrite yes

#auto-aof-rewrite-percentage 100
#auto-aof-rewrite-min-size 64mb
#aof-load-truncated yes

lua-time-limit 5000
slowlog-log-slower-than 10000
slowlog-max-len 128
hash-max-ziplist-entries 512
hash-max-ziplist-value 64
list-max-ziplist-entries 512
list-max-ziplist-value 64
set-max-intset-entries 512
zset-max-ziplist-entries 128
zset-max-ziplist-value 64
activerehashing yes
client-output-buffer-limit normal 0 0 0
client-output-buffer-limit slave 0 0 0
client-output-buffer-limit pubsub 32mb 8mb 60
hz 10
2.5.1.4.redis启停
# 启动redis
# redis-server /etc/redis/10680.conf &      

# 链接测试
# redis-cli -p 10680        
127.0.0.1:10680> set 192.168.1.120 agent.ping
OK
127.0.0.1:10680> get 192.168.1.120
"agent.ping"

# 关闭redis
# redis-cli -p 10680 shutdown        
2.5.2.部署python2.7运行环境
# yum -y install zlib* #安装必要软件包
# yum -y install openssl
# yum -y install openssl-devel
# tar xvf Python-2.7.13.tgz 
# cd Python-2.7.13
# ./configure --prefix=/usr/local/python2.7
# make && make install
# cd /usr/local/python2.7/
# vim /etc/profile

......  省略  ......
export PATH=/usr/local/python2.7/bin:$PATH
# unzip setuptools-38.2.3.zip 
# cd setuptools-38.2.3
# python setup.py build
# python setup.py install
# tar zxvf pip-9.0.1.tar.gz 
# cd pip-9.0.1
# python2.7 setup.py build
# python2.7 setup.py install
# pip2.7 search pymysql
# pip2.7 install pymysql
# pip2.7 install redis
2.5.3.部署MySQL智能监控
mysql> GRANT ALL PRIVILEGES ON *.* TO 'zabbix_monitor'@'127.0.0.1' IDENTIFIED BY 'zabbix';
mysql> flush privileges;
mkdir -p /etc/zabbix_agentd.conf.d/scripts

monitor_mysql.conf上传至/etc/zabbix_agentd.conf.d
mysql_monitor.py上传至/etc/zabbix_agentd.conf.d/scripts
修改mysql_monitor.py 网卡名称 / 数据库账号 / 密码 / redis host / redis port

# python2.7 mysql_monitor.py 
{
  "data": [
    {
      "{#MYSQL_DB}": "Master:192.168.1.121:3389"
    }
  ]
}

# python2.7 mysql_monitor.py Master:192.168.1.121:3389 slave_status
1

扫描下方二维码关注本人微信号!欢迎大家交流学习!

Bruce.Liu
上一篇下一篇

猜你喜欢

热点阅读