基础环境:
系统:centos 7.5
存储:ceph集群
所需服务镜像获取地址:https://hub.docker.com/
thanos github 和详细文档地址:https://github.com/thanos-io/thanos
prometheus github 和详细文档地址:https://github.com/prometheus/prometheus
thanos query节点:
192.168.66.43:9194
192.167.66.44:9194
192.168.66.45:9194
Altermanager 节点:
192.168.66.43:9093
192.167.66.44:9093
192.168.66.45:9093
实现架构如下图所示:
所有组件均可横向扩展,此处图只展示一个简单的结构
自上而下介绍一下各个组件的作用,并提供容器化部署脚本。
1,首先是用户层面,用户层面从 grafana 获取相应的监控图形,从altermanager 接收监控告警信息。
grafana install
docker run -d \
--network host \
--name grafana \
--env TZ="Asia/Shanghai" \
--env "GF_SERVER_ROOT_URL=http://test.com/bigdatagrafana" \ ## 可根据实际映射的域名填写配置
-v /data/cloud/grafana/conf:/etc/grafana \
-v /data/cloud/grafana/data:/var/lib/grafana \
docker.17usoft.com/bigdata/cloud-bigdata/grafana:5.3.2
Alter manager 实现告警功能,具体的webhook 需要自行开发,或者使用wechat email等公共接口。
Altermanager
docker run -d \
--net host --pid host \
--restart unless-stopped \
--name alertmanager \
-v /etc/localtime:/etc/localtime:ro \
-v /data/cloud/alertmanager/conf/:/etc/alertmanager/ \
-v /data/cloud/alertmanager/data:/alertmanager \
docker.17usoft.com/bigdata/devops/alertmanager:v0.18.0 \
--config.file=/etc/alertmanager/alertmanager.yml \
--storage.path=/alertmanager \
--cluster.listen-address=0.0.0.0:9194 \
--cluster.peer=192.168.66.43:9194 \
--cluster.peer=192.168.66.44:9194 \
--cluster.peer=192.168.66.45:9194
thanos rule 用于统一管理所有的告警规则,query.yaml 配置文件,配置了所有的 thanos query 节点
tthanos rule
docker run -d --net host \
--name thanos-rule \
-v /etc/localtime:/etc/localtime:ro \
-v /data/cloud/thanos-rule/data:/data \
-v /data/cloud/thanos-rule/rules:/rules \
-v /data/cloud/thanos-rule/conf:/conf \
docker.17usoft.com/bigdata/monitor/thanos:v0.7.0 \
rule \
--grpc-address="0.0.0.0:10905" \
--http-address="0.0.0.0:19193" \
--data-dir "/data" \
--eval-interval "30s" \
--rule-file "/rules/*.yml" \
--query.sd-files "/conf/query.yml" \
--objstore.config-file /conf/bucket_config.yaml \
--alertmanagers.url "http://192.168.66.43:9093" \
--alertmanagers.url "http://192.168.66.44:9093" \
--alertmanagers.url "http://192.168.66.45:9093" \
--label 'rule_cluster="thaons"' \
--label 'replica="${HOSTNAME}"' \
--alert.label-drop="replica"
接下来是 thanos query 组件,用于提供多个 prometheus 的聚合查询,解决多个prometheus数据查询无法聚合问题。配置文件query.yml ,包含了当前所有的prometheus节点。thanos query 根据实际情况可部署多个节点,通过 lvs 或 nginx 进行负载均衡。然后配置在 grafana 中。
docker run -d --net host \
--name thanos-query \
-v /etc/localtime:/etc/localtime:ro \
-v /data/cloud/thanos-query/conf:/conf \
docker.17usoft.com/bigdata/monitor/thanos:v0.8.1 \
query --http-address 0.0.0.0:19192 \
--log.level=warn \
--query.replica-label "replica" \
--grpc-address="0.0.0.0:10999" \
--store.sd-files=/conf/query.yml
然后是指标采集 prometheus ,prometheus 和 thanos sidecar 一同部署,thanos query 通过sidecar 进行查询prometheus中的数据,并将prometheus本地存储数据定时同步到网络存储ceph中,目前thanos 支持多种存储方案。具体可参考 giithub 文档。下面提供了部署脚本。
注意点:
此处根据变量自动生成了prometheus配置文件,可根据需要自行修改,配置文件中external_labels 要定义一个replica标签,用于thanos query 区分两个拉取相同监控指标的prometheus,即去重。这里可以实现prometheus的高可用,可以部署2到多个拉取相同指标的prometheus,避免单点故障,监控数据丢失,thanos query 在上层能够根据 label replica 进行去重。
sidecar 中的S3 的接口,此处为自建 ceph 集群提供。此处需关注单个 prometheus 所产生的数据量,第一版我所有的prometheus 采用了相同的 ceph bucket ,导致 thanos compact 和store 组件出现了oom,因为单个 bucket 数据量三个月接近10T左右的数据,单个 compact 和store 无法进行数据的落地和查询。所以最后我根据prometheus的用途进行切分,不同的prometheus采用不同的ceph bucket 解决了这个问题。
#!/bin/bash
cluster=$1
port=$2
sidecar_port=$3
sidecar_grpc_port=$4
mkdir -p /data/cloud/prometheus_${cluster}/{conf,conf.d,data}/
mkdir -p /data/cloud/prometheus_${cluster}/conf.d/host/
cat << EOF > /data/cloud/prometheus_${cluster}/conf/prometheus.yml
global:
external_labels:
monitor: ${cluster}
replica: ${HOSTNAME}
scrape_interval: 60s
evaluation_interval: 60s
scrape_timeout: 60s
scrape_configs:
- job_name: 'host'
file_sd_configs:
- files:
- "/conf.d/host/*.json"
refresh_interval: 60m
rule_files:
- '/conf.d/rules/*.yml'
- '/conf.d/record_rules/*.yml'
EOF
chmod 777 /data/cloud/prometheus_${cluster}/data/
docker stop prometheus_${cluster}
docker rm prometheus_${cluster}
docker run -d \
--restart unless-stopped \
--cpus 20 \
--name prometheus_${cluster} \
--net host \
-v /etc/localtime:/etc/localtime:ro \
-v /data/cloud/prometheus_${cluster}/conf/:/etc/prometheus/ \
-v /data/cloud/prometheus_${cluster}/conf.d:/conf.d \
-v /data/cloud/prometheus_${cluster}/data:/prometheus \
docker.17usoft.com/bigdata/monitor/prometheus:v2.12.0 \
--config.file=/etc/prometheus/prometheus.yml \
--web.enable-lifecycle --storage.tsdb.no-lockfile \
--web.listen-address="0.0.0.0:${port}" \
--storage.tsdb.path=/prometheus \
--log.level=warn \
--web.enable-admin-api \
--storage.tsdb.max-block-duration=2h \
--storage.tsdb.min-block-duration=2h \
--web.console.libraries=/usr/share/prometheus/console_libraries \
--web.console.templates=/usr/share/prometheus/consoles
mkdir -p /data/cloud/sidecar_${cluster}/conf/
cat << EOF > /data/cloud/sidecar_${cluster}/conf/bucket_config.yaml
type: S3
config:
bucket: "thanos-${cluster}"
endpoint: "172.20.66.30:7480"
access_key: "E7NSW13CNAKBIXJB2WCG"
insecure: true
signature_version2: true
encrypt_sse: false
secret_key: "QrBi0eftG9BcaZEJW40K6UJMqRc2E80fVZ1yiis6"
put_user_metadata: {}
http_config:
idle_conn_timeout: 3s
insecure_skip_verify: true
EOF
docker stop thanos-sidecar-$cluster
docker rm thanos-sidecar-$cluster
docker run -d --net host \
--restart unless-stopped \
--name thanos-sidecar-$cluster \
-v /etc/localtime:/etc/localtime:ro \
-v /data/cloud/prometheus_${cluster}/data:/var/prometheus \
docker.17usoft.com/bigdata/monitor/thanos:v0.8.1 \
sidecar --tsdb.path /var/prometheus \
--log.level=warn \
--http-address 0.0.0.0:${sidecar_port} \
--grpc-address 0.0.0.0:${sidecar_grpc_port} \
--prometheus.url "http://127.0.0.1:${port}"
下面是 thanos compact 和 thanos store。
compact 提供ceph bucket 中数据压缩和降准功能,可根据时间进行压缩降准。
store 对外提供查询持久化在ceph bucket 中的数据。需结合 thanos query 使用,可限制可查数据的时间长度。
store 组件部署
#!/bin/bash
cluster=$1
http_port=$2
grpc_port=$3
mkdir -p /data/cloud/thanos-store-${cluster}/{data,conf}
cat << EOF > /data/cloud/thanos-store-${cluster}/conf/bucket_config.yaml
type: S3
config:
bucket: "thanos-${cluster}"
endpoint: "ceph.host:7480"
access_key: "E7NSW13CNAKBIXJB2WCG"
insecure: true
signature_version2: true
encrypt_sse: false
secret_key: "QrBi0eftG9BcaZEJW40K6UJMqRc2E80fVZ1yiis6"
put_user_metadata: {}
http_config:
idle_conn_timeout: 3s
insecure_skip_verify: true
EOF
docker run -d --net host \
--pid=host \
--restart unless-stopped \
--name thanos-store-${cluster} \
-v /data/cloud/thanos-store-${cluster}/data:/var/thanos/store \
-v /data/cloud/thanos-store-${cluster}/conf:/conf:ro \
docker.17usoft.com/bigdata/monitor/thanos:v0.8.1 \
store --data-dir /var/thanos/store \
--http-address 0.0.0.0:${http_port} \
--grpc-address 0.0.0.0:${grpc_port} \
--index-cache-size=1GB \
--chunk-pool-size=8GB \
--objstore.config-file /conf/bucket_config.yaml
compact 组件部署
#!/bin/bash
cluster=$1
http_port=$2
mkdir -p /data/cloud/thanos-compact-${cluster}/{data,conf}
cat << EOF > /data/cloud/thanos-compact-${cluster}/conf/bucket_config.yaml
type: S3
config:
bucket: "thanos-${cluster}"
endpoint: "172.20.66.31:7480"
access_key: "E7NSW13CNAKBIXJB2WCG"
insecure: true
signature_version2: true
encrypt_sse: false
secret_key: "QrBi0eftG9BcaZEJW40K6UJMqRc2E80fVZ1yiis6"
put_user_metadata: {}
http_config:
idle_conn_timeout: 3s
insecure_skip_verify: true
EOF
docker stop thanos-compact-${cluster}
docker rm thanos-compact-${cluster}
docker run -d --net host \
--restart unless-stopped \
--name thanos-compact-${cluster} \
-v /data/cloud/thanos-compact-${cluster}/data:/var/thanos/compact \
-v /data/cloud/thanos-compact-${cluster}/conf:/conf:ro \
docker.17usoft.com/bigdata/monitor/thanos:v0.8.1 \
compact --data-dir /var/thanos/compact \
--http-address 0.0.0.0:${http_port} \
--log.level=info \
--wait \
--retention.resolution-raw=365d \
--retention.resolution-5m=15d \
--retention.resolution-1h=30d \
--block-sync-concurrency=30 \
--compact.concurrency=6 \
--objstore.config-file /conf/bucket_config.yaml
其他:
目前还使用到了 pushgateway ,prometheus jmx exporter 等其他采集组件。
并自行编写了一个采集进程的详细资源使用情况 ,我之后会把相关代码贴上。
附上grafana截图