Zabbix监控大数据集群(一)
Zabbix监控大数据集群
一、监控Linux系统
对于各种大数据框架的监控可能要用到Zabbix-Sender组件,我们这里首先进行安装(如果不安装,可能会导致数据无法发送):
yum install -y zabbix-sender
1.1 说明
本文使用Zabbix4.4版本,自带有Linux系统的监控模板,只要将模板链接到相应的主机上面即可。
1.2 操作步骤
- 启动服务
在Server端启动Zabbix-Server服务:
#启动服务
systemctl start zabbix-server
#设置为开机自启
systemctl enable zabbix-server
在Agent端启动Zabbix-agent服务:
#启动服务
systemctl start zabbix-agent
#设置为开机自启
systemctl enable zabbix-agent
- 登录Zabbix管理页面
a. 在浏览器中输入:http://Server端IP地址/zabbix;
b. 输入用户名和密码,登录;
c. 点击配置——>主机,
选择要监控的主机:
选择模板,在搜索框中输入linux,选择第一个模板:
点击更新:
至此,Linux系统的监控就完成了。
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-eRUov2pD-1594287338779)(E:\02_文档资料\15_Zabbix资料\image\Snipaste_2020-07-09_11-53-11.png)]
二、监控MySQL集群
2.1 说明
虽然Zabbix4.4自带MySQL模板,但是在链接模板之前,需要进行配置:MySQL的监控需要创建配置文件,同时需要在MySQL中创建用于Zabbix监控的用户。
2.2 操作步骤
- 在Agent端创建文件
vim /etc/zabbix/zabbix_agentd.d/template_db_mysql.conf
#编辑如下内容
UserParameter=mysql.ping[*], mysqladmin -h"$1" -P"$2" ping
UserParameter=mysql.get_status_variables[*], mysql -h"$1" -P"$2" -sNX -e "show global status"
UserParameter=mysql.version[*], mysqladmin -s -h"$1" -P"$2" version
UserParameter=mysql.db.discovery[*], mysql -h"$1" -P"$2" -sN -e "show databases"
UserParameter=mysql.dbsize[*], mysql -h"$1" -P"$2" -sN -e "SELECT COALESCE(SUM(DATA_LENGTH + INDEX_LENGTH),0) FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_SCHEMA='$3'"
UserParameter=mysql.replication.discovery[*], mysql -h"$1" -P"$2" -sNX -e "show slave status"
UserParameter=mysql.slave_status[*], mysql -h"$1" -P"$2" -sNX -e "show slave status"
- 登录MySQL,创建监控用户
#创建监控的用户
CREATE USER '监控用户'@'%' IDENTIFIED BY '用户密码';
#赋予该用户远程登录的权限
GRANT USAGE,REPLICATION CLIENT,PROCESS,SHOW DATABASES,SHOW VIEW ON *.* TO '监控用户'@'%';
- 在Agent端指定监控用户和密码
#编辑文件(没有,则创建)
vim /var/lib/zabbix/.my.cnf
#内容如下
[client]
user='监控用户'
password='密码'
登录Zabbix管理页面
点击配置——>主机——>选择MySQL服务所在的主机——>模板——>搜索mysql模板:
三、监控Redis集群
3.1 说明
Zabbix官方提供了Redis的监控模板,并且有Python和Nodejs两个版本,官方说明的链接:https://www.zabbix.com/cn/integrations/redis;
本文仅使用Python版本,需要提前安装依赖包python-pip、argparse、redis。
3.2 操作步骤
- 安装Python依赖
#执行环境必须为Python3版本,如果没有则需要下载
yum install -y python3
#安装依赖包
yum install -y python-pip
pip3 install argparse
pip3 install redis
在Agent端部署
a.创建监控的脚本
#在zabbix-agent安装目录下的scripts文件中创建脚本
vim /apps/zabbix_agent_4.4/scripts/zabbix_check_redis.py#编辑内容
#!/usr/bin/env python3import sys, redis, json, argparseparser = argparse.ArgumentParser(description='Zabbix Redis status script')
parser.add_argument('--host', dest='redis_host', help='Redis server hostname', nargs='?')
parser.add_argument('-p', dest='redis_port', action='store', help='Redis server port', default=6379, type=int)
parser.add_argument('-a', dest='redis_pass', action='store', nargs='?', help='Redis server pass', default=None)
parser.add_argument('--info', action='store_true', help='Get Info Metrics', default=False)
parser.add_argument('--ping', action='store_true', help='Ping', default=False)
parser.add_argument('--slowlog', action='store_true', help='Slowlog Number of Items', default=False)
parser.add_argument('--config', action='store_true', help='Get Config Params', default=False)
args = parser.parse_args()sections = ('Server', 'Clients', 'Memory', 'Persistence', 'Stats', 'Replication', 'CPU', 'Cluster', 'Keyspace')info = {}def compact_json(data):return json.dumps(data, separators=(',', ':'))try:with redis.Redis(host=args.redis_host, port=args.redis_port, password=args.redis_pass) as client:if args.ping:ping = client.ping()if ping:print(1)else:print(0)if args.info:for section in sections:info[section] = client.info(section)print(compact_json(info))if args.slowlog:number = client.slowlog_len()print(number)if args.config:config = client.config_get()print(compact_json(config))except redis.AuthenticationError as err:message = {'ZBX_NOTSUPPORTED': err}print(compact_json(message))sys.exit(1)
except redis.ConnectionError:message = {'ZBX_NOTSUPPORTED': err}print(compact_json(message))sys.exit(1)
except redis.RedisError:message = {'ZBX_NOTSUPPORTED': err}print(compact_json(message))sys.exit(1)sys.exit()
b.创建配置文件
#创建文件(注意路径)
vim /etc/zabbix/zabbix_agentd.d/userparameters_redis.conf#编辑内容
UserParameter=redis.info[*], /usr/bin/python3 /dgis/apps/zabbix_agent_4.4/scripts/zabbix_check_redis.py --host $1 -a $2 --info
UserParameter=redis.ping[*], /usr/bin/python3 /dgis/apps/zabbix_agent_4.4/scripts/zabbix_check_redis.py --host $1 -a $2 --ping
UserParameter=redis.config[*], /usr/bin/python3 /dgis/apps/zabbix_agent_4.4/scripts/zabbix_check_redis.py --host $1 -a $2 --config
UserParameter=redis.slowlog.count[*], /usr/bin/python3 /dgis/apps/zabbix_agent_4.4/scripts/zabbix_check_redis.py --host $1 -a $2 --slowlog
c.导入模板
Redis模板zabbix_template_db_redis_custom.xml,详见,下载好模板后,登录ZabbixWeb管理页面,导入模板:
点击导入:
导入完成后,将改模板链接到Redis服务所在的节点即可,链接模板参考上面的操作。
四、监控RabbitMQ集群
4.1 说明
同样Zabbix官方给出了监控RabbitMQ的操作方案(https://www.zabbix.com/cn/integrations/rabbitmq),同时也自带了监控的模板,本文做简单说明。
4.2 操作步骤
- 在RabbitMQ中创建用来监控的用户
rabbitmqctl add_user zbx_monitor <PASSWORD>
rabbitmqctl set_permissions -p / zbx_monitor "" "" ".*"
rabbitmqctl set_user_tags zbx_monitor monitoring
在ZabbixWeb管理页面将RabbitMQ监控的模板链接到对应的节点
修改参数
在web页面,右上角搜索官方自带的RabbitMQ模板:
点击搜索图标或者在键盘按回车键,就可以找到官方提供的模板:
可以看到搜索结果共四个,由于我们是RabbitMQ集群模式,所以我们点击第二个,选择宏选项,然后点击继承模板的宏:
将上面红框标出来的内容,填写为自己刚才创建的用户名和密码,然后点击更新即可。
五、监控Zookeeper集群
5.1 说明
Zabbix官方没有提供现成Zookeeper的模版,但是给出了GitHub上的方案(https://www.zabbix.com/cn/integrations/zookeeper),本文使用另一种方案(亲测可行),操作起来会比较复杂。
5.2 操作步骤
以下均在Agent端执行:
- 安装依赖
yum install -y nc
- 编写监控脚本
#创建文件(Scripts文件没有,则进行创建)
vim /apps/zabbix_agent_4.4/scripts/zookeeper.py
#编辑内容如下
#!/usr/bin/python
"""{'zk_followers': 0,
'zk_outstanding_requests': 0,
'zk_approximate_data_size': 890971,
'zk_packets_sent': 5818488,
'zk_pending_syncs': 0,
'zk_avg_latency': 0,
'zk_version': '3.4.6-1569965, built on 02/20/2014 09:09 GMT',
'zk_watch_count': 1364,
'zk_packets_received': 5797681,
'zk_open_file_descriptor_count': 46,
'zk_server_ruok': 'imok',
'zk_server_state': 'follower',
'zk_synced_followers': 0,
'zk_max_latency': 400,
'zk_num_alive_connections': 18,
'zk_min_latency': 0,
'zk_ephemerals_count': 1112,
'zk_znode_count': 2207,
'zk_max_file_descriptor_count': 4096}
31022
"""import sys
import socket
import re
import subprocess
from StringIO import StringIO
import oszabbix_sender = '/usr/bin/zabbix_sender'
zabbix_conf = '/etc/zabbix/zabbix_agentd.conf'
send_to_zabbix = 1# get zookeeper server status
class ZooKeeperServer(object):def __init__(self, host='localhost', port='2181', timeout=1):self._address = (host, int(port))self._timeout = timeoutself._result = {}def _create_socket(self):return socket.socket()def _send_cmd(self, cmd):""" Send a 4letter word command to the server """s = self._create_socket()s.settimeout(self._timeout)s.connect(self._address)s.send(cmd)data = s.recv(2048)s.close()return datadef get_stats(self):""" Get ZooKeeper server stats as a map """"""zk_version 3.4.6-1569965, built on 02/20/2014 09:09 GMTzk_avg_latency 0zk_max_latency 94zk_min_latency 0zk_packets_received 1267904zk_packets_sent 1317835zk_num_alive_connections 12zk_outstanding_requests 0zk_server_state followerzk_znode_count 1684zk_watch_count 2757zk_ephemerals_count 899zk_approximate_data_size 728074zk_open_file_descriptor_count 41zk_max_file_descriptor_count 4096"""data_mntr = self._send_cmd('mntr')data_ruok = self._send_cmd('ruok')if data_mntr:result_mntr = self._parse(data_mntr)if data_ruok:# {'zk_server_ruok': 'imok'}result_ruok = self._parse_ruok(data_ruok)self._result = dict(result_mntr.items() + result_ruok.items())if not self._result.has_key('zk_followers') and not self._result.has_key('zk_synced_followers') and not self._result.has_key('zk_pending_syncs'):# #### the tree metrics only exposed on leader role zookeeper server, we just set the followers' to 0leader_only = {'zk_followers':0,'zk_synced_followers':0,'zk_pending_syncs':0} self._result = dict(result_mntr.items() + result_ruok.items() + leader_only.items())return self._result def _parse(self, data):""":param data: zk_outstanding_requests 0 zk_approximate_data_size 653931:return: {'zk_outstanding_requests': '0', 'zk_approximate_data_size': '653931',}"""""" Parse the output from the 'mntr' 4letter word command """h = StringIO(data)result = {}for line in h.readlines():try:key, value = self._parse_line(line)result[key] = valueexcept ValueError:pass # ignore broken linesreturn resultdef _parse_ruok(self, data):""":param data: imok:return: {'zk_server_ruok': 'imok'}"""""" Parse the output from the 'ruok' 4letter word command """h = StringIO(data)result = {}ruok = h.readline()if ruok:result['zk_server_ruok'] = ruokreturn resultdef _parse_line(self, line):# zk_watch_count 1482try:# zk_max_file_descriptor_count 65535key, value = map(str.strip, line.split('\t'))except ValueError:raise ValueError('Found invalid line: %s' % line)if not key:raise ValueError('The key is mandatory and should not be empty')try:value = int(value)except (TypeError, ValueError):passreturn key, valuedef get_pid(self):# ps -ef|grep java|grep zookeeper|awk '{print $2}'pidarg = '''ps -ef|grep java|grep zookeeper|grep -v grep|awk '{print $2}' ''' # 31022pidout = subprocess.Popen(pidarg, shell=True, stdout=subprocess.PIPE)pid = pidout.stdout.readline().strip('\n')return piddef send_to_zabbix(self, metric):# key = zookeeper.status[zk_max_file_descriptor_count]key = "zookeeper.status[" + metric + "]"if send_to_zabbix > 0:# print key + ":" + str(self._result[metric])try:subprocess.call([zabbix_sender, "-c", zabbix_conf, "-k", key, "-o", str(self._result[metric])], stdout=FNULL, stderr=FNULL, shell=False)#print "send zabbix success"except OSError, detail:print "Something went wrong while exectuting zabbix_sender : ", detailelse:print "Simulation: the following command would be execucted :\n", zabbix_sender, "-c", zabbix_conf, "-k", key, "-o", self._result[metric], "\n"def usage():"""Display program usage"""print "\nUsage : ", sys.argv[0], " alive|all"print "Modes : \n\talive : Return pid of running zookeeper\n\tall : Send zookeeper stats as well"sys.exit(1)accepted_modes = ['alive', 'all']
if len(sys.argv) == 2 and sys.argv[1] in accepted_modes:mode = sys.argv[1]
else:usage()zk = ZooKeeperServer()
# print zk.get_stats()
pid = zk.get_pid()if pid != "" and mode == 'all':zk.get_stats()print zk._resultFNULL = open(os.devnull, 'w')for key in zk._result:zk.send_to_zabbix(key)FNULL.close()print pid
elif pid != "" and mode == "alive":print pid
else:print 0#添加可执行权限
chmod +x /apps/zabbix_agent_4.4/scripts/zookeeper.py
启动定时任务
为了让Server端收到数据,我们需要定时执行改脚本:
crontab -e
*/1 * * * * /usr/bin/python /apps/zabbix_agent_4.4/scripts/zookeeper.py all
- 创建Zabbix配置文件
#创建文件
vim /etc/zabbix/zabbix_agentd.d/check_zookeeper.conf
#编辑内容如下
UserParameter=zookeeper.status[*],/usr/bin/python /apps/zabbix_agent_4.4/scripts/zookeeper.py $1
#重启Zabbix-agent服务
systemctl restart zabbix-agent
导入监控模板
文件名为zookeeper.xml,详见附件;
将上面的模板与Zookeeper服务所在的节点进行链接。
六、监控Kafka集群
6.1 说明
同样,对于Kafka的监控,官方给出了GitHub大神的方案(https://www.zabbix.com/cn/integrations/kafka),下文做一简单介绍;
6.2 操作步骤
在Server端执行如下操作:
- 安装zabbix-java-gateway
#安装
yum install -y zabbix-java-gateway
#设置为开机自启
systemctl enable zabbix-java-gateway
#启动服务
systemctl start zabbix-java-gateway
- 配置zabbix-java-gateway
#安装
vim /etc/zabbix/zabbix_java_gateway.conf
#修改
START_POLLERS=10
- 配置zabbix-server
vim /etc/zabbix/zabbix_server.conf
#修改
StartJavaPollers=5
JavaGateway=java-gateway所在节点的IP地址(Server端IP)
- 重启zabbix-server服务
systemctl restart zabbix-server
Kafka集群配置JMX端口
a.添加端口
#在Kafka启动命令前加上端口
JMX_PORT=1234(指定端口即可) /apps/kafka/bin/kafka-server-start.sh -daemon /apps/kafka/config/server.properties
#注:避免端口被占用
b.重启Kafka集群
导入模板,链接Kafka集群
模板为zabbix-kafka.xml,详见附件。
七、监控Hadoop集群
下节说。。。
Zabbix监控大数据集群(一)相关推荐
- 一篇运维老司机的大数据平台监控宝典(1)-联通大数据集群平台监控体系进程详解
一篇运维老司机的大数据平台监控宝典(1)-联通大数据集群平台监控体系进程详解 "如果你是一个经验丰富的运维开发人员,那么你一定知道ganglia.nagios.zabbix.elastics ...
- 阿里云TSDB在大数据集群监控中的方案与实战
目前大部分的互联网企业基本上都有搭建自己的大数据集群,为了能更好让我们的大数据集群更加高效安全的工作,一个优秀的监控方案是必不可少的:所以今天给大家带来的这篇文章就是讲阿里云TSDB在上海某大型互联网 ...
- 大数据集群跨多版本升级、业务0中断,只因背后有TA
摘要:2021年4月21日,中国太平洋保险集团联合华为云完成了全球首例大数据集群跨多版本的大数据集群滚动升级. 本文分享自华为云社区<华为云FusionInsight助力太保跨多版本升级业务0中 ...
- python自动化部署hadoop集群_大数据集群的自动化运维实现思路
原标题:大数据集群的自动化运维实现思路 | 作者简介 王晓伟 知数堂<大数据实战就业>课程讲师 六年大数据相关工作经验 清华大学软件工程硕士 曾就职于网易.搜狗等互联网企业 从事大数据及数 ...
- 同程旅行大数据集群在 Kubernetes 上的服务化实践
本文将向大家介绍同程旅行大数据集群在 Kubernetes 上服务化建设的一些实践和经验. 同程旅行大数据集群从 2017 年开始容器化改造,经历了自研调度 Docker 容器 ,到现在的云舱平台,采 ...
- 大数据集群迁移的那一夜是怎么过的|回忆录
背景 大数据集群迁移这件事,不知道有多少同学做过(反正我是第一次).我说的不是简单的把一个集群的数据拷贝到另一个集群上,我指的是整个数据处理平台与相关的前台业务的迁移工作,是从一个机房到另一个机房. ...
- 大数据集群搭建全部过程(Vmware虚拟机、hadoop、zookeeper、hive、flume、hbase、spark、yarn)
大数据集群搭建进度及问题总结 所有资料在评论区那里可以得到 第一章: 1.网关配置(参照文档) 注意事项:第一台虚拟机改了,改为centos 101 ,地址为192.168.181.130 网关依然是 ...
- 大数据集群软件安装手册1
大数据集群软件安装 1 安装Centos系统 1.1安装VMware12虚拟机 1.2安装Centos7.6操作系统 2.配置Centos操作系统 2.1关闭防火墙和Selinux 2.2配置主机名和 ...
- 那些年,我们迁移过的大数据集群
大数据集群迁移这件事,不知道有多少同学做过.我说的不是把一个集群的数据备份到另一个集群上.我指的是整个数据平台与大数据相关的所有集群及业务的迁移工作,从一个机房到另一个机房. 具体范围可能包括:从离线 ...
最新文章
- jenkins漏洞导致服务器中了挖矿病毒!cpu飙高351%!看我如何消灭它!
- python爬取新闻并归数据库_Python爬取数据并写入MySQL数据库操作示例
- 计算机办公实用技能项目实践教程,计算机常用办公软件应用/21世纪计算机科学与技术实践型教程...
- slider节点透明背景_【Cocos Creator 实战教程(1)】——人机对战五子棋(节点事件相关)...
- Qt 设置指定列数显示
- 最大素因子(不是题目!自己写着玩的。。。)
- 32 块大小_详解Linux文件系统的完整结构--引导块、超级块、GDT等
- 关于Markdown编辑器添加使用锚点的问题
- 计算机网络8832,2021年4月份自学考试计算机网络原理04741答案.doc
- RMAN-20201: datafile not found in the recovery catalog
- netty 学习 (1)
- matlab plot 折线变曲线
- 计算机毕业设计太难做不出来怎么办?
- 獨立屋裝修/村屋裝修
- 工业交换机与商用交换机的区别有哪些
- 西北乱跑娃 --- python图像基本操作
- WhatsApp发布安卓手表客户端 手表聊天时代来了
- 使用Veritas Volume Replicator(VVR)对Oracle数据库进行容灾
- 用css生成购物车图标,图标字体库(用CSS样式生成搜索、购物车等图标)
- 每一个渴求上进的人,都会在内在世界萌生希望、热情、自信、坚强、勇气、友好和信仰.........
热门文章
- 调度系统批量重跑任务的思考
- Pose Animator:使用实时TensorFlow.js模型的SVG动画工具
- 车载3G Wi-Fi 路由器设备安装雪佛兰
- 除了贴膜,还有更好的方法避免蓝光伤害吗?
- (转)Facebook杯2013年编程挑战赛——预选赛题目及答案
- Connecting to 192.16.0.128:22... Could not connect to '192.16.0.128' (port 22): Connection failed.
- 大专计算机适合女生的专业,大专专业都有哪些?女生学哪些比较好?
- python数据比对怎么做_同事给你迷之Excel数据,4个数据处理案例教你Python数据对比更新...
- Weblogic10.3.6反序列化漏洞补丁(3L3H)升级方案
- UserWarning: This overload of nonzero is deprecated: nonzero(Tensor input, Tensor out) 解决