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

实现架构如下图所示:

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

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

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



最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 204,684评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 87,143评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 151,214评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,788评论 1 277
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,796评论 5 368
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,665评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,027评论 3 399
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,679评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 41,346评论 1 299
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,664评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,766评论 1 331
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,412评论 4 321
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,015评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,974评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,203评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,073评论 2 350
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,501评论 2 343