服务端做高可用,2台IP 地址分别为:
192.168.0.62 192.168.0.63 (都是centos7.3)
使用的安装包版本为:
prometheus-2.16.0-rc.0.linux-amd64.tar.gz
alertmanager-0.20.0.linux-amd64.tar.gz
node_exporter-0.18.1.linux-amd64.tar.gz
grafana-6.2.2.linux-amd64.tar.gz
搭建步骤如下: (都是使用root用户操作)
1 安装prometheus (2个节点操作相同)
tar -xvf prometheus-2.16.0-rc.0.linux-amd64.tar.gz -C /usr/local/
cd /usr/local/
mv prometheus-2.16.0-rc.0.linux-amd64 prometheus
vim /etc/systemd/system/prometheus.service
[Unit]
Description=Prometheus Server
Documentation=https://prometheus.io/docs/introduction/overview/
After=network-online.target
[Service]
Restart=on-failure
ExecStart=/usr/local/prometheus/prometheus --config.file=/usr/local/prometheus/prometheus.yml --storage.tsdb.path=/ps-data/prometheus --web.external-url=http://192.168.0.62:9090 ###IP地址记得变一下
[Install]WantedBy=multi-user.target
systemctl daemon-reload
systemctl start prometheus
systemctl status prometheus
systemctl enable prometheus
2 安装alertmanager (2个节点操作相同)
tar -xvf alertmanager-0.20.0.linux-amd64.tar.gz -C /usr/local/
cd /usr/local/
mv alertmanager-0.20.0.linux-amd64 alertmanager
vim /etc/systemd/system/alertmanager.service
[Unit]
Description=Alertmanager
After=network-online.target
[Service]
Restart=on-failure
ExecStart=/usr/local/alertmanager/alertmanager --config.file=/usr/local/alertmanager/alertmanager.yml
[Install]
WantedBy=multi-user.target
systemctl daemon-reload
systemctl start alertmanager
systemctl status alertmanager
systemctl enable alertmanager
3 安装grafana (2个节点操作相同)
tar xvf grafana-6.2.2.linux-amd64.tar.gz -C /usr/local/
cd /usr/local/
mv grafana-6.2.2 grafana
vim /etc/systemd/system/grafana-server.service
[Unit]
Description=Grafana Server
After=network-online.target
[Service]
Restart=on-failure
ExecStart=/usr/local/grafana/bin/grafana-server -config /usr/local/grafana/conf/defaults.ini -homepath /usr/local/grafana
[Install]
WantedBy=multi-user.target
systemctl daemon-reload
systemctl start grafana-server
systemctl status grafana-server
systemctl enable grafana-server
4 给需要监控的服务器安装 node_exporter
tar xvf node_exporter-0.18.1.linux-amd64.tar.gz -C /usr/local/
cd /usr/local/
mv node_exporter-0.18.1.linux-amd64 node_exporter
vim /etc/systemd/system/node_exporter.service
[Unit]
Description=node_exporter
After=network.target
[Service]
Restart=on-failure
ExecStart=/usr/local/node_exporter/node_exporter
[Install]
WantedBy=multi-user.target
systemctl daemon-reload
systemctl start node_exporter
systemctl status node_exporter
systemctl enable node_exporter
5 配置prometheus 发现 客户端 node_exporter (2个节点操作都是一样)
vi /usr/local/prometheus/prometheus.yml
在文件的最后 添加一个 job_name. (一定要注意缩进,缩进不对,配置文件会一直报错
可以使用 ./promtool check config prometheus.yml 来检查配置文件的格式是否正确)
- job_name: 'node_exporter'
file_sd_configs:
- files:
- 'nodes/host.json'
然后在/usr/local/prometheus 底下创建一个目录
mkdir nodes
vi nodes/host.json
[
{
"targets": [ "192.168.0.12:9100"],
"labels": {
"instance": "192.168.0.12",
"hostname": "testapp_01",
"team": "prometheus"
}
}
]
节点多的话,就在上面例子中的最后一个 '}' 加上 ',' 然后继续添加, prometheus 会自动识别到json文件中的机器,不需要重启prometheus.
这个例子中 "labels"包含了3个 标签: "instance","hostname", "team"
这些标签是为了分组用的,比如后面告警邮件中需要按照不同的项目给不同的负责人发送邮件, "team" 这个标签就有用了,机器属于不同的 "team",告警就可以时间分组发邮件。标签的名字是可以自由命名的。
6 配置告警规则,即发送什么样的告警 (2个节点的操作一样)
配置prometheus 连通alertmanager
vi /usr/local/prometheus/prometheus.yml
alerting:
alertmanagers:
- static_configs:
- targets:
- 192.168.0.62:9093
- 192.168.0.63:9093
# - alertmanager:9093
rule_files:
- "rules/*rules.yml"
配置好后,在/usr/local/prometheus/ 底下创建 rules 文件夹,并创建告警规则文件
mkdir rules
vi test_rules.yml ### 文件必须是以 rules.yml结尾,因为上面的配置的通配是*rules.yml
groups:
- name: node-exporter-prometheus
rules:
- alert: instance-宕机
expr: up{team="prometheus"} == 0
for: 1m
labels:
team: prometheus
annotations:
summary: "instance: {{ $labels.instance }} 宕机了"
description: "instance: {{ $labels.instance }} \n- job: {{ $labels.job }} 关机了, 时间已经1分钟了。"
value: "{{ $value }}"
instance: "{{ $labels.instance }}"- alert: cpu-used-high
expr: (avg by (environment,instance) (irate(node_cpu_seconds_total{team="prometheus",mode="user"}[5m]))) * 100 > 80
for: 1m
labels:
team: prometheus
annotations:
summary: "instance: {{ $labels.instance }} cpu 使用率高于80%"
description: ""
value: "{{ $value }}"
instance: "{{ $labels.instance }}"
这里举了2个例子,其余的监控信息可以通过http://192.168.0.62:9090 监控有的参数写自己需要的告警。
请注意这个告警文件的 两个地方出现的 team 标签:
1 expr 表达式中的team 表示的是,只获取nodes/host.json 文件中带 team: prometheus 的机器的参数
2 labels 中的team 指的是当前告警的标签,这个可以自由定义,下面alertmanager邮件分组中 引用的匹配标签,就是这个标签
7 配置alertmanager (2个节点配置一样)
altermanager 主要配置 发件人,收件人, 邮件发送分组规则等。还可以定义告警邮件的模板(这里就不写了,感兴趣的可以自己研究下)。
cd /usr/local/alertmanager
vi alertmanager.yml
global:
resolve_timeout: 5m
smtp_smarthost: 'smtp.qiye.aliyun.com:465' ## 发送邮件这里要加端口,不能省略,这里举例的是阿里的企业邮箱
smtp_from: 'service@testgroup.net' ## 发送邮箱
smtp_auth_username: 'service@testgroup.net' ## 发送邮箱
smtp_auth_password: '123456' ## 发送邮箱的密码
smtp_require_tls: falseroute:
group_wait: 30s
group_interval: 5m
repeat_interval: 1hreceiver: 'system' ##route 底下的这个接收邮件组,如果不匹配标签,都默认往这个邮件组发送
group_by: ['alertname','team']routes:
- receiver: 'test1' ### 自定义的一个邮件组名
group_wait: 30s
match_re:
team: oracle|prometheus ### 告警规则配置中的 标签,team 等于 oracle 或者 prometheus 的都往这个 test1 收件组发送- receiver: 'test2' ### 自定义的一个邮件组名
group_wait: 30s
match:
team: mysql ### 告警规则配置中的 标签,team 等于 mysql 的都往这个 test1 收件组发送.### 邮件组可以很多,这里就举例2个
receivers:
- name: 'test1'
email_configs:
- to: 'abc123@sina.com,283128104@qq.com'
send_resolved: true ### 这个可以定义告警解决后,是否会发送一封已经解决的邮件,一般都开启- name: 'test2'
email_configs:
- to: 'mysqldba@sina.com,283128104@qq.com'
send_resolved: true- name: 'system' ##默认的邮件接收人,当标签没有匹配的时候都发到这个邮件组
email_configs:
- to: 'yunwei001@sina.com'
send_resolved: trueinhibit_rules:
- source_match:
severity: 'critical'
target_match:
severity: 'warning'
equal: ['alertname', 'dev', 'instance']
8 配置alertmanager 集群,2个alertmanager 只发送一个告警。
这个高可用的prometheus 集群的原理很简单。
因为监控的主要目的是告警,架构如下图所示, 服务端 读2次 数据,因为数据都是一样的,只是分别读2次,不用担心grafana 显示的情况不同,
62 和 63 显示的数据必然是相同的,如果不放心,可以给grafana 换一个mysql 数据库,然后 配置指向同一个数据库,这样就不用担心了。
只要告警alertmanager 做了集群,相同的告警触发只发送1次,那么我们这个架构就是高可用的集群了。3个组建 prometheus , grafana, alertmaneger 不管哪个挂了,都不会使这个告警系统不能使用。
修改 :
1 2个节点的 /etc/systemd/system/prometheus.service 的 启动脚本 ExecStart 中 添加 --web.enable-lifecycle
2 2台节点的 prometheus.yml 中 alertmanagers关联,两个都要写,这个如果在上面已经配置了,可以忽略该步骤
alerting:
alertmanagers:
- static_configs:
- targets:
- '192.168.0.62:9093'
- '192.168.0.63:9093'
3 修改 alertmanager启动脚本 ,将模式改成 cluster 模式 (分别为62和 63节点的配置)
ExecStart=/usr/local/alertmanager/alertmanager --web.external-url=http://192.168.0.62:9093 --cluster.listen-address=0.0.0.0:9094 --cluster.peer=192.168.0.63:9094 --config.file=/usr/local/alertmanager/alertmanager.yml
ExecStart=/usr/local/alertmanager/alertmanager --web.external-url=http://192.168.0.63:9093 --cluster.listen-address=0.0.0.0:9094 --cluster.peer=192.168.0.62:9094 --config.file=/usr/local/alertmanager/alertmanager.yml
4 重启prometheus, alertmanager, 2台都要。 登录http://192.168.0.63:9093 查看 status ,Cluster Status 显示 redy ,就表示alertmanager集群配 置成功了,集群端口这里为9094
到这里,prometheus集群的配置基本就完成了。 下面介绍一些额外的一些功能配置。
1 grafana 将原本的数据库替换成mysql, 并且mysql 为主从模式
mysql 的主从搭建这里就不讲了。 grafana 这里配置指向 mysql 的主节点。
vi /usr/local/grafana/conf/defaults.ini
type = mysql ;数据库类型,肯定填mysql
host = 192.168.0.65 ;数据IP
name = grafana_db ;数据库名称
user = grafana_user ;数据库用户名
# If the password contains # or ; you have to wrap it with triple quotes. Ex """#password;"""
password = Passwd ;数据库用户密码
两台的配置都一样,都指向mysql的主节点 192.168.0.65
重启下 grafana。
2 grafana 配置用户分组,各自的分组只能看到自己组的监控
首先在server Admin (盾牌图标) 中,选择 Orgs --> New org , 创建一个新的 org.
然后创建用户 new_user01,分配给 viewer 的角色.
点击左下角,switch 到新创建的 org
添加 source ,导入模板。
打开模板显示界面
打开
修改
将name=~"$instance" 替换成 自己的host.json 文件中的标签, 比如 team="prometheus" ,保存。
这样new_user01 就只能查看到 标签为 prometheus 的机器的监控了。