有一次在一家国企时,他们是使用的docker+nginx做为自己的“云”。同时,监控告警平台也不完善,虽然使用的是Prometheus+Grafana,但仅仅是用来“看大屏”。
同时所有的报警都是一个一个的脚本去写的,例如写一个python脚本去查询ES、查询MySQL,达到阈值调用一下钉钉webhook。并且散落在各台服务器上面。导致一人离职,其余人都不知道告警从哪里发出,整体瘫痪。
就,有种宝马车轱辘安装在奶奶家的二八大杠上面的感觉。
概览:
Prometheus是 基于 Go 语言开发,是一套开源的系统监控报警框架,能轻松支持上万台规模的集群。
度量名
和 键值对
组成的时间序列PromQL(Prometheus Queue language)
查询语言,结合数据标签实现数据的聚合、切割、切片等功能本文内容便是介绍如何解决以上缺点。
Thanos 是一个「开源的,高可用的 Prometheus 系统,具有长期存储能力」。很多知名公司都在使用 Thanos,也是 CNCF 孵化项目的一部分。
Thanos 的一个主要特点就是通过使用对象存储(比如 S3)可以允许 “无限” 存储空间。对象存储可以是每个云提供商提供的对象存储也可以是 ceph、rook 或 minio 这样的解决方案。
讲的通俗一点,Thanos能够将Prometheus采集的数据进行汇总、去重。
Thanos 存储充当一个网关,将查询转换为远程对象存储。它还可以在本地存储上缓存一些信息。基本上,这个组件允许你查询对象存储以获取指标。这个组件充当 Thanos 查询的存储。
将对象存储中的数据进行压缩和降低采样率,加速大时间区间监控数据查询的速度。
连接 Prometheus,将其数据提供给 Thanos Query 查询,并且/或者将其上传到对象存储,以供长期存储。
架构如下:
Thanos Query(查询)是 Thanos 的主要组件,它是向其发送 PromQL 查询的中心点。Thanos 查询暴露了一个与 Prometheus 兼容的端点。然后它将查询分派给所有的 “stores”。记住,Store 可能是任何其他提供指标的 Thanos 组件。Thanos 查询可以发送查询到另一个 Thanos 查询(他们可以堆叠)。
Grafana是一个开源的度量分析、监控可视化解决方案,支持很多种时序数据库,如graphite、InfluxDB、Prometheus、Elasticsearch等。
首先准备两台服务器,没太服务器上需要部署的环境如下:
服务器IP | 共同角色 | 单独角色 |
---|---|---|
10.0.1.35 | prometheus1,sidecar1,store1,query1,alertmanager1, | grafana,compact,dingtalk |
10.0.1.36 | prometheus2,sidecar2,store2,query2,alertmanager2 |
为了更便捷部署,已经将两份docker-compose文件放置于文末,分别在两台机器上执行即可。
主要修改位置如下:
#将文件中所有的ip替换成自己的服务器节点ip,例如:
command:
- --config.file=/alertmanager/alertmanager.yaml
- --storage.path=/alertmanager
- --web.external-url=http://10.0.1.36:9093
- --cluster.listen-address=0.0.0.0:9094
- --cluster.advertise-address=10.0.1.36:9094
- --cluster.peer=10.0.1.35:9094
#配置文件中所有的磁盘挂载,将/u01 改成自己的目录即可。
volumes:
- /u01/prometheus:/prometheus
# 修改thanos_store 的存储位置
# 我个人使用的是金山云存储。
#若没有线上存储库,可自行搭建minio存储即可。
config:
bucket: monitor-data
region: BEIJING
endpoint: xxx
access_key: xxx
secret_key: xxx
insecure: true
signature_version2: true
若没有线上存储桶,两台机器中单独找一台进行搭建即可(存储空间更大的那台)
创建成功后,将自己的存储桶endpoint、access_key、secret_key 替换docker-compose文件即可。
mkdir /data/domain_exporter/ -p
cat > /data/domain_exporter/start.sh << 'EOF'
docker run -d \
--name domain_exporter \
--restart=always \
-p 9222:9222 \
-v /etc/localtime:/etc/localtime:ro \
caarlos0/domain_exporter:v1
EOF
bash /data/domain_exporter/start.sh
http://47.92.133.104:9001
帐号 : admin
密码 : admin123456
docker-compose 文件中将dingtalk搭建已经注释掉了,若需要使用dingtalk组件发送告警信息,可去掉注释。
在服务器中分别执行文末的docker-compose文件
version: '2'
services:
#####################################
# prometheus 1 on host 1
#####################################
prometheus:
image: prom/prometheus:v2.45.0
container_name: prometheus
network_mode: host
restart: always
# ports:
# - "9090:9090"
volumes:
- /u01/prometheus:/prometheus
command:
- --config.file=/prometheus/prometheus.yaml
- --storage.tsdb.path=/prometheus/data
- --storage.tsdb.retention.time=30d
- --storage.tsdb.min-block-duration=2h
- --storage.tsdb.max-block-duration=2h
- --storage.tsdb.no-lockfile
- --web.listen-address=0.0.0.0:9090
- --web.read-timeout=1m
- --web.enable-admin-api
- --web.max-connections=10
- --query.max-concurrency=20
- --query.timeout=2m
- --web.enable-lifecycle
- --log.level=info
- --web.external-url=http://inside-prometheus.01zhuanche.com
# - --web.console.libraries=/usr/share/prometheus/console_libraries
# - --web.console.templates=/usr/share/prometheus/consoles
#####################################
# thanos sidecar 1 on host 1
#####################################
thanos_sidecar:
image: thanosio/thanos:v0.32.5
container_name: thanos_sidecar
network_mode: host
restart: always
user: nobody
volumes:
- /u01/prometheus:/prometheus
environment:
- REPLICA=A
command:
- sidecar
- --log.level=debug
- --tsdb.path=/prometheus/data
- --prometheus.url=http://localhost:9090
- --http-address=0.0.0.0:10902
- --grpc-address=0.0.0.0:10901
- --reloader.rule-dir=/prometheus/rules/
- --reloader.config-file=/prometheus/prometheus.yaml.tmpl
- --reloader.config-envsubst-file=/prometheus/prometheus.yaml
#- --objstore.config-file=/prometheus/bucket_config.yaml
- |
--objstore.config=type: S3
config:
bucket: monitor-data
region: BEIJING
endpoint: obs.cn-north-4.myhuaweicloud.com
access_key: 0TN7LBPM3WPZRVNOXDCK
secret_key: RHiEj2Ph0797jWkKcbUHhUvEnteaB2GRLmd65ZkQ
insecure: true
signature_version2: true
depends_on:
- prometheus
#####################################
# thanos store 1 on host 1
#####################################
thanos_store:
image: thanosio/thanos:v0.32.5
container_name: thanos_store
network_mode: host
restart: always
user: nobody
volumes:
- /u01/thanos_store:/data
command:
- store
- --log.level=debug
- --data-dir=/data
- --index-cache-size=500MB
- --chunk-pool-size=500MB
- --http-address=0.0.0.0:10906
- --grpc-address=0.0.0.0:10905
- |
--objstore.config=type: S3
config:
bucket: monitor-data
region: BEIJING
endpoint: obs.cn-north-4.myhuaweicloud.com
access_key: 0TN7LBPM3WPZRVNOXDCK
secret_key: RHiEj2Ph0797jWkKcbUHhUvEnteaB2GRLmd65ZkQ
insecure: true
signature_version2: true
depends_on:
- prometheus
#####################################
# thanos compact 1 on host 1
#####################################
thanos_compact:
image: thanosio/thanos:v0.32.5
container_name: thanos_compact
network_mode: host
restart: always
user: nobody
volumes:
- /u01/thanos_compact:/data
command:
- compact
- --log.level=debug
- --data-dir=/data
- --http-address=0.0.0.0:10907
- --wait
- |
--objstore.config=type: S3
config:
bucket: monitor-data
region: BEIJING
endpoint: xxx
access_key: xxx
secret_key: xxx
insecure: true
signature_version2: true
depends_on:
- prometheus
#####################################
# thanos query 1 on host 1
#####################################
thanos_query:
image: thanosio/thanos:v0.32.5
container_name: thanos_query
network_mode: host
restart: always
command:
- query
- --query.replica-label=replica
- --http-address=0.0.0.0:10903
- --grpc-address=0.0.0.0:10904
- --store=10.0.1.35:10901
- --store=10.0.1.36:10901
- --store=10.0.1.35:10905
- --store=10.0.1.36:10905
#####################################
# alertmanager 1 on host 1
#####################################
alertmanager:
image: prom/alertmanager:v0.25.0
container_name: alertmanager
network_mode: host
restart: always
volumes:
- /u01/alertmanager:/alertmanager
# ports:
# - "9093:9093"
command:
- --config.file=/alertmanager/alertmanager.yaml
- --storage.path=/alertmanager
- --web.external-url=http://10.0.1.35:9093
- --cluster.listen-address=0.0.0.0:9094
- --cluster.advertise-address=10.0.1.35:9094
- --cluster.peer=10.0.1.36:9094
#####################################
# grafana on host 1
#####################################
grafana:
image: grafana/grafana-oss:10.1.1-ubuntu
container_name: grafana
network_mode: host
restart: always
user: "0:0"
# ports:
# - "3000:3000"
# user: $(id -u)
environment:
- GF_SECURITY_ADMIN_USER=admin
- GF_SECURITY_ADMIN_PASSWORD=admin
- GF_PATHS_CONFIG=/var/lib/grafana/conf/grafana.ini
- GF_PATHS_PROVISIONING=/var/lib/grafana/conf/provisioning
- GF_PATHS_DATA=/var/lib/grafana/data
- GF_PATHS_PLUGINS=/var/lib/grafana/data/plugins
volumes:
- /u01/grafana:/var/lib/grafana
depends_on:
- prometheus
##########################################
# prometheus dingtalk webhook on host 1
##########################################
#dingtalk-webhook:
# image: timonwong/prometheus-webhook-dingtalk:v2.1.0
# container_name: dingtalk-webhook
# network_mode: host
# ports:
# - "8060:8060"
# volumes:
# - /u01/dingtalk-webhook:/etc/prometheus-webhook-dingtalk
# command:
# - --web.listen-address=:8060
# - --web.enable-ui
# - --web.enable-lifecycle
# - --config.file=/etc/prometheus-webhook-dingtalk/config.yaml
# - --log.level=info
version: '2'
services:
#####################################
# prometheus 2 on host 2
#####################################
prometheus:
image: prom/prometheus:v2.45.0
container_name: prometheus
network_mode: host
restart: always
# ports:
# - "9090:9090"
volumes:
- /u01/prometheus:/prometheus
command:
- --config.file=/prometheus/prometheus.yaml
- --storage.tsdb.path=/prometheus/data
- --storage.tsdb.retention.time=1d
- --storage.tsdb.min-block-duration=2h
- --storage.tsdb.max-block-duration=2h
- --storage.tsdb.no-lockfile
- --web.listen-address=0.0.0.0:9090
- --web.read-timeout=1m
- --web.enable-admin-api
- --web.max-connections=10
- --query.max-concurrency=20
- --query.timeout=2m
- --web.enable-lifecycle
- --log.level=info
- --web.external-url=http://inside-prometheus.01zhuanche.com
#####################################
# thanos sidecar 2 on host 2
#####################################
thanos_sidecar:
image: thanosio/thanos:v0.32.5
container_name: thanos_sidecar
user: nobody
network_mode: host
restart: always
volumes:
- /u01/prometheus:/prometheus
environment:
- REPLICA=B
command:
- sidecar
- --log.level=debug
- --tsdb.path=/prometheus/data
- --prometheus.url=http://localhost:9090
- --http-address=0.0.0.0:10902
- --grpc-address=0.0.0.0:10901
- --reloader.rule-dir=/prometheus/rules/
- --reloader.config-file=/prometheus/prometheus.yaml.tmpl
- --reloader.config-envsubst-file=/prometheus/prometheus.yaml
- |
--objstore.config=type: S3
config:
bucket: monitor-data
region: BEIJING
endpoint: obs.cn-north-4.myhuaweicloud.com
access_key: 0TN7LBPM3WPZRVNOXDCK
secret_key: RHiEj2Ph0797jWkKcbUHhUvEnteaB2GRLmd65ZkQ
insecure: true
signature_version2: true
depends_on:
- prometheus
#####################################
# thanos store 2 on host 2
#####################################
thanos_store:
image: thanosio/thanos:v0.32.5
container_name: thanos_store
network_mode: host
restart: always
user: nobody
volumes:
- /u01/thanos_store:/data
command:
- store
- --log.level=debug
- --data-dir=/data
- --index-cache-size=500MB
- --chunk-pool-size=500MB
- --http-address=0.0.0.0:10906
- --grpc-address=0.0.0.0:10905
- |
--objstore.config=type: S3
config:
bucket: monitor-data
region: BEIJING
endpoint: xxx
access_key: xxx
secret_key: xxx
insecure: true
signature_version2: true
depends_on:
- prometheus
#####################################
# thanos query 2 on host 2
#####################################
thanos_query:
image: thanosio/thanos:v0.32.5
container_name: thanos_query
network_mode: host
restart: always
command:
- query
- --query.replica-label=replica
- --http-address=0.0.0.0:10903
- --grpc-address=0.0.0.0:10904
- --store=10.0.1.35:10901
- --store=10.0.1.36:10901
- --store=10.0.1.35:10905
- --store=10.0.1.36:10905
#####################################
# alertmanager 2 on host 2
#####################################
alertmanager:
image: prom/alertmanager:v0.25.0
container_name: alertmanager
network_mode: host
restart: always
volumes:
- /u01/alertmanager:/alertmanager
# ports:
# - "9093:9093"
command:
- --config.file=/alertmanager/alertmanager.yaml
- --storage.path=/alertmanager
- --web.external-url=http://10.0.1.36:9093
- --cluster.listen-address=0.0.0.0:9094
- --cluster.advertise-address=10.0.1.36:9094
- --cluster.peer=10.0.1.35:9094