写点什么

Prometheus 实战 - 从 0 构建高可用监控平台(一)

  • 2023-04-25
    广东
  • 本文字数:8498 字

    阅读完需:约 28 分钟

Prometheus实战-从0构建高可用监控平台(一)

当今的互联网应用系统越来越复杂,其中涉及的组件和服务越来越多,需要进行高效、可靠的监控,以保证系统的稳定性和性能。Prometheus 是一款功能强大的开源监控系统,可以实时监控多个维度的指标数据,并支持强大的查询语言和告警机制,是目前广泛使用的云原生应用监控系统之一。


本文档合集《Prometheus 实战:从 0 构建高可用监控平台》将从零开始,手把手教您如何构建一套高可用的 Prometheus 监控平台,涵盖了以下内容:


  1. Prometheus 集群搭建:实现高可用和可扩展的监控系统

  2. 动态监控指标:自动发现和注册要监控的目标

  3. 告警机制配置:灵活配置告警规则、分组、过滤、抑制,实时通知异常情况

  4. Grafana 可视化展示:直观了解系统运行状态和趋势


本文档合集的目标读者是具有一定 Linux 系统和网络知识的系统管理员和 DevOps 工程师。通过本文档合集的学习,您将掌握 Prometheus 的核心概念和实践技巧,能够快速搭建一套高效、可靠的监控平台,帮助您更好地管理和维护复杂的互联网应用系统。


本文是以下内容是基于 Thanos 安装一个高可用和可扩展的 Prometheus 集群。

环境

后面几篇文档都在改环境下生成。

主机系统和软件(服务)

// 主机信息10.2.0.6  Q-gz-common-prod-thanos-001 node-110.2.0.10 Q-gz-common-prod-thanos-002 node-210.2.0.41 Q-gz-common-prod-thanos-003 node-3
// 系统版本CentOS Linux release 7.9.2009 (Core)
// 软件和服务ConsulConsulManagerDockerPrometheusAlertmanagerPrometheusAlertMySQLThanosHaproxyKeepalivedLsyncdGrafanaCos运维脚本
复制代码

部署规划

// 各模块规划
node-1 部署的服务: Consul , Grafana, Lsyncd, Keepalived, Haproxy, Thanos, ConsulManager, Docker
node-2 部署的服务: Consul , Prometheus, Alertmanager,PrometheusAlert, Lsyncd, Keepalived, Haproxy, Thanos
node-3 部署的服务: Consul , Prometheus, Alertmanager, PrometheusAlert, MySQL, Thanos
复制代码

调用拓扑


部署 Consul 集群

Consul 是一种分布式服务发现和配置管理工具,可以用于管理各种服务的注册、发现和配置。它提供了一种简单而强大的方法来发现和管理服务,并帮助确保服务实例始终保持可用状态。Consul 还提供了健康检查、故障转移和分布式一致性等功能,可以帮助应用程序自动化地管理自己的服务实例。


node1, node2, node3


yum install -y yum-utilsyum-config-manager --add-repo https://rpm.releases.hashicorp.com/RHEL/hashicorp.repoyum install consul consul-template -y
mkdir -p /data/consul/{config,data,log} && chown -R consul.consul /data/consul
复制代码


log_rotate_max_files:指定要保留的旧日志文件存档的最大数量。默认为 0(不会删除任何文件)。设置为 -1 以在创建新日志文件时丢弃旧日志文件。


log_rotate_duration:指定日志在需要轮换之前应写入的最大持续时间。必须是持续时间值,例如 30s。默认为 24 小时。


log_file:将所有 Consul 代理日志消息写入文件。此值用作日志文件名的前缀。当前时间戳附加到文件名。如果值以路径分隔符结尾,consul- 则将附加到该值。如果文件名缺少扩展名,.log 则附加。例如,设置 log-file 为/var/log/将导致日志文件路径为/var/log/consul-{timestamp}.log. log-file 可以-log-rotate-bytes (opens new window)与-log-rotate-duration (opens new window)结合使用 , 以获得细粒度的日志轮换体验。


retry_join:指定将要置入集群的 IP 列表,如果失败,会自动重试,知道直到成功加入。


node1


[root@Q-gz-common-prod-thanos-001 ~]# consul keygenxxxxx=
复制代码


cat > /usr/lib/systemd/system/consul.service << EOF# Consul systemd service unit file[Unit]Description=Consul Service Discovery AgentDocumentation=https://www.consul.io/After=network-online.targetWants=network-online.target
[Service]Type=simpleUser=consulGroup=consulExecStart=/usr/bin/consul agent \ -node=node-1 \ -config-dir=/data/consul/configExecReload=/bin/kill -HUP $MAINPIDKillMode=processKillSignal=SIGTERMRestart=on-failureLimitNOFILE=10240LimitNPROC=10240
[Install]WantedBy=multi-user.targetEOF

cat > /data/consul/config/config.json <<EOF{ "advertise_addr": "10.2.0.6", "bind_addr": "10.2.0.6", "bootstrap_expect": 3, "client_addr": "0.0.0.0", "datacenter": "guangzhou", "data_dir": "/data/consul/data", "domain": "consul", "enable_script_checks": true, "dns_config": { "enable_truncate": true, "only_passing": true }, "log_json": true, "log_level": "error", "log_rotate_max_files": 10, "log_rotate_duration": "24h", "log_file": "/data/consul/log/", "encrypt": "xxxxx=", "leave_on_terminate": true, "rejoin_after_leave": true, "retry_join": [ "node-1", "node-2", "node-3" ], "server": true, "start_join": [ "node-1", "node-2", "node-3" ], "acl": { "enabled": true, "default_policy": "deny", "enable_token_persistence": true }, "ui_config": { "enabled": true }}EOF
systemctl enable consulsystemctl start consul
复制代码


node-2


cat > /usr/lib/systemd/system/consul.service << EOF# Consul systemd service unit file[Unit]Description=Consul Service Discovery AgentDocumentation=https://www.consul.io/After=network-online.targetWants=network-online.target
[Service]Type=simpleUser=consulGroup=consulExecStart=/usr/bin/consul agent \ -node=node-2 \ -config-dir=/data/consul/configExecReload=/bin/kill -HUP $MAINPIDKillMode=processKillSignal=SIGTERMRestart=on-failureLimitNOFILE=10240LimitNPROC=10240
[Install]WantedBy=multi-user.targetEOF
cat > /data/consul/config/config.json <<EOF{ "advertise_addr": "10.2.0.10", "bind_addr": "10.2.0.10", "bootstrap_expect": 3, "client_addr": "0.0.0.0", "datacenter": "guangzhou", "data_dir": "/data/consul/data", "domain": "consul", "enable_script_checks": true, "dns_config": { "enable_truncate": true, "only_passing": true }, "log_json": true, "log_level": "error", "log_rotate_max_files": 10, "log_rotate_duration": "24h", "log_file": "/data/consul/log/", "encrypt": "xxxxx=", "leave_on_terminate": true, "rejoin_after_leave": true, "retry_join": [ "node-1", "node-2", "node-3" ], "server": true, "start_join": [ "node-1", "node-2", "node-3" ], "acl": { "enabled": true, "default_policy": "deny", "enable_token_persistence": true }, "ui_config": { "enabled": true }}EOF
systemctl enable consulsystemctl start consul
复制代码

查看 login token

后面 Prometheus 做动态发现的时候需要。


[root@Q-gz-common-prod-thanos-001 ~]# consul acl bootstrapAccessorID:       6708400c-3a06-62af-6bd7-fae9b1fd9235SecretID:         63961456-9521-xxxx-bfd8-8a386162bb81Description:      Bootstrap Token (Global Management)Local:            falseCreate Time:      2022-08-14 17:00:52.323737575 +0800 CSTPolicies:   00000000-0000-0000-0000-000000000001 - global-management
复制代码

ConsulManager

ConsulManager 是一个工具,它可以帮助管理 Consul 集群的配置和状态。ConsulManager 可以让你轻松地管理 Consul 集群的各个方面,包括服务发现、健康检查、KV 存储、DNS、ACL 等等。


node1 节点


mkdir /usr/local/consulmanager/cd /usr/local/consulmanager/wget https://starsl.cn/static/img/docker-compose.yml
复制代码


编辑:docker-compose.yml,修改3个环境变量:consul_token:consul的登录token(如何获取?)consul_url:consul的URL(http开头,/v1要保留)admin_passwd:登录ConsulManager Web的admin密码
[root@Q-gz-common-prod-thanos-001 consulmanager]# cat docker-compose.ymlversion: "3.2"services: flask-consul: image: registry.cn-shenzhen.aliyuncs.com/starsl/flask-consul:latest container_name: flask-consul hostname: flask-consul restart: always volumes: - /usr/share/zoneinfo/PRC:/etc/localtime environment: consul_token: 63961456-9521-xxxx-bfd8-8a386162bb81 consul_url: http://10.2.0.6:8500/v1 admin_passwd: xxxx nginx-consul: image: registry.cn-shenzhen.aliyuncs.com/starsl/nginx-consul:latest container_name: nginx-consul hostname: nginx-consul restart: always ports: - "1026:1026" volumes: - /usr/share/zoneinfo/PRC:/etc/localtime
复制代码


启动:docker-compose pull && docker-compose up -d
复制代码


访问:http://{IP}:1026,使用配置的ConsulManager admin密码登录
复制代码

部署 Thanos

Thanos :可以帮我们简化分布式 Prometheus 的部署与管理,并提供了一些的高级特性︰全局视图,长期存储,高可用,该架构使用 grpc 保持各个组件的通讯,sidecar 组件负责连接 Prometheus,将其数据提供给 Thanos Query 查询,并且/或者将其上传到对象存储,以供长期存储。


每个集群都对应了一个唯一的租户 ID,可以通过租户标签区分不同集群的指标数据;如果某个租户创建了新的集群,只需在新集群中部署 Prometheus 并配置远程写入;


由于 Prometheus 远程读取改进,强烈建议使用 Prometheus v2.13+。


// 在三个节点都执行如下的操作
cd /usr/local/src/wget https://github.com/thanos-io/thanos/releases/download/v0.27.0/thanos-0.27.0.linux-amd64.tar.gztar xf thanos-0.27.0.linux-amd64.tar.gz -C /usr/local/ln -sv /usr/local/thanos-0.27.0.linux-amd64 /usr/local/thanos
echo "PATH=\$PATH:/usr/local/thanos" > /etc/profile.d/thanos.sh source /etc/profile
groupadd -r thanosuseradd -r -g thanos -s /sbin/nologin -c "thanos Daemons" thanos

mkdir -p /usr/local/thanos/{store,query,receive,compact}mkdir -p /data/thanos/{store,query,receive,compact}
chown -R thanos. /data/thanoschown -R thanos. /usr/local/thanos-0.27.0.linux-amd64
复制代码

各组件介绍和管理

cos 桶配置

Thanos 可以使用对象存储服务(如 COS 桶)来存储 Prometheus 数据和 Thanos 组件生成的元数据,以实现高可用和长期存储。使用 COS 桶作为数据存储,可以实现以下功能:


长期存储:将 Prometheus 数据存储到 COS 桶中,可以实现对数据的长期存储,以便于未来的查询和分析。


可扩展性:COS 桶可以存储大量的数据,并且可以根据需要动态扩展存储容量,以应对不断增长的数据需求。


数据备份:将 Prometheus 数据备份到 COS 桶中,可以保证数据的可靠性和安全性,防止因数据丢失或故障导致的业务损失。


高可用性:使用多个 COS 桶作为 Thanos 存储后端,可以实现数据的多副本备份和冗余存储,以提高数据的可用性和容错能力。


cat > /usr/local/thanos/cos_bucket.yaml <<EOFtype: COSconfig:  bucket: "prod-thanos-1001060"  region: "ap-guangzhou"  app_id: ""  endpoint: "https://prod-thanos-1001060.cos.ap-guangzhou.myqcloud.com"  secret_key: "xxxxxkey"  secret_id: "xxxxxscr"  http_config:    idle_conn_timeout: 1m30s    response_header_timeout: 2m    insecure_skip_verify: false    tls_handshake_timeout: 10s    expect_continue_timeout: 1s    max_idle_conns: 100    max_idle_conns_per_host: 100    max_conns_per_host: 0    tls_config:      ca_file: ""      cert_file: ""      key_file: ""      server_name: ""      insecure_skip_verify: false    disable_compression: falseprefix: ""EOF
复制代码


node-3


cat > /usr/lib/systemd/system/consul.service << EOF# Consul systemd service unit file[Unit]Description=Consul Service Discovery AgentDocumentation=https://www.consul.io/After=network-online.targetWants=network-online.target
[Service]Type=simpleUser=consulGroup=consulExecStart=/usr/bin/consul agent \ -node=node-3 \ -config-dir=/data/consul/configExecReload=/bin/kill -HUP $MAINPIDKillMode=processKillSignal=SIGTERMRestart=on-failureLimitNOFILE=10240LimitNPROC=10240
[Install]WantedBy=multi-user.targetEOF
cat > /data/consul/config/config.json <<EOF{ "advertise_addr": "10.2.0.41", "bind_addr": "10.2.0.41", "bootstrap_expect": 3, "client_addr": "0.0.0.0", "datacenter": "guangzhou", "data_dir": "/data/consul/data", "domain": "consul", "enable_script_checks": true, "dns_config": { "enable_truncate": true, "only_passing": true }, "log_json": true, "log_level": "error", "log_rotate_max_files": 10, "log_rotate_duration": "24h", "log_file": "/data/consul/log/", "encrypt": "xxxxx=", "leave_on_terminate": true, "rejoin_after_leave": true, "retry_join": [ "node-1", "node-2", "node-3" ], "server": true, "start_join": [ "node-1", "node-2", "node-3" ], "acl": { "enabled": true, "default_policy": "deny", "enable_token_persistence": true }, "ui_config": { "enabled": true }}EOF
systemctl enable consulsystemctl start consul
复制代码

Store 配置

Store:是一个 Thanos 的代理,通过 gRPC 连接到 Prometheus 服务,并提供了长期存储和全局查询的能力。


node1 和 node2


cat > /etc/systemd/system/thanos-store.service <<EOF[Unit]Description=thanos-storeDocumentation=https://thanos.io/After=network.target[Service]Type=simpleUser=thanosExecStart=/usr/local/thanos/thanos store \          --data-dir=/data/thanos/store \          --objstore.config-file=/usr/local/thanos/cos_bucket.yaml \          --http-address         0.0.0.0:10906 \          --grpc-address         0.0.0.0:10905ExecReload=/bin/kill -HUPTimeoutStopSec=20sRestart=on-failureLimitNOFILE=10240LimitNPROC=10240LimitCORE=infinity[Install]WantedBy=multi-user.targetEOF
复制代码


systemctl daemon-reloadsystemctl start thanos-storesystemctl enable thanos-store
复制代码

Receive 配置

Receive:接收来自 Prometheus 服务器的数据,并将其写入长期存储中。


node1 , node2 , node3


mkdir /usr/local/thanos/receive/fbcat > /usr/local/thanos/receive/fb/hashring.json <<EOF[  {    "hashring": "fanbook",    "endpoints": [      "10.2.0.6:10907",      "10.2.0.10:10907",      "10.2.0.41:10907"    ],    "tenants": ["fb"]  }]EOF
复制代码


cat > /etc/systemd/system/thanos-receive.service <<EOF[Unit]Description=thanos-receiveDocumentation=https://thanos.io/After=network.target[Service]Type=simpleExecStart=/usr/local/thanos/thanos receive \          --tsdb.path=/data/thanos/receiver \          --tsdb.retention=7d \          --grpc-address 0.0.0.0:10907 \          --remote-write.address 0.0.0.0:10908 \          --http-address 0.0.0.0:10909 \          --receive.local-endpoint 10.2.0.6:10907 \          --receive.replication-factor 3 \          --receive.hashrings-file=/usr/local/thanos/receive/fb/hashring.json \          --objstore.config-file=/usr/local/thanos/cos_bucket.yaml \          --label=replica="fb"  ExecReload=/bin/kill -HUPTimeoutStopSec=20sRestart=alwaysKillMode=processKillSignal=SIGTERMLimitNOFILE=655350LimitNPROC=655350LimitCORE=infinity[Install]WantedBy=multi-user.targetEOF
systemctl daemon-reloadsystemctl start thanos-receivesystemctl enable thanos-receive
复制代码

Query 配置

Query:提供了一个聚合多个 Prometheus 数据源的高可用查询界面。用户可以在单个查询中跨多个集群或实例执行查询,可以使用标准的 Prometheus PromQL 或 Thanos 扩展的 PromQL。


node1


为了方便 Query 节点动态添加,我们这边使用了 consul 的 service, 并用模版文件生成动态发现文件。具体如下。


[root@Q-gz-common-prod-thanos-001 thanos]# pwd/usr/local/thanos[root@Q-gz-common-prod-thanos-001 thanos]# lscompact  consul_token.yaml  cos_bucket.yaml  query  receive  sd.sh  store  thanos  thanos-sd-file.tpl  thanos-sd-file.yaml[root@Q-gz-common-prod-thanos-001 thanos]# cat thanos-sd-file.tpl- targets:  {{ range service "thanos-query" -}}  - {{ .Address }}:{{ .Port }}  {{ end -}}
复制代码


然后用 consul-template 从 consul 的 service 读取并生成文件。


consul-template -consul-token-file=consul_token.yaml -consul-addr 127.0.0.1:8500 -template "/usr/local/thanos/thanos-sd-file.tpl:/usr/local/thanos/thanos-sd-file.yaml:echo ok" -once


cat > /etc/systemd/system/thanos-query.service <<EOF[Unit]Description=thanos-queryDocumentation=https://thanos.io/After=network.target[Service]Type=simpleExecStart=/usr/local/thanos/thanos query \          --http-address 0.0.0.0:10903 \          --grpc-address 0.0.0.0:10904 \          --store.sd-files=/usr/local/thanos/thanos-sd-file.yaml \          --query.replica-label=replica \          --log.level=info \          --query.timeout=15m ExecReload=/bin/kill -HUP TimeoutStopSec=20sRestart=alwaysLimitNOFILE=10240LimitNPROC=10240LimitCORE=infinity[Install]WantedBy=multi-user.targetEOF
systemctl daemon-reloadsystemctl enable thanos-querysystemctl start thanos-query
复制代码

Compact 配置

Compact:负责在长期存储中执行压缩和降采样操作,以减少存储空间和查询时间。


注意:压缩器必须作为单例运行,并且不能在手动修改存储桶中的数据时运行--wait 让 Compact 一直运行,轮询新数据来做压缩和降采样。--retention.resolution-raw 指定原始数据存放时长,--retention.resolution-5m 指定降采样到数据点 5 分钟间隔的数据存放时长,--retention.resolution-1h 指定降采样到数据点 1 小时间隔的数据存放时长,它们的数据精细程度递减,占用的存储空间也是递减,通常建议它们的存放时间递增配置 (一般只有比较新的数据才会放大看,久远的数据通常只会使用大时间范围查询来看个大致,所以建议将精细程度低的数据存放更长时间)


node3


cat > /etc/systemd/system/thanos-compact.service <<EOF[Unit]Description=thanos-compactDocumentation=https://thanos.io/After=network.target[Service]Type=simpleExecStart=/usr/local/thanos/thanos compact \          --data-dir=/data/thanos/compact \          --objstore.config-file=/usr/local/thanos/cos_bucket.yaml \          --http-address 0.0.0.0:19193 \          --debug.accept-malformed-index \          --retention.resolution-raw=90d \          --retention.resolution-5m=180d \          --retention.resolution-1h=360d \          --log.level=info \          --waitExecReload=/bin/kill -HUP TimeoutStopSec=20sRestart=alwaysLimitNOFILE=10240LimitNPROC=10240LimitCORE=infinity[Install]WantedBy=multi-user.targetEOF
systemctl daemon-reloadsystemctl start thanos-compactsystemctl enable thanos-compact
复制代码


发布于: 2023-04-25阅读数: 22
用户头像

还未添加个人签名 2018-12-12 加入

还未添加个人简介

评论

发布
暂无评论
Prometheus实战-从0构建高可用监控平台(一)_Prometheus_小毛驴的烂笔头_InfoQ写作社区