一、分布式架构

相信使用zabbix的大神都熟悉他的分布式架构,分布式的优势相当明显,分而治之。比如目前我的架构图如下:

那么,对将要接入监控系统的任何一个agent如何快速定位,并进行接入呢?

 问题分析:

1、目标IP定位

2、目标IP定位后,可能有些是纯内网环境(比如DB机器)

3、proxy管辖范围

4、被管辖目标和管辖者范围确定后,具体用什么方法实现?

解决办法:

1、目标IP基本上是可控的,因为我们自己有哪些IP网段,在CMDB里面一查便知;

2、对于纯内网环境,由于机器无法直接出外网,而只能通过内网IP进行通信,我们可以使用Nginx的反向代理来解决。(重要)

3、proxy的管辖范围也是可控的,因为我们自己清楚自己有哪些proxy,proxy到哪些区域速度更快;

4、目标IP和所要接入的proxy都已经可控,最后就是实现手段:shell脚本。

实现图如下:

前提:proxy必须和安装机能够通过外网通讯。

已经知道解决问题的办法,那么实现起来的话就不是那么难了。方法千千万万种,就看你喜欢哪一种了。

我这里用最简单的,shell脚本方法。

二、Agent定位

 1、通过本机解析方式

#!/bin/bash

ipaddr_shhb=`ip a| grep -E -o "(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)"|grep -E "42.82.92\.|125.63.12\."|wc -l`
ipaddr_shhb_proxy='42.82.92.22' ipaddr_gzqxg=`ip a| grep -E -o "(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)"|grep -E "120.2.9\.|121.13.1\."|wc -l`
ipaddr_gzqxg_proxy='121.114.30.25' ipaddr_hk=`ip a| grep -E -o "(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)"|grep -E "124.12.39\.|11.23.21\."|wc -l`
ipaddr_hk_proxy='124.12.39.33' function install_agent() { wget http://安装机:端口/zabbix/zabbix-2.2.4-agent.sh
/bin/bash zabbix-2.2.4-agent.sh uninstall $1
/bin/bash zabbix-2.2.4-agent.sh install_proxy_agent $1
rm -rf zabbix-2.2.4-agent.sh } if [ ${ipaddr_shhb} -ge 1 ];then install_agent ${ipaddr_shhb_proxy} elif [ ${ipaddr_gzqxg} -ge 1 ];then install_agent ${ipaddr_gzqxg_proxy}
else
install_agent ${ipaddr_hk_proxy} fi

 

2、通过外部解析方式

由于有些云主机通过上面的方式可能不行,因为内网可能重复(不同VPS内网IP可相同)。

#!/bin/bash
pubip=`curl -s http://ipinfo.io|grep ip|awk -F[\"] '{print $4}'`
ipaddr_shhb=`echo $pubip|grep -E "42.82.92\.|125.63.12\."|wc -l`
ipaddr_shhb_proxy='42.82.92.22' ipaddr_gzqxg=`echo $pubip|grep -E "120.2.9\.|121.13.1\."|wc -l`
ipaddr_gzqxg_proxy='121.114.30.25' ipaddr_hk=`echo $pubip|grep -E "124.12.39\.|11.23.21\."|wc -l`
ipaddr_hk_proxy='124.12.39.33' function install_agent() { wget http://安装机:端口/zabbix/zabbix-2.2.4-agent.sh
/bin/bash zabbix-2.2.4-agent.sh uninstall $1
/bin/bash zabbix-2.2.4-agent.sh install_proxy_agent $1
rm -rf zabbix-2.2.4-agent.sh } if [ ${ipaddr_shhb} -ge 1 ];then install_agent ${ipaddr_shhb_proxy} elif [ ${ipaddr_gzqxg} -ge 1 ];then install_agent ${ipaddr_gzqxg_proxy}
else
install_agent ${ipaddr_hk_proxy} fi

  

通过以上2种方式,就可以定位AgentIP和PorxyIP的对应关系,同时,将proxyIP作为参数传入脚本,这样,在安装的时候proxyIP地址就可以动态选定了。

三、实现接入

正式安装时,将proxy的ip作为安装脚本的传入参数即可。其他可以定制化你所需要安装的一切!

#!/bin/bash
#author qunxue
#version 0.1
#update logs:
#1.add install/uninstall function at 2015/3/27
#2.change zabbix_agent_ip get method(CentOS7's ifconfig cmd is not worked! at 2015/3/30
#3.add install for CentOS7 Version at 2015/3/30
#4.add web、DB for base at 2015/09/08
#5.add zabbix_agent_ip check as pubilic
#6.add login ssh monitor
#7.modify zabbix_agent_ip get method
#8.add gpu monitor ###set variables
zabbix_agent_hostname=$(hostname)
zabbix_server_port='10051'
zabbix_server_ip='zabbixseverip'
zabbix_proxy_server_ip=$2
zabbix_agent_ip=$(/sbin/ip addr|grep -w "inet"|grep -v 127.0.0.1|awk -F/ '{print $1}'|awk '{print $2}'|head -n 1) #############Check selinux status#############
function check_selinux() {
if [[ $(getenforce|grep -w "Enforcing"|wc -l) = 1 ]];then
echo -e "\033[1;31mYour system's Selinux is enforced!Now must be disabled....\033[0m"
setenforce 0
sed -i 's/SELINUX=enforcing/SELINUX=disabled/g' /etc/selinux/config
echo -e "\033[1;32mSelinux is disabled Now!\033[0m"
else
echo -e "\033[1;32mSelinux had been disabled,there is no need to be modified!\033[0m"
fi
} #############Check OS version and change dash for Ubuntu##################
function modify_dash() {
if [[ $(uname -a|grep -E "el6|el5|el7|debian"|wc -l) = 1 ]];then
echo "OK.bash is default!"
else
echo "Ubuntu system must modify dash!"
ln -s /bin/bash /bin/sh 2>/dev/null
echo "link created success!"
fi
} #############Check if running script's user is root######################
function install_zabbix_proxy_agent() {
if [ $(id -u) != "0" ]; then
echo -e "\033[1;31m Error: You must be root to run this script!\033[0m"
exit 1
fi
system_version=$(uname -m) if [[ $(grep -i -E -c -w "Red|CentOS" /etc/issue) = 1 ]] && [[ $(grep -i -c "release 6" /etc/issue) = 1 ]];then
if [ $system_version == 'x86_64' ];then
rpm -ivh http://PorxyIP:8888/base/rpm/zabbix-2.2.4-1.el6.x86_64.rpm
rpm -ivh http://PorxyIP:8888/base/rpm/zabbix-agent-2.2.4-1.el6.x86_64.rpm
rm -rf zabbix-2.2.4-1.el6.x86_64.rpm
rm -rf zabbix-agent-2.2.4-1.el6.x86_64.rpm
chkconfig zabbix-agent on
else
rpm -ivh http://PorxyIP:8888/base/rpm/zabbix-2.2.4-1.el6.i386.rpm
rpm -ivh http://PorxyIP:8888/base/rpm/zabbix-agent-2.2.4-1.el6.i386.rpm
rm -rf zabbix-2.2.4-1.el6.i386.rpm
rm -rf zabbix-agent-2.2.4-1.el6.i386.rpm
chkconfig zabbix-agent on
fi elif [[ $(grep -i -E -c -w "Red|CentOS" /etc/issue) = 1 ]] && [[ $(grep -i -c "release 5" /etc/issue) = 1 ]];then
if [ $system_version == 'x86_64' ];then
rpm -ivh http://PorxyIP:8888/base/rpm/zabbix-2.2.4-1.el5.x86_64.rpm
rpm -ivh http://PorxyIP:8888/base/rpm/zabbix-agent-2.2.4-1.el5.x86_64.rpm
rm -rf zabbix-2.2.4-1.el5.x86_64.rpm
rm -rf zabbix-agent-2.2.4-1.el5.x86_64.rpm
chkconfig zabbix-agent on
else
rpm -ivh http://PorxyIP:8888/base/rpm/zabbix-2.2.4-1.el5.i386.rpm
rpm -ivh http://PorxyIP:8888/base/rpm/zabbix-agent-2.2.4-1.el5.i386.rpm
rm -rf zabbix-2.2.4-1.el5.i386.rpm
rm -rf zabbix-agent-2.2.4-1.el5.i386.rpm
chkconfig zabbix-agent on
fi
elif [[ $(grep -i -E -c -w "Red|CentOS" /etc/redhat-release) = 1 ]] && [[ $(grep -i -c "release 7" /etc/redhat-release) = 1 ]];then
if [ $system_version == 'x86_64' ];then
rpm -ivh http://PorxyIP:8888/base/rpm/zabbix-2.2.7-2.el7.x86_64.rpm
rpm -ivh http://PorxyIP:8888/base/rpm/zabbix-agent-2.2.7-2.el7.x86_64.rpm
rm -rf zabbix-2.2.7-2.el7.x86_64.rpm
rm -rf zabbix-agent-2.2.7-2.el7.x86_64.rpm
chkconfig zabbix-agent on
fi
elif [[ $(grep -i -c "ubuntu" /etc/issue) = 1 ]];then
if [ $(grep -i -c "ubuntu 12" /etc/issue) == 1 ];then
wget http://PorxyIP:8888/base/rpm/zabbix-release_2.2-1+precise_all.deb
dpkg -i zabbix-release_2.2-1+precise_all.deb
#apt-get update
apt-get install zabbix-agent
rm -rf zabbix-release_2.2-1+precise_all.deb
else
wget http://PorxyIP:8888/base/rpm/zabbix-release_2.2-1+trusty_all.deb
dpkg -i zabbix-release_2.2-1+trusty_all.deb
#apt-get update
apt-get install zabbix-agent
rm -rf zabbix-release_2.2-1+trusty_all.deb
fi
else
if [ $(grep -i -c "Debian GNU/Linux 6" /etc/issue) == 1 ];then
wget http://PorxyIP:8888/base/rpm/zabbix-release_2.2-1+squeeze_all.deb
dpkg -i zabbix-release_2.2-1+squeeze_all.deb
#apt-get update
apt-get install zabbix-agent
rm -rf zabbix-release_2.2-1+squeeze_all.deb
else
wget http://PorxyIP:8888/base/rpm/zabbix-release_2.2-1+wheezy_all.deb
dpkg -i zabbix-release_2.2-1+wheezy_all.deb
#apt-get update
apt-get install zabbix-agent
rm -rf zabbix-release_2.2-1+wheezy_all.deb
fi
fi ################mondiy zabbix agent conf###################
sed -i 's/LogFileSize=0/LogFileSize=1/g' /etc/zabbix/zabbix_agentd.conf
sed -i 's/Server=127.0.0.1/Server='${zabbix_server_ip}'/g' /etc/zabbix/zabbix_agentd.conf
sed -i 's/ServerActive=127.0.0.1/ServerActive='${zabbix_server_ip}:10051'/g' /etc/zabbix/zabbix_agentd.conf
sed -i '/\# Timeout=3/a Timeout=30' /etc/zabbix/zabbix_agentd.conf
sed -i '/\# UnsafeUserParameters=0/a UnsafeUserParameters=1' /etc/zabbix/zabbix_agentd.conf
sed -i 's#Hostname=Zabbix server#Hostname='$zabbix_agent_hostname'#' /etc/zabbix/zabbix_agentd.conf
sed -i 's@# SourceIP=@SourceIP='$zabbix_agent_ip'@' /etc/zabbix/zabbix_agentd.conf ###############set discovery disk io########################
cat >>/etc/zabbix/zabbix_agentd.conf<<EOF
UserParameter=custom.vfs.dev.discovery,/bin/sh /etc/zabbix/externalscripts/disk.sh
# reads completed successfully
UserParameter=custom.vfs.dev.read.ops[*],cat /proc/diskstats | egrep \$1 | head -1 | awk '{print \$\$4}'
# sectors read
UserParameter=custom.vfs.dev.read.sectors[*],cat /proc/diskstats | egrep \$1 | head -1 | awk '{print \$\$6}'
# time spent reading (ms)
UserParameter=custom.vfs.dev.read.ms[*],cat /proc/diskstats | egrep \$1 | head -1 | awk '{print \$\$7}'
# writes completed
UserParameter=custom.vfs.dev.write.ops[*],cat /proc/diskstats | egrep \$1 | head -1 | awk '{print \$\$8}'
# sectors written
UserParameter=custom.vfs.dev.write.sectors[*],cat /proc/diskstats | egrep \$1 | head -1 | awk '{print \$\$10}'
# time spent writing (ms)
UserParameter=custom.vfs.dev.write.ms[*],cat /proc/diskstats | egrep \$1 | head -1 | awk '{print \$\$11}'
# I/Os currently in progress
UserParameter=custom.vfs.dev.io.active[*],cat /proc/diskstats | egrep \$1 | head -1 | awk '{print \$\$12}'
# time spent doing I/Os (ms)
UserParameter=custom.vfs.dev.io.ms[*],cat /proc/diskstats | egrep \$1 | head -1 | awk '{print \$\$13}'
UserParameter=custom.vfs.dev.util[*],iostat -x -d 1 1|egrep \$1|awk '{print \$NF}' EOF mkdir -p /etc/zabbix/externalscripts/ cat >/etc/zabbix/externalscripts/disk.sh <<EOF
#!/bin/bash
diskarray=(\`cat /proc/diskstats |grep -E "\bvd[a-z]\b|\bhd[a-z]\b|\bsd[a-z]\b|\bc0d0p[0-9]\b"|grep -i "\b\$1\b"|awk '{print \$3}'|sort|uniq 2>/dev/null\`)
length2=\${#diskarray[@]}
printf "{\n"
printf '\t'"\"data\":["
for ((i=0;i<\$length2;i++))
do
printf '\n\t\t{'
printf "\"{#DISK}\":\"\${diskarray[\$i]}\"}"
if [ \$i -lt \$[\$length2-1] ];then
printf ','
fi
done
printf "\n\t]\n"
printf "}\n"
EOF #########Disk monitor############
chown -R zabbix:zabbix /etc/zabbix/externalscripts/disk.sh
chmod 755 /etc/zabbix/externalscripts/disk.sh ########################add iptables for zabbix server/proxy###############
iptable_num=`iptables-save |grep ${zabbix_server_ip}|wc -l` if [ ${iptable_num} -ge 1 ];then
echo -e "\033[1;31miptables had been added!\033[0m"
else
iptables -I INPUT 3 -s ${zabbix_server_ip}/32 -j ACCEPT
iptables-save >/etc/sysconfig/iptables
fi
echo -e "\033[1;31mCongratulations on you successful installation!\033[0m"
service zabbix-agent restart } function uninstall_zabbix_agent() { ################uninstall zabbix##############
if [ $(id -u) != "0" ]; then
echo -e "\033[1;31m Error: You must be root to run this script!\033[0m"
exit 1
fi
system_version=$(uname -m) if [[ $(grep -i -E -c "CentOS|Oracle|Red" /etc/redhat-release) = 1 ]];then
rpm -e zabbix-agent
rpm -e zabbix
else [[ $(grep -E -c "Ubuntu|Debian" /etc/issue) = 1 ]]
dpkg -P zabbix-agent
fi iptables -D INPUT -s ${zabbix_server_ip}/32 -j ACCEPT
iptables -D INPUT -s ${zabbix_proxy_server_ip}/32 -j ACCEPT
} case $1 in
install_proxy_agent) check_selinux
modify_dash
install_zabbix_proxy_agent
;; uninstall)
uninstall_zabbix_agent
;;
*)
echo " "
echo "Usage:$0(install_agent|install_proxy_agent|uninstall)"
echo "NAME"
echo " used to install zabbix agent"
echo "DESCRIPTION"
echo " install_agent:install zabbix agent"
echo " install_proxy_agent:install zabbix proxy agent"
echo " uninstall:unintall agent"
;;
esac

 

以上脚本中需要修改的变量和注意事项:

1、zabbix_server_ip='zabbixseverip'  #更换成你自己的ServerIP

2、PorxyIP  #更换成你自己的安装代理机IP(纯内网环境需要通过反向代理到安装机器下载脚本安装)

3、我上面是通过安装机上下载Agent安装需要的所有包的方式来安装的,你可以通过自己做yum仓库的方式。

四、更快、批量执行

以上是通过脚本,在服务器初始化的时候进行agent安装。

安装方式:

当然,你也可以更快、批量执行。怎么实现?

推荐几种方法:

Ansible

saltstack

都支持高并发,甚至是异步方式。

骚年们,赶紧搞起来。

Zabbix实战-简易教程--大型分布式监控系统实现Agent批量快速接入的更多相关文章

  1. Zabbix实战-简易教程--中间件RabbitMQ监控

    一.环境 zabbix版本:3.0 二.脚本说明 .├── rabbitmq.template.xml   模板文件├── scripts  │   └── rabbitmq│   ├── api.p ...

  2. Zabbix实战-简易教程--中间件kafka监控

    一.环境准备 1.安装kafka Step 1: 下载代码 你可以登录Apache kafka 官方下载.http://kafka.apache.org/downloads.html备注:2.11-1 ...

  3. Zabbix实战-简易教程--中间件ZooKeeper监控

    一.监控思路 通过zabbix trapper方式监控,之前看到网友们都是通过定时任务进行主动上传数据,但是,zabbix还有另外一神器--自动发现,也能达到同样的功能. 二.实现步骤 1.准备脚本 ...

  4. Zabbix实战-简易教程(5)--Proxy和Agent端(源码和yum方式)

    3.3.1 zabbix proxy安装(源码方式) 1.创建目录 mkdir -p /usr/local/zabbix 2.安装必要软件 yum install -y fping(若安装不成功) 或 ...

  5. Zabbix实战-简易教程系列

    一.基础篇(安装和接入) Zabbix实战-简易教程--总流程  Zabbix实战-简易教程--整体架构图 Zabbix实战-简易教程--DB安装和表分区 Zabbix实战-简易教程--Server端 ...

  6. Zabbix实战-简易教程(6)--Server端高可用

    3.4 server前端高可用    至此,单台Zabbix server环境已经搭建完成,为了达到高可用效果,我们需要通过2台服务器之间通过HA软件进行探测,一旦检测到主的server挂掉后,从的s ...

  7. 打造云原生大型分布式监控系统系列文章-腾讯工程师roc

    附上本系列文章链接 打造云原生大型分布式监控系统(一): 大规模场景下 Prometheus 的优化手段 打造云原生大型分布式监控系统(二): Thanos 架构详解 打造云原生大型分布式监控系统(二 ...

  8. Zabbix实战-简易教程(8)--添加item

    一.术语 1.1 Item概念 Item是从主机里面获取的所有数据.通常情况下 item称为监控项,例如我们host加入了 zabbix 监控,我们需要监控它的内存.CPU信息,那么获取的CPU或内存 ...

  9. 打造云原生大型分布式监控系统(四): Kvass+Thanos 监控超大规模容器集群

    概述 继上一篇 Thanos 部署与实践 发布半年多之后,随着技术的发展,本系列又迎来了一次更新.本文将介绍如何结合 Kvass 与 Thanos,来更好的实现大规模容器集群场景下的监控. 有 Tha ...

随机推荐

  1. Yearning v1.3.0 发布,Web 端 SQL 审核平台

    企业级MYSQL web端 SQL审核平台. Website 官网 www.yearning.io Feature 功能 数据库字典自动生成 SQL查询 查询工单 导出 自动补全,智能提示 查询语句审 ...

  2. 【MySQL运维实践】

    什么是日志 日志(log)是一种顺序记录事件流水的文件 记录计算机程序运行过程中发生了什么 多种多样的用途  帮助分析程序问题 分析服务请求的特征.流量等 判断工作是否成功执行 等等…… MySQL日 ...

  3. Linux 进程管理之四大名捕

    本文来自网络,著作权归原创作者所有,不做任何商业用途. 一.四大名捕 四大名捕,最初出现于温瑞安创作的武侠小说,是朝廷中正义力量诸葛小花的四大徒弟,四人各怀绝技,分别是轻功暗器高手“无情”.内功卓越的 ...

  4. (笔记)MySQL 之 Metadata Locking 研究(5.5版本)

      MySQL5.5 中引入了 metadata lock. 顾名思义,metadata lock 不是为了保护表中的数据的,而是保护 database objects(元数据)的.包括表结构.sch ...

  5. 转:log4net使用详解

    说明:本程序演示如何利用log4net记录程序日志信息.log4net是一个功能著名的开源日志记录组件.利用log4net可以方便地将日志信息记录到文件.控制台.Windows事件日志和数据库(包括M ...

  6. python模拟自动登录网站(urllib2)

    不登录打开网页: import urllib2 request = urllib2.Request('http://www.baidu.com') response = urllib2.urlopen ...

  7. Java AWT

    AWT是抽象窗口工具包,是API为Java 程序提供的建立图形用户界面GUI (Graphics User Interface)工具集,AWT可用于Java的applet和applications中. ...

  8. python string.md

    string 包含用于处理文本的常量和类.string模块始于Python的最早版本. 2.0版本中, 许多之前只在模块中实现的函数被转移为string对象的方法. 之后的版本中, 虽然这些函数仍然可 ...

  9. python第二十八课——编码小常识

    2.内存和硬盘: 内存:计算机硬件组成部分之一,它是一个容器,用来存储数据:处理数据速度快, 存储数据量小:断电死机数据会丢失,短暂性存储数据 硬盘:计算机硬件组成部分之一,它是一个容器,用来存储数据 ...

  10. BZOJ4810:[YNOI2017]由乃的玉米田(莫队,bitset)

    Description 由乃在自己的农田边散步,她突然发现田里的一排玉米非常的不美.这排玉米一共有N株,它们的高度参差不齐. 由乃认为玉米田不美,所以她决定出个数据结构题   这个题是这样的: 给你一 ...