thanos 实现 prometheus 高可用 数据持久化

基础环境:

系统: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

实现架构如下图所示:

所有组件均可横向扩展,此处图只展示一个简单的结构

thanos 实现 prometheus 高可用 数据持久化_第1张图片

自上而下介绍一下各个组件的作用,并提供容器化部署脚本。

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截图



thanos 实现 prometheus 高可用 数据持久化_第2张图片

你可能感兴趣的:(thanos 实现 prometheus 高可用 数据持久化)