1. 课程说明

1.1. 讲解顺序

Thanos比较难上手的原因是因为Thanos并不像prometheus一样,直接使用二进制文件一启动就可以玩起来了,他有非常多的组件,每一个组件的启动方式都是通过thanos xxx --config xxx这种形式来构成的。

而真正的产品中,都已经把这些功能打包成了镜像,我们没办法一层一层的剥开外壳,看到实质。所以我们会从内而外的展示一下thanos的各个组件是怎么协同工作的。我们会大致经过三个阶段。

  • 构建最简单的集群
  • 优化查询
  • 持久存储

期间的一些其他组件,比如注册中心(consul)的集群,持久存储(minio)的集群,数据库(pgsql,repmgr)的集群,我们会在后面进行讲解。

1.2. 实验环境

在真实的生产环境中,一部分组件,比如对象存储和数据库,我们都可以直接使用公有云提供给我们的SaaS服务就好了。为了让大家理解的更加透彻,我们假设自己在私有云环境中,只有网络,服务器和存储三个部分。而这些我们都使用AWS的公有云环境进行模拟。

整个实验的最低要求是两个服务器,但是一些组件,比如服务注册中心consul和对象存储minio的集群分别需要三个和四个节点,所以建议大家使用四个节点。如果实在没有,就在一台机器上启动多个实例也可以,但是生产系统上还是要分开的。

我们这里为了模拟真实的生产环境,使用5台机器,一台作为跳转机和负载均衡,其他4台机器作为应用节点。由于我们的环境使用的是Terraform创建的,所以IP地址是随机生成的,可能每次生成的实验环境都不相同。为了让大家更直观的了解环境,我先把这几台机器的基本信息列出来。

节点 IP地址 功能
node0 10.0.0.11 jumpserver/nginx
node1 10.0.1.11 prometheus/grafana/alertmanager/thanos-sidecar/thanos-query/thanos-storage-gateway/thanos-frontend/thanos-ruler/thanos-compact/minio/consul/postgresql
node2 10.0.1.12 prometheus/grafana/alertmanager/thanos-sidecar/thanos-query/thanos-storage-gateway/thanos-frontend/thanos-ruler/thanos-compact/minio/consul/postgresql
node3 10.0.1.13 prometheus/grafana/alertmanager/thanos-sidecar/thanos-query/thanos-storage-gateway/thanos-frontend/thanos-ruler/thanos-compact/minio/consul
node4 10.0.1.14 prometheus/grafana/alertmanager/thanos-sidecar/thanos-query/thanos-storage-gateway/thanos-frontend/thanos-ruler/thanos-compact/minio/

1.3. 端口

由于实验环境机器有限,我们在一台机器上使用下面的端口给Thanos用

Component Interface Port
Sidecar gRPC 10901
Sidecar HTTP 10902
Query gRPC 10903
Query HTTP 10904
Store gRPC 10905
Store HTTP 10906
Receive gRPC (store API) 10907
Receive HTTP (remote write API) 10908
Receive HTTP 10909
Rule gRPC 10910
Rule HTTP 10911
Compact HTTP 10912
Query Frontend HTTP 10913

2. 最初的架构

经典的组合,Prometheus+Grafana+AlertManager+Node_Exporter,我们就不过多赘述,直接上手。

2.1. Prometheus

创建用户用来专门跑prometheus进程,这个是为了安全起见。

useradd -s /sbin/nologin prometheus

从下载并且解压prometheus

wget https://github.com/prometheus/prometheus/releases/download/v2.35.0/prometheus-2.35.0.linux-amd64.tar.gz
tar xf prometheus-2.35.0.linux-amd64.tar.gz
cd prometheus-2.35.0.linux-amd64

我们可以直接启动,但是为了符合linux的操作习惯,我喜欢把这些文件整理一下

mv prometheus promtool /usr/local/sbin/
chown -R prometheus:prometheus /usr/local/sbin/prometheus /usr/local/sbin/promtool

mkdir /var/lib/prometheus
mv console_libraries consoles /var/lib/prometheus
chown -R prometheus:prometheus /var/lib/prometheus

mkdir /etc/prometheus/
mv prometheus.yml /etc/prometheus/prometheus.yml
chown -R prometheus:prometheus /etc/prometheus/

mkdir /app/prometheus/
chown -R prometheus:prometheus /app/prometheus/

而prometheus自身配置如下

/etc/prometheus/prometheus.yml 
# 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

# Alertmanager configuration
#alerting:
#  alertmanagers:
#  - scheme: https
#    static_configs:
#    - targets:
#        - alertmanager.monitor.ubrmb.com

# Load rules once and periodically evaluate them according to the global 'evaluation_interval'.
#rule_files:
#   - "/etc/thanos/rules/node_exporter/*.yml"
#   - "/etc/thanos/rules/blackbox_exporter/*.yml"

# A scrape configuration containing exactly one endpoint to scrape:
# Here it's Prometheus itself.
scrape_configs:
  - job_name: 'prometheus'
    file_sd_configs:
    - files:
      - /etc/prometheus/targets/prometheus/*.yml

给他一个启动文件,配置的话都写在systemd文件里面

cat /etc/systemd/system/prometheus.service
[Unit]
Description=prometheus
Documentation=https://prometheus.io/
After=network.target
[Service]
Type=simple
User=prometheus
ExecStartPre=/usr/local/sbin/promtool check config /etc/prometheus/prometheus.yml
ExecStart=/usr/local/sbin/prometheus \
          --config.file=/etc/prometheus/prometheus.yml \
          --web.listen-address=0.0.0.0:9090 \
          --web.enable-lifecycle \
          --web.enable-admin-api \
          --web.console.templates=/var/lib/prometheus/console \
          --web.console.libraries=/var/lib/prometheus/console_libraries \
          --web.external-url=https://prometheus.monitor.ubrmb.com \
          --storage.tsdb.path=/app/prometheus/ \
          --storage.tsdb.min-block-duration=2h \
          --storage.tsdb.max-block-duration=2h \
          --storage.tsdb.retention.time=30d \
          --log.level=info
ExecReload=/bin/curl -X POST http://127.0.0.1:9090/-/reload
TimeoutStopSec=20s
Restart=always
LimitNOFILE=20480000
[Install]
WantedBy=multi-user.target

启动进程systemctl start prometheus之后就可以通过浏览器访问了。

2.2. node_exporter

同样创建node_exporter用户专门用来跑node_exporter进程

下载并且解压

wget https://github.com/prometheus/node_exporter/releases/download/v1.3.1/node_exporter-1.3.1.linux-amd64.tar.gz
tar xf node_exporter-1.3.1.linux-amd64.tar.gz
cd node_exporter-1.3.1.linux-amd64

同样整理一下

mv node_exporter /usr/local/sbin/

给他一个启动文件

cat /etc/systemd/system/node_exporter.service 
[Unit]
Description=node_exporter
Documentation=https://prometheus.io/
After=network.target

[Service]
Type=simple
ExecStart=/usr/local/sbin/node_exporter \
          --collector.mountstats \
          --collector.systemd \
          --collector.tcpstat
ExecReload=/bin/kill -HUP 
TimeoutStopSec=20s
Restart=always

[Install]
WantedBy=multi-user.target

3. Thanos基础组件

Thanos只需要两个组件就可以简单形成一个集群,Thanos-query和Thanos-sidecar,sidecar用来抽象数据层,query来查询抽象出来的数据层,从而用来提供查询接口。

下载thanos

wget https://github.com/thanos-io/thanos/releases/download/v0.26.0/thanos-0.26.0.linux-amd64.tar.gz
tar xf thanos-0.26.0.linux-amd64.tar.gz
cd thanos-0.26.0.linux-amd64
mv thanos /usr/local/sbin

3.1. Thanos-sidecar

名如其意,他就是sidecar,和prometheus的sidecar一样,我们这里先用systemd来模拟一下

cat /etc/systemd/system/thanos-sidecar.service
[Unit]
Description=thanos-sidecar
Documentation=https://thanos.io/
After=network.target
[Service]
Type=simple
ExecStart=/usr/local/sbin/thanos sidecar \
          --tsdb.path=/app/prometheus \
          --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

3.2. Thanos-query

query用来查询所有可能的数据接口,比如sidecar或storage-gateway,我们这里并没有把数据进行远程写,所以我们只需要查询sidecar就好了

  cat /etc/systemd/system/thanos-query.service 
[Unit]
Description=thanos-query
Documentation=https://thanos.io/
After=network.target
[Service]
Type=simple
ExecStart=/usr/local/sbin/thanos query \
          --http-address=0.0.0.0:10903 \
          --grpc-address=0.0.0.0:10904 \
          --store=10.0.1.11:10902 \
          --store=10.0.1.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=20480000
[Install]
WantedBy=multi-user.targe

4. 高可用

利用nginx的代理功能来实现高可用和认证功能,为thanos-query服务增加反向代理配置

server {
        listen 10903;
        server_name  10.0.0.11;

location / {
        proxy_pass http://thanos;
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
        }
}

upstream thanos {
        server 10.0.1.11:10903;
        server 10.0.1.12:10903;
}

33