针对公司全国省份的2000台服务器部署监控系统
背景描述
公司现在在31省(不包括港澳台)都有搭建一个Hadoop的集群,目前是通过分开的Ambari管理的,也就是说,运维人员每天会登录到所有Ambari上面去查看,总共有2000多台物理服务器,每天的工作量还是比较庞大。
31省的集群分别做各省的原始数据处理,称作前置集群,数据会最终通过数据同步工具同步到一个核心集群,核心集群做进一步的数据清洗和前端呈现。
监控需求
针对现有的场景,我想在不影响现有服务器的前提下去完成部分硬件指标的监控(比如磁盘、内存、CPU),同时完成初步的前端的可视化工作,由于之前接触过Prometheus和Grafana,我决定使用这种方式去做。
整体规划
服务器需求
针对我们的环境,如果只使用一个Prometheus服务器的话,我不确定是否会产生性能瓶颈,因为能同时与核心节点及前置节点通网的服务器本身还有数据共享的职责,不能影响到数据共享,所以考虑将监控数据拉取和存储的压力分担一下,大概这样去分配:
总共使用11台Prometheus服务器,其中有10台服务器分别拉取各自负责的省份的数据,平均下来每台监控的服务器数量大概在200-250台,还有一台作为汇聚节点,将10台分管服务器的数据汇聚起来(也就是Prometheus推荐的联邦机制),统一和Grafana做对接,Grafana的服务器是额外的一台。
服务器众多,采用Ansible进行批量安装和服务启动、验证,因此还要准备一台安装了Ansible的服务器,我这边日常运维已经有一台Ansible机器了,就不需要多费功夫去准备。
软件列表
- Prometheus 2.20.1
- Grafana 7.3.6(自己做了汉化和一些修改)
- NodeExporter 1.0.0
- Ansible 2.10.5
- Python 3.7.7
安装包直接都可以从官网下载即可,个人建议Prometheus还是尽量用最新的稳定版,不要用太老的版本。
部署过程
Ansible安装NodeExporter并启动
首先是要做批量部署,前置的服务器都是Centos7的操作系统,倒是省了启动脚本,注册系统服务也容易的多,因此直接一个playbook搞定:
---
- hosts: P420000 #服务器组
remote_user: root #我有全部的root权限,就直接root了,最好使用其他用户
tasks:
- name: Check hostname
shell: "hostname"
- name: Copy the node_exporter file
copy: 'src=/etc/ansible/qzj_jk_file/node_exporter dest=/usr/local/ mode=0755'
- name: Check distribution
shell: "ls -l /usr/local/node_exporter/node_exporter"
- name: Copy the start script
copy: 'src=/etc/ansible/qzj_jk_file/script/node_exporter.service dest=/etc/systemd/system/ mode=0755'
- name: Check script
shell: "ls -l /etc/systemd/system/node_exporter.service"
- name: Set boot up
shell: "systemctl enable node_exporter"
- name: Start node_exporter
shell: "systemctl start node_exporter"
- name: Check node_exporter status
shell: "ss -alntup | grep -i 9100"
如果是Centos6的操作系统的话,就要麻烦一些,我这里也部署过,要单独写一个启动脚本:
#!/bin/bash
#
# /etc/rc.d/init.d/node_exporter
#
# chkconfig: 2345 80 80
#
# config: /etc/prometheus/node_exporter.conf
# pidfile: /var/run/prometheus/node_exporter.pid
# Source function library.
. /etc/init.d/functions
RETVAL=0
PROG="node_exporter"
DAEMON_SYSCONFIG=/etc/sysconfig/${PROG}
DAEMON=/usr/bin/${PROG} #要把安装目录下/opt/node_exporter/node_exporter可执行文件拷贝到/usr/bin目录下
PID_FILE=/var/run/prometheus/${PROG}.pid
LOCK_FILE=/var/lock/subsys/${PROG}
LOG_FILE=/var/log/node_exporter.log
DAEMON_USER="root"
FQDN=$(hostname)
GOMAXPROCS=$(grep -c ^processor /proc/cpuinfo)
. ${DAEMON_SYSCONFIG}
start() {
if check_status > /dev/null; then
echo "node_exporter is already running"
exit 0
fi
echo -n $"Starting node_exporter: "
daemonize -u ${DAEMON_USER} -p ${PID_FILE} -l ${LOCK_FILE} -a -e ${LOG_FILE} -o ${LOG_FILE} ${DAEMON} ${ARGS}
RETVAL=$?
echo ""
return $RETVAL
}
stop() {
echo -n $"Stopping node_exporter: "
killproc -p ${PID_FILE} -d 10 ${DAEMON}
RETVAL=$?
echo
[ $RETVAL = 0 ] && rm -f ${LOCK_FILE} ${PID_FILE}
return $RETVAL
}
check_status() {
status -p ${PID_FILE} ${DAEMON}
RETVAL=$?
return $RETVAL
}
case "$1" in
start)
start
;;
stop)
stop
;;
status)
check_status
;;
reload|force-reload)
reload
;;
restart)
stop
start
;;
*)
N=/etc/init.d/${NAME}
echo "Usage: $N {start|stop|status|restart|force-reload}" >&2
RETVAL=2
;;
esac
exit ${RETVAL}
同时要额外安装一下daemonize软件包,对应的playbook如下,这是我之前部署我们集群webgis服务器的NodeExporter时用的,验证过的:
---
#该playbook适用于Centos6系统,请知悉
- hosts: webgis
tasks:
- name: "拷贝node_exporter到远端服务器"
copy: 'src=/etc/ansible/qzj_jk_file/node_exporter dest=/usr/local/ mode=0755'
- name: "创建/usr/bin下的软链接"
shell: 'ln -s /usr/local/node_exporter/node_exporter /usr/bin/node_exporter'
- name: "拷贝启停脚本"
copy: 'src=/etc/ansible/qzj_jk_file/script/node_exporter dest=/etc/init.d/ mode=0755'
- name: "创建/etc/sysconfig/node_exporter"
shell: 'touch /etc/sysconfig/node_exporter'
- name: "拷贝daemonize安装包"
copy: 'src=/etc/ansible/daemonize-1.6.0-1.el6.rf.x86_64.rpm dest=/root/ mode=0755'
- name: "安装daemonize"
shell: 'rpm -ivh /root/daemonize-1.6.0-1.el6.rf.x86_64.rpm'
- name: "创建所需目录/var/run/prometheus"
shell: 'mkdir /var/run/prometheus'
- name: "创建pid文件"
shell: 'touch /var/run/prometheus/node_exporter.pid'
- name: "启动node_exporter服务"
service: 'name=node_exporter state=started'
Ansible安装Prometheus
playbook和上一步的基本一致,没什么好说的,不过启动的时候,最好加上两个参数
--web.enable-lifecycle #允许reload配置
--web.enable-admin-api #开启对admin api的访问权限
--storage.tsdb.path="/data1/prometheus_data" #指定数据的存储路径,我是放在大磁盘上的,防止根目录占用太多
#完整启动命令如下
prometheus --web.enable-lifecycle --web.enable-admin-api --storage.tsdb.path="/data1/prometheus_data"
配置Prometheus对NodeExporter监控
进行这一部的时候,先确保一下NodeExporter都已经启动,不然配上了也监控不到,这里的配置方式比较多样了,我没研究过服务发现的方式,所以采用的是file_sd_configs的方式,prometheus.yml中的配置块如下:
- job_name: '湖北前置'
file_sd_configs:
- refresh_interval: 1m
files:
- ./conf.d/420000.json
420000.json就是各省份的列表,大概格式如下:
[
{
"targets": [
XXX.XXX.XXX.XXX:9090,
...
XXX.XXX.XXX.XXX:9090
]
}
]
依次配置一下各省份的对应的IP到对应的Prometheus,然后启动Prometheus即可,如果已经启动,可以直接调用reload的接口进行配置更新:
curl -X POST http://XXX.XXX.XXX.XXX:9090/-/reload
如果一切正常,应该可以直接在prometheus的采集节点看到对应省份的NodeExporter采集状态了,我这里有几台服务器停机报修了,所以会看到*和湖北有红色的,是正常现象。
配置Prometheus汇聚节点
汇聚节点的Prometheus只需要去配置上一个步骤的10台Prometheus的IP即可,直接贴配置文件了:
- job_name: 'federate'
honor_labels: true
metrics_path: '/federate'
params:
'match[]':
- '{job="prometheus"}'
- '{__name__=~"job:.*"}'
#这里匹配包含前置和省际网络的job
- '{job=~".*前置.*"}'
- '{job=~"省际网络.*"}'
static_configs:
- targets:
- '10.XX.XX.XXX:9090'
......
- '10.XX.XX.XXX:9090'
修改完成后,reload一下即可,对应的联邦相关的东西可以直接看官方文档,不复杂:
官方文档: Prometheus联邦
到这一步,监控的原始数据就已经拿到了,开发也可以直接在这里开始自己对原始数据做处理,然后实现可视化。
安装Grafana
这里我的Grafana是自己二次修改以后的,正常情况下直接自己去官网下载RPM包然后安装就可以。
rpm -ivh grafana-7.3.6-1612536270.x86_64.rpm
#安装以后直接启动服务
service grafana-server start
最终效果
Grafana中的图表按照自己的需要做配置就好,如果有条件肯定还是自己公司的研发做定制化的可视化开发最好,