Thanos 配置Prometheus的高可用

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Thanos 配置Prometheus的高可用相关的知识,希望对你有一定的参考价值。

标签(空格分隔): Prometheus系列


一: Prometheus 的介绍与架构

1.1 Prometheus 的概述

1.prometheus 的介绍
Prometheus是一个开源的系统监控和告警工具包,最初由SoundCloud开发。自2012年开
始,许多公司和组织开始使用了Prometheus,该项目拥有非常活跃的开发者和用户社区。
Prometheus现在是一个独立的开源项目,独立于任何公司进行维护。为了强调这一点,并澄
清项目的治理结构,Prometheus在2016年加入了云原生计算基金会(CNCF),成为继
Kubernetes之后的第二个托管项目,也是从CNCF第二个毕业的项目。

2. Prometheus的主要特征:

2.1 Prometheus使用的是 度量(metric)名称和键/值对标签(label)的时间序列数据,是一种多
维的数据模型。
2.2 PromQL是一种灵活的查询语言,可以利用度量(metric)名称和标签进行查询、聚合。
2.3 不依赖于分布式存储,单个Prometheus服务也是自治理的。
2.4 使用基于HTTP的拉(pull)模型进行时间序列的数据收集。
2.5 同时也支持通过一个中间网关(pushgateway)来推送时间序列。
2.6 目标对象(主机)是通过静态配置或者服务发现来添加的。
2.7 支持多种图形模式和仪表盘。

3. prometheus的组件

Prometheus目前已经是一个生态系统,具有众多的可选组件。
3.1 Prometheus Server 本身用于抓取并存储时间序列数据。
3.2 客户端程序库用于检测各种编程语言编写的程序代码。
3.3 pushgateway用于支持短生命周期(short-lived)的作业(job)。
3.4 可以针对不同的服务提供对应的导出器(exporters)用于采集度量数据,如HAProxy、mysql等服务。
3.5 用于告警的alertmanager组件
3.6 各种支持工具。
备注:大多数Prometheus组件都是用Go编写的,这使得它们很容易以静态二进制文件的形式
构建和部署。

prometheus 的官网:
          https://prometheus.io/

1.2 prometheus 的 架构

从上述架构图我们可以知道,Prometheus通过从Jobs/exporters中拉取度量数据;而短周期
的jobs在结束前可以先将度量数据推送到网关(pushgateway),然后Prometheus再从
pushgateway中获取短周期jobs的度量数据;还可以通过自动发现目标的方式来监控
kubernetes集群。所有收集的数据可以存储在本地的TSDB数据库中,并在这些数据上运行规
则、检索、聚合和记录新的时间序列,将产生的告警通知推送到Alertmanager组件。通过
PromQL来计算指标,再结合Grafana或其他API客户端来可视化数据。
Prometheus主要用于大规模的云端环境和容器化微服务(k8s)的监控,通过拉取(pull)应用程
序暴露出来的HTTP接口或exporter来获取时间序列数据。
Prometheus不适用于对监控要求100%准确的度量数据,比如每个请求的账单,因为收集的
数据可能还不够详细和完整。
Prometheus将其可以拉取指标的来源称为endpoint(端点),endpoint可以是各种
exporter(导出器)或应用程序。然后,为了拉取endpoint里的数据,Prometheus定义了名为
target(目标)的配置,告诉拉取时要如何进行连接等信息,多个具有相同功能角色的target组
合在一起就构成了一个job(作业),例如,具有相同用途的一组主机的资源监控器
(node_exporter),又或者是MySQL数据库监控器(mysqld_exporter)。
Prometheus默认是将收集到的时间序列数据存储在本地tsdb数据库中,且默认只保留15天,
也可以配置发送到其他时间序列数据库中。

二:thanos 的介绍

2.1 thanos 的概述

Thanos是基于Prometheus的具有高可用(HA)、存储持久化,多集群查询功能的监控解决方案。选择Thanos的主要原因:

· 所有组件都是无状态的(stateless)

· 监控数据和所有状态信息被持久化到对象存储(OSS)

· 服务之间通过稳定的StoreAPI对接

· 支持高可用的Prometheus部署(防止Prometheus单点故障)


thanos 的官网: https://thanos.io/ 

2.2 thanos 的架构

thanos 是一个基于 Prometheus 实现的监控方案,其主要设计目的是解决原生 Prometheus 上的痛点,并且做进一步的提升,
主要的特性有:全局查询,高可用,动态拓展,长期存储

Thanos 主要由如下几个特定功能的组件组成:(相当于微服务的模式,里面有比较多的组件)

边车组件(Sidecar):连接 Prometheus,并把 Prometheus 暴露给查询网关(Querier/Query),以供实时查询,并且可以上传 Prometheus 数据给云存储,以供长期保存(相当于可以连接本地prometheus以及查询器的)
查询网关(Querier/Query):实现了 Prometheus API,与汇集底层组件(如边车组件 Sidecar,或是存储网关 Store Gateway)的数据(可以去查询sidecar里面的数据,或者是程查询存储网关里面的一个数据,有一部分的数据可能还在本地,因为sidecar还没有将数据上传上去,这个时候去查询的时候会根据查询时间会去路由到本地的sidecar,如果数据在远程存储上面,那么就会从存储网关上面去读取)
存储网关(Store Gateway):将云存储中的数据内容暴露出来
压缩器(Compactor):将云存储中的数据进行压缩和下采样
接收器(Receiver):从 Prometheus 的 remote-write WAL(Prometheus 远程预写式日志)获取数据,暴露出去或者上传到云存储(和sidecar是两种不同的方式)
规则组件(Ruler):针对监控数据进行评估和报警
Bucket:主要用于展示对象存储中历史数据的存储情况,查看每个指标源中数据块的压缩级别,解析度,存储时段和时间长度等信息。
查询前端:实现Prometheus的api,将其代理给query,同时缓存响应
从使用角度来看有两种方式去使用 Thanos,sidecar模式和 receiver 模式。

三:prometheus 与thanos的部署

3.1 系统环境介绍

操作系统:
     centos7.9x64

主机名:
cat /etc/hosts
----
172.16.10.11    flyfish11
172.16.10.12    flyfish12
172.16.10.13    flyfish13
172.16.10.14    flyfish14
172.16.10.15    flyfish15
172.16.10.16    flyfish16
172.16.10.17    flyfish17
-----
本次安装前 5台虚拟机 (flyfish11/flyfish12/flyfish13/flyfish14/flyfish15)部署


系统初始化:
   1.系统关闭firewalld/selinux/iptables 清空
   2.配置所有虚拟机的root账号的无密钥登录
   3.配置时间服务器ntp1.aliyun.com 

3.2 安装prometheus


prometheus 需要安装两台(flyfish11/flyfish12)

Prometheus本身也是一个导出器(exporter),提供了关于内存使用、垃圾收集以及自身性能
与健康状态等各种主机级指标。
prometheus官网下载址:
https://prometheus.io/download/
wget https://github.com/prometheus/prometheus/releases/download/v2.41.0/prometheus-2.21.0.linux-amd64.tar.gz

useradd prometheus

tar -zxvf prometheus-2.41.0.linux-amd64.tar.gz
cd prometheus-2.41.0.linux-amd64
mv prometheus promtool /usr/bin/

chown prometheus:prometheus -R /usr/bin/prometheus /usr/bin/promtool

mkdir -p /var/lib/prometheus/
mv console* /var/lib/prometehus

chown prometheus:prometheus -R /var/lib/prometheus

mkdir /etc/prometheus 

mv prometheus.yml /etc/prometheus/

chown prometheus:prometheus -R /etc/prometheus/



Prometheus的配置文件是YAML格式,大致分为四大块,包括:global、alerting、
rule_files、scrape_configs。在下面的prometheus.yml配置文件中来描述其用途。
su - prometheus
cp -ap /etc/prometheus/prometheus.yml /etc/prometheus/prometheus.yml.bk 

cd /etc/prometheus/
vim prometheus.yaml
------
# my global config
global:
  scrape_interval: 15s # Set the scrape interval to every 15 seconds. Default is every 1 minute.
  evaluation_interval: 15s # Evaluate rules every 15 seconds. The default is every 1 minute.
  # scrape_timeout is set to the global default (10s).
  external_labels:
    replica: A       ### flyfish12 一台就是 replica: B
# Alertmanager configuration
alerting:
  alertmanagers:
    - static_configs:
        - targets:
          # - alertmanager:9093

# Load rules once and periodically evaluate them according to the global evaluation_interval.
rule_files:
  # - "first_rules.yml"
  # - "second_rules.yml"

# A scrape configuration containing exactly one endpoint to scrape:
# Here its Prometheus itself.
scrape_configs:
  # The job name is added as a label `job=<job_name>` to any timeseries scraped from this config.
  - job_name: "prometheus"

    # metrics_path defaults to /metrics
    # scheme defaults to http.

    static_configs:
      - targets: ["localhost:9090"]
        labels:
          app: prometheus
          nodename: prometheus-services

  - job_name: flyfishsrvs
    static_configs:
    - targets: [172.16.10.11:9100]
      labels:
        app: master11
        nodename: flyfish11
        role: master
    - targets: [172.16.10.12:9100]
      labels:
        app: node12
        nodename: flyfish12
        role: node
    - targets: [172.16.10.13:9100]
      labels:
        app: node13
        nodename: flyfish13
        role: node
    - targets: [172.16.10.14:9100]
      labels:
        app: node14
        nodename: flyfish14
        role: node
    - targets: [172.16.10.15:9100]
      labels:
        app: node15
        nodename: flyfish15
        role: node
------


加载检查:
     promtool check config /etc/prometheus/prometheus.yml

启动prometheus:


prometheus --config.file=/etc/prometheus/prometheus.yml &

netstat -nultp |grep 9090 

守护进程启动

cat > /usr/lib/systemd/system/prometheus.service <<EOF
[Unit]
Description=Prometheus
Documentiation=https://prometheus.io/
After=netowrk.target
[Service]
Type=simple
User=prometheus
ExecStart=/usr/bin/prometheus \\
--config.file=/etc/prometheus/prometheus.yml \\
--storage.tsdb.path=/var/lib/prometheus/data \\
--web.enable-lifecycle \\
--storage.tsdb.retention.time=180d \\
--web.listen-address=0.0.0.0:9090 \\
--web.enable-admin-api \\
--web.console.templates=/var/lib/prometheus/console \\
--web.console.libraries=/var/lib/prometheus/console_libraries \\
--web.external-url=https://prometheus.flyfish.mointor.com \\
--log.level=info
ExecReolad=/bin/curl -X POST http://127.0.0.0:9090/-/reload
TimeoutStopSec=2Os
Restart=always
LimitNOFILE=2048000
[Install]
WantedBy=multi-user.target
EOF


chmod +x /usr/lib/systemd/system/prometheus.service

service prometheus start 

chkconfig prometheus on 

用同样的方式部署flyfish12 机器 

vim /etc/prometheus/prometheus.yml  #注意这个地方是 replica: B 

3.3 部署node_exporter

在客户端上面部署:

tar -zxvf  node_exporter-1.5.0.linux-amd64.tar.gz

mv node_exporter-1.5.0.linux-amd64 /usr/local/node_exporter

/usr/local/node_exporter/node_exporter &

netstat -nultp |grep 9100 

守护进程启动:

cat > /usr/lib/systemd/system/node_exporter.service <<EOF
[Unit]
Description=node_exporter
Documentation=https://prometheus.io/
After=network.target 
[Service]
Typer=simple
ExecStart=/usr/local/node_exporter/node_exporter \\
--web.listen-address=:9100 \\
--collector.systemd \\
--collector.systemd.unit-whitelist="(ssh|docker|rsyslog|redis-server).service" \\
--collector.mountstats \\
--collector.tcpstat
ExecReload=/bin/kill -HUP
TimeoutStopSec=20s
Restart=always
[Install]
WantedBy=multi-user.target
EOF

-------


chmod +x /usr/lib/systemd/system/node_exporter.service

service node_exporter start

chkconfig node_exporter on 

netstat -nultp |grep 9100

ps -ef |grep node_exporter

同理部署flyfish12/flyfish13/flyfish14/flyfish15 的node_exporter 

flyfish11 的prometheus 

flyfish12 prometheus 

flyfish11 /flyfish12 采集的的一样 

这个时候如果在prometheus 上端做一个nginx 负载 前端加上grafana 做图表展示
如果其中一台prometheus 挂了 nginx 负载在这台 挂断的机器上面,就会出现数据展示图的短缺问题 

四:thanos 的的部署

thanos 只需要两个组件就可以形成一个机器,thanos-query 和thanos-sidecar 
用来抽象采集出数据层,从而来提供查询接口

下载:
    https://github.com/thanos-io/thanos/releases

4.1 thanos-sidecar

tar -zxvf thanos-0.30.1.linux-amd64.tar.gz
cd thanos-0.30.1.linux-amd64
cp -ap thanos /usr/bin/
thanos --help


thanos sidecar 启动

---
cat > /usr/lib/systemd/system/thanos-sidecar.service <<EOF
[Unit]
Description=thanos-sidecar
Documentation=https://thanos.io/
After=network.target 
[Service]
Type=simple
ExecStart=/usr/bin/thanos sidecar \\
          --tsdb.path=/var/lib/prometheus/data \\
          --prometheus.url=http://localhost:9090 \\
          --http-address=0.0.0.0:10901 \\
          --grpc-address=0.0.0.0:10902
ExecReload=/bin/kill -HUP
TimeoutStopSec=20s
Restart=always
[Install]
WantedBy=multi-user.target
EOF


---

service thanos-sidecar start 

service thanos-sidecar status

chkconfig thanos-sidecar on 

flyfish12 同样部署

4.3 thanos-query

query 用来做查询所有可能数据接口,比如sidecar 或者storage-gateway
这里并没有将数据进行远程写,所以我们使用只需要查询sidecar 就行了
--------------
cat > /usr/lib/systemd/system/thanos-query.service <<EOF
[Unit]
Description=thanos-sidecar
Documentation=https://thanos.io/
After=network.target 
[Service]
Type=simple
ExecStart=/usr/bin/thanos query \\
          --http-address=0.0.0.0:10903 \\
          --grpc-address=0.0.0.0:10904 \\
          --store=172.16.10.11:10902 \\
          --store=172.16.10.12:10902 \\
          --query.timeout=10m \\
          --query.max-concurrent=200 \\
          --query.max-concurrent-select=40 \\
          --query.replica-label=replica
ExecReload=/bin/kill -HUP
TimeoutStopSec=20s
Restart=always
LimitNOFILE=2048000
[Install]
WantedBy=multi-user.target
EOF
-----

service thanos-query start 
chkconfig thanos-query on 
service thanos-query status 

flyfish12 主机一样的配置

四:配置nginx 负载均衡代理

在flyfish13 机器上安装nginx 

nginx服务器 地址: flyfish13 (172.16.10.13)
nginx的编译安装:
配置依赖包:
yum -y install gcc pcre pcre-devel zlib zlib-devel openssl openssl-devel gd gd-devel 
 tar -zxvf nginx-1.23.2.tar.gz
 cd nginx-1.23.2/
./configure \\
--prefix=/usr/local/nginx \\
--http-proxy-temp-path=/usr/local/nginx/proxy_temp \\
--http-fastcgi-temp-path=/usr/local/nginx/fastcgi_temp \\
--with-http_ssl_module \\
--with-threads \\
--with-file-aio \\
--with-http_ssl_module \\
--with-http_realip_module \\
--with-http_gzip_static_module \\
--with-http_secure_link_module \\
--with-http_stub_status_module \\
--with-http_auth_request_module \\
--with-http_random_index_module \\
--with-http_image_filter_module \\
--with-stream 
make && make install 
---------------------------------------------------
cd /usr/local/nginx/
sbin/nginx 
ps -ef |grep nginx 

cd /usr/local/nginx/conf/
cp -ap nginx.conf nginx.conf.bak 
vim nginx.conf
------------
user root root;
worker_processes auto;
worker_cpu_affinity auto;
worker_rlimit_nofile 65535;

daemon on;
error_log /usr/local/nginx/logs/error.log warn;
pid /usr/local/nginx/pid/nginx.pid;

events 
    use epoll;
    worker_connections  65535;


# 开启环境变量
env SPRING_PROFILES_ACTIVE=master;

http 

    include mime.types;
    default_type application/octet-stream;

    charset utf-8;

    log_format main $remote_addr - $remote_user [$time_local] 
                    "$request" $status $body_bytes_sent 
                    "$http_referer" "$http_user_agent" 
                    "$http_x_forwarded_for" $host $request_time $upstream_response_time $scheme;

    log_format main1 $remote_addr|$remote_user|[$time_local]|$request|
                     $status|$upstream_status|$body_bytes_sent|$http_referer|
                     $http_user_agent|$request_time|$host|$upstream_addr|$request_body|$upstream_response_time;

    log_format main3 $http_x_forwarded_for|$remote_user|[$time_local]|$request|
                     $status|$upstream_status|$body_bytes_sent|$http_referer|
                     $http_user_agent|$request_time|$host|$upstream_addr|$request_body|$upstream_response_time;

    log_format lua $remote_addr|$remote_user|[$time_local]|$request|
                     $status|$body_bytes_sent|$http_referer|
                     $http_user_agent|$request_time|$host|$upstream_addr|$upstream_response_time;

    log_format    main2  escape=json
        "@timestamp":"$time_iso8601",
        "host":"$hostname",
        "server_ip":"$server_addr",
        "client_ip":"$http_x_forwarded_for",
        "xff":"$http_x_forwarded_for",
        "domain":"$host",
        "url":"$uri",
        "referer":"$http_referer",
        "args":"$args",
        "upstreamtime":"$upstream_response_time",
        "responsetime":"$request_time",
        "request_method":"$request_method",
        "status":"$status",
        "size":"$body_bytes_sent",
        "request_body":"$request_body",
        "request_length":"$request_length",
        "protocol":"$server_protocol",
        "upstreamhost":"$upstream_addr",
        "file_dir":"$request_filename",
        "http_user_agent":"$http_user_agent"
     ;

    #基础优化
    server_tokens off;

    sendfile on;
    tcp_nopush on;
    tcp_nodelay on;

    keepalive_timeout  65;
    keepalive_requests 8192;

    # gzip
    gzip on;
    gzip_min_length 1k;
    gzip_buffers 4 16k;
    gzip_comp_level 3;
    gzip_types text/plain application/javascript  text/css application/json application/x-javascript text/xml application/xml application/xml+rss text/javascript application/x-httpd-php image/jpeg image/gif image/png;
    gzip_vary on;

    client_body_timeout 300;
    client_header_timeout 300;
    send_timeout 600;
    reset_timedout_connection on;

    client_max_body_size 50m;
    #client_body_buffer_size 4096k;
    client_body_buffer_size 8192k;

    #client_header_buffer_size 4k;
    #large_client_header_buffers 4 64k;
    client_header_buffer_size 16k;
    large_client_header_buffers 8 256k;

    server_names_hash_bucket_size 512;

    proxy_connect_timeout 600;
    proxy_read_timeout 600;
    proxy_send_timeout 600;

    proxy_buffer_size  128k;
    proxy_buffers   8 128k;
    proxy_busy_buffers_size 256k;

    output_buffers 1 32k;
    postpone_output 1460;

    open_file_cache max=65535 inactive=60s;
    open_file_cache_valid    80s;
    open_file_cache_min_uses 1;
    open_file_cache_errors   on;

    # fastcgi set
    fastcgi_ignore_client_abort       on;
    fastcgi_connect_timeout           300;
    fastcgi_send_timeout              300;
    fastcgi_read_timeout              300;
    #fastcgi_buffer_size               4k;
    #fastcgi_buffers                   8 4k;
    #fastcgi_busy_buffers_size         8k;
    #fastcgi_temp_file_write_size      8k;

    fastcgi_buffer_size               64k;
    fastcgi_buffers                   4 64k;
    fastcgi_busy_buffers_size         128k;
    fastcgi_temp_file_write_size      128k;

    # fastcgi TEST
    fastcgi_cache_valid 200 302 1h;
    fastcgi_cache_valid 301 1d;
    fastcgi_cache_valid any 1m;
    fastcgi_cache_min_uses 1;
    fastcgi_cache_use_stale error timeout invalid_header http_500;
    include /usr/local/nginx/conf/vhost/*.conf;



-----------
cd /usr/local/nginx/conf
mkdir vhost

cd vhost

vim thanos.conf

-----
server 
	
	  listen 80;
	  server_name flyfish13;
location / 

     # auth_basic "please enter you password";
     # auth_basic_user_file /usr/local/nginx/htpasswd;
     proxy_pass http://thanos;
     proxy_set_header Host $host;
     proxy_set_header X-Real-IP $remote_addr;

   


upstream thanos 
	 server 172.16.10.11:10903;
	 server 172.16.10.12:10903; 


-----


sbin/nginx -s stop 

sbin/nginx -t 

sbin/nginx 

五:安装 grafana

安装grafana
wget https://dl.grafana.com/enterprise/release/grafana-enterprise-9.3.2-1.x86_64.rpm
rpm -ivh grafana-enterprise-9.3.2-1.x86_64.rpm
/bin/systemctl daemon-reload
/bin/systemctl enable grafana-server.service
/bin/systemctl start grafana-server.service

打开grafana面板

http://172.16.10.14:3000

添加一个prometheus的代理

导入import 面板
   

以上是关于Thanos 配置Prometheus的高可用的主要内容,如果未能解决你的问题,请参考以下文章

Prometheus监控运维实战十九: Thanos介绍

监控 - Prometheus+Thanos的全局视图与无缝高可用

使用 Thanos 实现多集群(租户)监控

Thanos,让你的Prometheus变成完美的监控利器。

使用 Thanos+Prometheus+Grafana 打造监控系统

监控 - Thanos - Prometheus的低时延与低开销数据查询