Prometheus03 Prometheus服务发现, 各种exporter, 容器化监控, Federation联邦, VictoriaMetrics远程存储

6 服务发现

6.1 服务发现原理

6.2 文件服务发现

#准备主机节点列表文件,可以支持yaml格式和json格式
#注意:此文件不建议就地编写生成,可能出现加载一部分的情况
cat targets/prometheus*.yaml
- targets:
  - master1:9100
  labels:
    app: prometheus

#修改prometheus配置文件自动加载实现自动发现
cat prometheus.yml
......
  - job_name: 'file_sd_prometheus'
    scrape_interval: 10s                #指定抓取数据的时间间隔,默认继取全局的配置15s
    file_sd_configs:
    - files: #指定要加载的文件列表
      - targets/prometheus*.yaml #要加载的yml或json文件路径,支持glob通配符,相对路径是相对于prometheus.yml配置文件路径
      refresh_interval: 2m #每隔2分钟重新加载一次文件中定义的Targets,默认为5m
      
#注意:文件格式都是yaml或json格式

6.2.2 文件服务发现案例

6.2.2.1 案例: YAML 格式

范例: 通过yaml格式的文件发现,将所有的节点都采用自动发现机制

#创建目标目录
]#mkdir /usr/local/prometheus/conf/targets
]#cd /usr/local/prometheus/conf/targets

#创建prometheus的服务配置
]#vim prometheus-server.yml
- targets:
  - 10.0.0.151:9090
  labels:
    app: prometheus-server
    job: prometheus-server

]#vim prometheus-node.yml
- targets:
  - 10.0.0.151:9100
  labels:
    app: prometheus
    job: prometheus
- targets:
  - 10.0.0.152:9100
  - 10.0.0.153:9100
  - 10.0.0.154:9100
  labels:
    app: node-exporter
    job: node

#编辑配置文件
]#vim /usr/local/prometheus/conf/prometheus.yml
rule_files:
scrape_configs:
  ...
  - job_name: 'prometheues-file-sd'
    file_sd_configs:
    - files:
      - targets/prometheus-server.yml #相对prometheus.yml的路径(可以写绝对路径)
      refresh_interval: 10s    #10秒会去检查是否发生变化

  - job_name: 'nodeexporter-file-sd'
    file_sd_configs:
    - files:
      - targets/prometheus-node.yml
      refresh_interval: 10s
      
#检查语法
]#promtool check config /usr/local/prometheus/conf/prometheus.yml

[root@prometheus targets]#systemctl reload prometheus.service

#修改配置(测试动态更新的功能)
]#vim prometheus-node.yml
- targets:
  - 10.0.0.151:9100
  labels:
    app: prometheus
    job: prometheus
- targets:
  - 10.0.0.152:9100    #删除10.0.0.154:9100
  - 10.0.0.153:9100
  labels:
    app: node-exporter
    job: node
#10秒后在Prometheus网页http://10.0.0.151:9090/能看到对应监控少了一个

6.2.2.2 案例: JSON 格式

#可以利用工具或者网站将前面的YAML格式转换为JSON格式
#安装工具
yaml2json
#网站
http://www.json2yaml.com/

#其他配置方法和上面yaml一样

6.3 DNS 服务发现

6.3.2 DNS服务发现案例

6.3.2.1 部署和配置 DNS

#通过脚本部署
]#vim install_dns.sh
HOST_LIST="
prometheus 10.0.0.151
node1 10.0.0.152
node2 10.0.0.153
node3 10.0.0.154"
...
#安装dns服务
[root@prometheus ~]#bash install_dns.sh

#修改Prometheus的dns地址为配置的dns服务地址
]#vim /etc/netplan/00-installer-config.yaml
network:
  ethernets:
    ens33:
      addresses: [10.0.0.151/24]
      gateway4: 10.0.0.2
      nameservers:
        #addresses: [223.6.6.6,223.5.5.5]
        addresses: [127.0.0.1]
  version: 2

[root@prometheus bind]#netplan apply
#确认dns解析效果
dig master.wang.org
host master.wang.org

6.3.2.2 配置 DNS服务支持 SRV 记录

#添加SRV记录 (靠SRV记录做服务发现的)
[root@prometheus bind]#vim /etc/bind/wang.org.zone
...
node1   A        10.0.0.152
node2   A        10.0.0.153
node3   A        10.0.0.154
flask   A        10.0.0.151 #直接添加一个a记录
#添加下面的SRV记录,对应上面的三条A记录
#wang.org.是域名,可以省略不写;1H是有效期;10:有效期;10:权重;9100端口;node1.wang.org:目标
_prometheus._tcp.wang.org. 1H IN SRV 10 10 9100 node1.wang.org.
_prometheus._tcp.wang.org. 1H IN SRV 10 10 9100 node2.wang.org.
_prometheus._tcp.wang.org. 1H IN SRV 10 10 9100 node3.wang.org.

#格式:
#RFC2782中对于SRV的定义格式是:
#_Service._Proto.Name TTL Class SRV Priority Weight Port Target

#bind服务重新生效
[root@prometheus bind]#rndc reload

6.3.2.3 配置 Prometheus 使用 DNS

# vim /usr/local/prometheus/conf/prometheus.yml
scrape_configs:
  - job_name: "prometheus"
   .......
    
#添加下面所有行
  - job_name: 'dns_sd_flask'             #实现单个主机定制的信息解析,也支持DNS或/etc/hosts文件实现解析
    dns_sd_configs:
    - names: ['flask.wang.org']
      type: A                            #指定记录类型,默认SRV
      port: 8000                         #不是SRV时,需要指定Port号
      refresh_interval: 10s
      
  - job_name: 'dns_sd_node_exporter'          #实现批量主机解析
    dns_sd_configs:
    - names: ['_prometheus._tcp.wang.org']    #SRV记录必须通过DNS的实现
      refresh_interval: 10s                   #指定DNS资源记录的刷新间隔,默认30s

#检查语法
]#promtool check config /usr/local/prometheus/conf/prometheus.yml

[root@prometheus bind]#systemctl reload prometheus.service

#prometheus网页上就能看到dns发现的服务

#修改看看是否自动更新
[root@prometheus bind]#vim /etc/bind/wang.org.zone
...
node1   A        10.0.0.152
#node2   A        10.0.0.153 #删掉该记录
node4   A        10.0.0.156    #改成node4
flask   A        10.0.0.100 #修改值

_prometheus._tcp.wang.org. 1H IN SRV 10 10 9100 node1.wang.org.
_prometheus._tcp.wang.org. 1H IN SRV 10 10 9100 node2.wang.org.
_prometheus._tcp.wang.org. 1H IN SRV 10 10 9100 node4.wang.org. #改成node4

#bind服务重新生效,让dns配置生效
[root@prometheus bind]#rndc reload

#在Prometheus网页http://10.0.0.151:9090/能看到对应监控已经变更

6.4 Consul 服务发现

6.4.1 Consul 介绍

微服务下做服务发现(也能健康性检查)和配置管理(nacos是针对java微服务,consul针对所有语言微服务)

Consul自带一个Web UI管理系统

consul支持单机和高可用部署

Prometheus 基于的Consul服务发现过程:

 

6.4.2 Consul 部署

6.4.2.1 部署 Consul 单机

范例: Ubuntu 包安装 Consul

#Ubuntu2204内置consul源,直接安装
[root@ubuntu2204 ~]#apt list consul
consul/jammy 1.8.7+dfsg1-3 amd64

6.4.2.1.2 二进制安装 Consul

#下载链接
https://releases.hashicorp.com/consul/

[root@ubuntu2204 ~]#wget https://releases.hashicorp.com/consul/1.13.3/consul_1.13.3_linux_amd64.zip
[root@ubuntu2204 ~]#unzip consul_1.13.3_linux_amd64.zip -d /usr/local/bin/
[root@ubuntu2204 ~]#ls /usr/local/bin/
consul

#查看consul帮助
[root@ubuntu2204 ~]#consul

#实现consul命令自动补全
[root@ubuntu2204 ~]#consul -autocomplete-install
#重新登录生效
[root@ubuntu2204 ~]#exit
[root@ubuntu2004 ~]#consul <TAB>

#创建用户
[root@ubuntu2204 ~]#useradd -s /sbin/nologin consul
#创建目录
[root@ubuntu2204 ~]#mkdir -p /data/consul /etc/consul.d
[root@ubuntu2204 ~]#chown -R consul.consul /data/consul /etc/consul.d

#以server模式启动服务cosnul agent
[root@ubuntu2204 ~]#/usr/local/bin/consul agent -server -ui -bootstrap-expect=1 
-data-dir=/data/consul -node=consul -client=0.0.0.0 -config-dir=/etc/consul.d
-server  #定义agent运行在server模式
-bootstrap-expect #在一个datacenter中期望提供的server节点数目,当该值提供的时候,consul一直等到达到指定sever数目的时候才会引导整个集群,该标记不能和bootstrap共用
-bind:#该地址用来在集群内部的通讯,集群内的所有节点到地址都必须是可达的,默认是0.0.0.0
-node:#节点在集群中的名称,在一个集群中必须是唯一的,默认是该节点的主机名
-ui    #提供web ui的http功能
-rejoin #使consul忽略先前的离开,在再次启动后仍旧尝试加入集群中。
-config-dir #配置文件目录,里面所有以.json结尾的文件都会被加载
-client  #consul服务侦听地址,这个地址提供HTTP、DNS、RPC等服务,默认是127.0.0.1,要对外提供服务改成0.0.0.0

#创建service文件
[root@ubuntu2204 ~]#cat > /lib/systemd/system/consul.service <<EOF
[Unit]
Description="HashiCorp Consul - A service mesh solution"
Documentation=https://www.consul.io/
Requires=network-online.target
After=network-online.target

[Service]
Type=simple
User=consul
Group=consul
ExecStart=/usr/local/bin/consul agent -server -bind=10.0.0.100 -ui -bootstrap-expect=1 -data-dir=/data/consul -node=consul -client=0.0.0.0 -config-dir=/etc/consul.d
#ExecReload=/bin/kill --signal HUP \$MAINPID
KillMode=process
KillSignal=SIGTERM
Restart=on-failure
LimitNOFILE=65536

[Install]
WantedBy=multi-user.target
EOF

[root@ubuntu2204 ~]#systemctl daemon-reload
[root@ubuntu2204 ~]#systemctl enable --now consul.service

#启动成功后,可以访问下面链接
http://10.0.0.153:8500

6.4.3 Consul 自动注册和删除服务

6.4.3.1 Consul常用API接口

#列出数据中心
curl http://10.0.0.153:8500/v1/catalog/datacenters
#列出节点
curl http://10.0.0.153:8500/v1/catalog/nodes
#列出服务
curl http://10.0.0.153:8500/v1/catalog/services
#指定节点状态
curl http://consul.wang.org:8500/v1/health/node/node2
#列出服务节点
curl http://consul.wang.org:8500/v1/catalog/service/<service_id>  

#提交Json格式的数据进行注册服务
curl -X PUT -d '{"id": "myservice-id","name": "myservice","address": 
"10.0.0.151","port": 9100,"tags": ["service"],"checks": [{"http": 
"http://10.0.0.151:9100/","interval": "5s"}]}' http://10.0.0.153:8500/v1/agent/service/register

#也可以将注册信息保存在json格式的文件中,再执行下面命令注册
cat nodes.json 
{
  "id": "myservice-id",
  "name": "myservice",
  "address": "10.0.0.151",
  "port": 9100,
  "tags": [
    "service"
 ],
  "checks": [
   {
      "http": "http://10.0.0.151:9100/",
      "interval": "5s"
   }
 ]
}
curl -X PUT --data @nodes.json http://10.0.0.153:8500/v1/agent/service/register

#查询指定节点以及指定的服务信息
curl http://10.0.0.153:8500/v1/catalog/service/<service_name> 

#删除服务,注意:集群模式下需要在service_id所有在主机节点上执行才能删除该service
curl -X PUT http://10.0.0.153:8500/v1/agent/service/deregister/<service_id>

6.4.3.2 使用consul services命令注册和注销服务

consul services register命令也可用于进行服务注册,只是其使用的配置格式与直接请求HTTP API有所 不同。

#注册服务
consul services register /path/file.json

#/path/file.json文件内容
#示例: 定义了单个要注册的服务。
{
  "service": {
      "id": "myservice-id",
      "name": "myservice",
      "address": "node1.wang.org",
      "port": 9100,
      "tags": ["node_exporter"],
      "checks": [{
        "http": "http://node1.wang.org:9100/metrics",
        "interval": "5s"
     }]
 }
}
#示例: 以多个的服务的格式给出了定义
{
  "services": [
     {"id": "myservice1-id",
      "name": "myservice1",
      "address": "node1.wang.org",
      "port": 9100,
      "tags": ["node_exporter"],
      "checks": [{
        "http": "http://node1.wang.org:8080/metrics",
        "interval": "5s"
     }]
   },
     {"id": "myservice1-id",
      "name": "myservice2",
      "address": "node2.wang.org",
      "port": 9100,
      "tags": ["node_exporter"],
      "checks": [{
        "http": "http://node2.wang.org:8080/metrics",
        "interval": "5s"
       }]
     },
     {.......}
   ]
}

#注销服务
consul services deregister -id <SERVICE_ID>

6.4.4 配置 Prometheus 使用 Consul 服务发现

[root@prometheus ~]#vim /usr/local/prometheus/conf/prometheus.yml
......
  - job_name: 'consul'
    honor_labels: true  #如果标签冲突,覆盖Prometheus添加的标签,保留原标签
    consul_sd_configs:
      - server: '10.0.0.153:8500'    #consul服务地址
        services: []  #指定需要发现的service名称,默认为空表示要所有service
        #tags:       #可以过滤具有指定的tag的service
        #- "service"  
        #refresh_interval: 2m #刷新时间间隔,默认30s
      #- server: 'consul-node2.wang.org:8500'  #如果是集群,添加其它两个节点实现冗余
      #- server: 'consul-node3.wang.org:8500'

    relabel_configs:    #通过Consul动态发现带的源标签生成新的标签方便以后使用
    - source_labels: ['__meta_consul_service']  #生成新的标签名
      target_label: 'consul_service'
    - source_labels: ['__meta_consul_dc']       #生成新的标签名
      target_label: 'datacenter'  
    - source_labels: ['__meta_consul_tags']     #生成新的标签名
      target_label: 'app'
    - source_labels: ['__meta_consul_service']  #删除consul的service,此service是consul内置,但并不提供metrics数据
       regex: "consul"
       action: drop

#---------------------------------------------------------------------------------
#通过Consul动态发现的服务实例还会包含以下Metadata标签信息:
__meta_consul_address         #consul地址
__meta_consul_dc              #consul中服务所在的数据中心
__meta_consulmetadata         #服务的metadata
__meta_consul_node            #服务所在consul节点的信息
__meta_consul_service_address #服务访问地址
__meta_consul_service_id      #服务ID
__meta_consul_service_port    #服务端口
__meta_consul_service         #服务名称
__meta_consul_tags            #服务包含的标签信息
#---------------------------------------------------------------------------------

#检查语法
]#promtool check config /usr/local/prometheus/conf/prometheus.yml

[root@prometheus ~]#systemctl reload prometheus.service
#在Prometheus网页上可以看到监控的consul组

#Consul变更,Prometheus网页上也可以看到变更

6.4.2.2 部署 Consul 集群

Consul 集群架构

起步3个节点

6.4.2.2.2 Consul 部署

6.4.2.2.2.1 二进制部署 Consul 集群

#consul agent 选项说明
-server    #使用server 模式运行consul 服务,consul支持以server或client的模式运行, server是服务发现模块的核心, client主要用于转发请求
-bootstrap #首次部署使用初始化模式
-bostrap-expect 2 #集群至少两台服务器,才能选举集群leader,默认值为3
-bind #该地址用来在集群内部的通讯,集群内的所有节点到地址都必须是可达的,默认是0.0.0.0,有多个IP需要手动指定,否则可能会出错
-client #设置客户端访问的监听地址,此地址提供HTTP、DNS、RPC等服务,默认是127.0.0.1
-data-dir #指定数据保存路径
-ui #运行 web 控制台,监听8500/tcp端口
-node #此节点的名称,群集中必须唯一
-datacenter=dc1 #数据中心名称,默认是dc1
-retry-join #指定要加入的consul节点地址,失败会重试, 可多次指定不同的地址,代替旧版本中的-join选项

#范例
#三台机器先安装单机Consul
#都关闭consul
]#systemctl stop consul.service

#node1:(第一个节点要做初始化bootstrap)
consul agent -server -bind=10.0.0.152 -client=0.0.0.0 -data-dir=/data/consul -node=node1 -ui  -bootstrap

#node2:(-retry-join指定第一个节点地址)
consul agent -server -bind=10.0.0.153 -client=0.0.0.0 -data-dir=/data/consul -node=node2  -retry-join=10.0.0.152 -ui -bootstrap-expect 2

#node3:(-retry-join也可以指定第2个节点)
consul agent -server -bind=10.0.0.154 -client=0.0.0.0 -data-dir=/data/consul -node=node3  -retry-join=10.0.0.152 -ui -bootstrap-expect 2

#在consul网页能看到集群信息
http://10.0.0.152:8500/

#提交Json格式的数据进行注册服务(对任意一台注册都行)
curl -X PUT -d '{"id": "myservice-id","name": "myservice","address": 
"10.0.0.151","port": 9100,"tags": ["service"],"checks": [{"http": 
"http://10.0.0.151:9100/","interval": "5s"}]}' http://10.0.0.151:8500/v1/agent/service/register


#配置 Prometheus 使用 Consul 服务发现 
[root@prometheus ~]#vim /usr/local/prometheus/conf/prometheus.yml
......
  - job_name: 'consul'
    honor_labels: true  #如果标签冲突,覆盖Prometheus添加的标签,保留原标签
    consul_sd_configs:
      - server: '10.0.0.151:8500'    #consul服务地址
        services: []  #指定需要发现的service名称,默认为空表示要所有service
      - server: '10.0.0.152:8500'  #如果是集群,添加其它两个节点实现冗余
      - server: '10.0.0.153:8500'
[root@prometheus ~]#systemctl reload prometheus.service
#从Prometheus网页 http://10.0.0.151:9090/ 能看到consul服务已发现

7 各种 Exporter

7.1 Node Exporter 监控服务

7.1.2 实战案例

7.1.2.1 修改 node_exporter 的配置文件

#在node1节点修改node_exporter配置文件
vim /lib/systemd/system/node_exporter.service
[Unit]
Description=node exporter project
After=network.target

[Service]
Type=simple
#只收集指定服务(采集systemd的服务,并且只有include包含的systemd服务才采集)
ExecStart=/usr/local/node_exporter/bin/node_exporter --collector.systemd --collector.systemd.unit-include=".*(ssh|mysql|node_exporter|nginx).*"
Restart=on-failure

[Install]
WantedBy=multi-user.target

#属性解析:
如果没有提前安装的服务,是不会被查看到的
服务名称的正则符号必须解析正确,否则无法匹配要现实的服务名称
#重启node_exporter服务
systemctl daemon-reload
systemctl restart node_exporter.service

#装一个nginx观察Prometheus监控参数node_systemd_unit_state,可以看到nginx的systemd参数
[root@prometheus ~]#apt install nginx

7.2 MySQL 监控

7.2.2 案例:二进制安装

7.2.2.1 MySQL 数据库环境准备

]#apt install mysql-server -y

#更新mysql配置,如果MySQL和MySQL exporter 不在同一个主机,需要修改如下配置
sed -i 's#127.0.0.1#0.0.0.0#' /etc/mysql/mysql.conf.d/mysqld.cnf
systemctl restart mysql

#为mysqld_exporter配置获取数据库信息的用户并授权
mysql 
mysql> CREATE USER 'exporter'@'localhost' IDENTIFIED BY '123456' WITH MAX_USER_CONNECTIONS 3;
mysql> GRANT PROCESS, REPLICATION CLIENT, SELECT ON *.* TO 'exporter'@'localhost';
mysql> flush privileges;

7.2.2.2 mysqld_exporter 安装

#获取软件
wget https://github.com/prometheus/mysqld_exporter/releases/download/v0.13.0/mysqld_exporter-0.13.0.linux-amd64.tar.gz

#解压软件
tar xf mysqld_exporter-0.13.0.linux-amd64.tar.gz -C /usr/local
ln -s /usr/local/mysqld_exporter-0.13.0.linux-amd64 /usr/local/mysqld_exporter
cd /usr/local/mysqld_exporter/
mkdir bin
mv mysqld_exporter bin/

#在mysqld_exporter的服务目录下,创建 .my.cnf 隐藏文件,为mysqld_exporter配置获取数据库信息的基本属性
vim /usr/local/mysqld_exporter/.my.cnf
[client]
host=127.0.0.1
port=3306
user=exporter
password=123456

#修改node_exporter的服务启动文件
vim /lib/systemd/system/mysqld_exporter.service
[Unit]
Description=mysqld exporter project
After=network.target

[Service]
Type=simple
ExecStart=/usr/local/mysqld_exporter/bin/mysqld_exporter --config.my-cnf="/usr/local/mysqld_exporter/.my.cnf"
Restart=on-failure

[Install]
WantedBy=multi-user.target

#配置解析:在原来的配置文件基础上,添加了 --config.my-cnf属性

#重载并重启服务
systemctl daemon-reload
systemctl enable --now mysqld_exporter.service
systemctl status mysqld_exporter.service

#检查是否打开9104/tcp端口
ss -tnulp | grep mysql
tcp        0      0 0.0.0.0:3306            0.0.0.0:*               LISTEN     24472/mysqld
tcp6       0      0 :::9104                 :::*                   LISTEN     24838/mysqld_export
#结果显示:该组件对外暴露的端口是 9104 端口
#可以查看参数地址
]#curl 127.0.0.1:9104/metrics/

7.2.2.3 修改 Prometheus 配置

#修改prometheus的配置文件,让它自动过滤文件中的节点信息
vim /usr/local/prometheus/conf/prometheus.yml
...
  - job_name: "mysqld_exporter"
    static_configs:
      - targets: ["10.0.0.153:9104"]

#重启服务
systemctl reload prometheus.service

7.2.2.4 Grafana 图形展示

http://10.0.0.151:3000/
17320 中文版 
#数据源之前已经到导入过了,在左侧connections下 Data sources
#左侧dashboards油车new下点击import,选17320,名字加-17320,数据源选Prometheus

7.3 Haproxy 监控

Haproxy的监控有两种实现方式
1.借助于专用的haproxy_exporter组件来采集 haproxy的csv数据
haproxy_exporter 可以和 haproxy 处于不同的环境,不同主机等
2.借助于 haproxy本身的机制,暴露metrics指标
/metrics 和 /haproxy-status 是同时配置的
相当于 zookeeper 的 /metrics 

7.3.1 Haproxy_exporter 监控

7.3.1.2 实战案例

#安装haproxy软件
apt -y install haproxy

#设定haproxy配置文件
cat /etc/haproxy/haproxy.cfg 
global
......
   stats socket /run/haproxy/admin.sock mode 660 level admin expose-fd 
listeners
......
listen stats    #追加内容
   mode http
   bind 0.0.0.0:9999
   stats enable
   log global
   stats uri     /haproxy-status
   stats auth   admin:123456

#重启haproxy服务
systemctl restart haproxy.service

#浏览器访问 10.0.0.106:9999/haproxy-status 页面

7.3.1.2.2 安装 Haproxy Exporter 组件

https://github.com/prometheus/haproxy_exporter

#获取软件
wget
https://github.com/prometheus/haproxy_exporter/releases/download/v0.13.0/haproxy_exporter-0.13.0.linux-amd64.tar.gz

#解压软件
tar xf haproxy_exporter-0.13.0.linux-amd64.tar.gz -C /usr/local/
ln -s /usr/local/haproxy_exporter-0.13.0.linux-amd64 /usr/local/haproxy_exporter
cd /usr/local/haproxy_exporter/
mkdir bin
mv haproxy_exporter bin/

#修改haproxy_exporter的服务启动文件
vim /lib/systemd/system/haproxy_exporter.service
[Unit]
Description=haproxy exporter project
After=network.target

[Service]
Type=simple
ExecStart=/usr/local/haproxy_exporter/bin/haproxy_exporter --haproxy.scrape-uri="http://admin:123456@127.0.0.1:9999/haproxy-status;csv"
#也支持通过socket文件实现
#ExecStart=/usr/local/haproxy_exporter/bin/haproxy_exporter --haproxy.scrape-uri=unix:/run/haproxy/admin.sock
Restart=on-failure

[Install]
WantedBy=multi-user.target

#配置解析:在原来的配置文件基础上,添加了 --haproxy.scrape-uri属性来指定haproxy状态值的获取

#重载并重启服务
systemctl daemon-reload
systemctl enable --now haproxy_exporter.service
systemctl status haproxy_exporter.service

#检查是否监听9101/tcp端口
ss -ntlp|grep haproxy
LISTEN    0 492    0.0.0.0:9999 0.0.0.0:*       users:(("haproxy",pid=124021,fd=7))     
LISTEN    0 4096         *:9101       *:*       users:(("haproxy_exporte",pid=126538,fd=3)) 
#访问参数页面
curl 127.0.0.1:9101/metrics

7.3.1.2.3 修改 Prometheus 配置

#修改prometheus的配置文件,让它自动过滤文件中的节点信息
vim /usr/local/prometheus/conf/prometheus.yml
...
  - job_name: "haproxy_exporter"
    static_configs:
      - targets: ["10.0.0.104:9101"]
#重启服务
systemctl reload prometheus.service
#稍等几秒钟,到浏览器中查看监控目标

7.3.2 Haproxy 内置功能实现监控

7.3.2.1.1 包安装 haproxy

Ubuntu 22.04 包安装默认内置了 /metrics 的接口,无需编译安装

7.3.2.1.2 编译安装 haproxy

#定制编译变量(通过USE_PROMEX=1打开/metrics功能)
make -j $(nproc) ARCH=x86_64 TARGET=linux-glibc USE_PCRE=1 USE_OPENSSL=1
USE_ZLIB=1 USE_SYSTEMD=1 USE_CPU_AFFINITY=1 USE_PROMEX=1 USE_LUA=1
LUA_INC=/usr/local/lua-5.4.3/src/ LUA_LIB=/usr/local/lua-5.4.3/src/ 

#准备配置文件(暴露/metrics)
vim /etc/haproxy/haproxy.cfg 
global
   maxconn 100000
    chroot /usr/local/haproxy
   stats socket /var/lib/haproxy/haproxy.sock mode 600 level admin
   daemon
   pidfile /var/lib/haproxy/haproxy.pid
   log 127.0.0.1 local7 debug

defaults
   option http-keep-alive
   option forwardfor
   maxconn 100000
   mode http
   timeout connect 300000ms
   timeout client 300000ms
   timeout server 300000ms

frontend stats
   bind *:9999
   stats enable
   stats uri /haproxy-status
   stats refresh 10s
   http-request use-service prometheus-exporter if { path /metrics }  #添加此行实现/metrics暴露

#可以查看当前安装的haproxy是否包含USE_PROMEX=1选项
]#haproxy -vv

7.4 Java 应用监控

这里java应用以tomcat为例

7.4.1 准备 Java 环境

#方法1:包安装 Tomcat
[root@ubuntu2004 ~]#apt update && apt -y install tomcat9

7.4.2 准备 Jmx Exporter

#获取软件
#新版本
wget h
ttps://repo.maven.apache.org/maven2/io/prometheus/jmx/jmx_prometheus_javaagent/0.20.0/jmx_prometheus_javaagent-0.20.0.jar

#可能需要上外网(下载获取tomcat参数的配置文件)
wget https://github.com/prometheus/jmx_exporter/blob/main/example_configs/tomcat.yml
wget https://raw.githubusercontent.com/prometheus/jmx_exporter/master/example_configs/tomcat.yml
#文件内容(不下载的话,把这些复制也可以)
vim tomcat.yml 
---   
lowercaseOutputLabelNames: true
lowercaseOutputName: true
rules:
- pattern: 'Catalina<type=GlobalRequestProcessor, name=\"(\w+-\w+)-(\d+)\"><>(\w+):'
  name: tomcat_$3_total
  labels:
    port: "$2"
    protocol: "$1"
  help: Tomcat global $3
  type: COUNTER
- pattern: 'Catalina<j2eeType=Servlet, WebModule=//([-a-zA-Z0-9+&@#/%?=~_|!:.,;]*[-a-zA-Z0-9+&@#/%=~_|]), name=([-a-zA-Z0-9+/$%~_-|!.]*), J2EEApplication=none, J2EEServer=none><>(requestCount|maxTime|processingTime|errorCount):'
  name: tomcat_servlet_$3_total
  labels:
    module: "$1"
    servlet: "$2"
  help: Tomcat servlet $3 total
  type: COUNTER
- pattern: 'Catalina<type=ThreadPool, name="(\w+-\w+)-(\d+)"><>(currentThreadCount|currentThreadsBusy|keepAliveCount|pollerThreadCount|connectionCount):'
  name: tomcat_threadpool_$3
  labels:
    port: "$2"
    protocol: "$1"
  help: Tomcat threadpool $3
  type: GAUGE
- pattern: 'Catalina<type=Manager, host=([-a-zA-Z0-9+&@#/%?=~_|!:.,;]*[-a-zA-Z0-9+&@#/%=~_|]), context=([-a-zA-Z0-9+/$%~_-|!.]*)><>(processingTime|sessionCounter|rejectedSessions|expiredSessions):'
  name: tomcat_session_$3_total
  labels:
    context: "$2"
    host: "$1"
  help: Tomcat session $3 total
  type: COUNTER
  
#准备相关文件
#1:包安装tomcat
mv jmx_prometheus_javaagent-0.20.0.jar /usr/share/tomcat9/
mv tomcat.yml /usr/share/tomcat9/

#修改tomcat的启动脚本 catalina.sh  (参考了官方的启动方式)
#方式1:包安装tomcat,9527为监听的端口号
vim /usr/share/tomcat9/bin/catalina.sh
.......
#java启动参数
JAVA_OPTS="-javaagent:/usr/share/tomcat9/jmx_prometheus_javaagent-0.20.0.jar=9527:/usr/share/tomcat9/tomcat.yml"
# OS specific support. $var _must_ be set to either true or false.
......
[root@ubuntu2204 ~]#systemctl restart tomcat9.service
#可以获取指标了
]#curl 127.0.0.1:9527/metrics

7.4.3 修改 Prometheus 配置

#修改prometheus的配置文件,让它自动过滤文件中的节点信息
vim /usr/local/prometheus/conf/prometheus.yml
...
  - job_name: "mertics_from_tomcat"
    static_configs:
      - targets: ["10.0.0.153:9527"]
      
#重启服务
systemctl reload prometheus.service
#稍等几秒钟,到浏览器中查看监控目标

7.4.4 Grafana 图形展示

8704
#导入8704,job名输入mertics_from_tomcat

7.5 Redis 监控

7.5.1 基于二进制实现 redis_exporter

https://github.com/oliver006/redis_exporter

[root@node03 ~]#apt update && apt -y install redis 
[root@node03 ~]#vim /etc/redis/redis.conf
bind 0.0.0.0
requirepass 123456
[root@node03 ~]#systemctl restart redis
]#redis-cli -a 123456 info

[root@node03 ~]#tar xf redis_exporter-v1.58.0.linux-amd64.tar.gz -C /usr/local/
[root@node03 ~]#cd /usr/local/
[root@node03 local]#ln -s redis_exporter-v1.58.0.linux-amd64/ redis_exporter
]#cd redis_exporter
[root@node03 redis_exporter]#./redis_exporter -redis.password 123456
#已暴露
[root@node03 ~]#curl 127.0.0.1:9121/metrics

#配置Prometheus
[root@prometheus ~]#vim /usr/local/prometheus/conf/prometheus.yml
  - job_name: 'redis_exporter'
    static_configs:
      - targets: ["10.0.0.153:9121"]
[root@prometheus ~]#systemctl reload prometheus.service

7.6 Nginx 监控

7.6.1 nginx-prometheus-exporter 容器实现

https://hub.docker.com/r/nginx/nginx-prometheus-exporter

[root@node01 ~]#apt install docker.io nginx -y
#开启nginx状态页
[root@node01 ~]#vim /etc/nginx/sites-enabled/default
   location /stub_status {
         stub_status;
   }
]#systemctl reload nginx.service
[root@node01 ~]#curl 127.0.0.1/stub_status
Active connections: 1 
server accepts handled requests
 2 2 2 
Reading: 0 Writing: 1 Waiting: 0

#拉取启动docker
[root@node01 ~]#docker run -p 9113:9113 nginx/nginx-prometheus-exporter:1.1.0 --nginx.scrape-uri=http://localhost/stub_status

[root@node01 ~]#curl 127.0.0.1:9113/metrics

#纳入Prometheus监控里
[root@prometheus ~]#vim /usr/local/prometheus/conf/prometheus.yml
 - job_name: 'nginx_exporter'
   static_configs:
   - targets: ["10.0.0.151:9113"]
[root@prometheus ~]#systemctl reload prometheus.service

7.6.2 nginx-vts-exporter 实现

7.6.2.1 编译安装 Nginx 添加模块

7.7 Consul 监控

Consul Exporter 可以实现对 Consul 的监控

7.7.1 下载程序包和展开程序包

#先安装consul.再部署consul_exporter
curl -LO https://github.com/prometheus/consul_exporter/releases/download/v0.8.0/consul_ex
porter-0.11.0.linux-amd64.tar.gz

tar xf consul_exporter-0.11.0.linux-amd64.tar.gz -C /usr/local/
ln -sv /usr/local/consul_exporter-0.11.0.linux-amd64 /usr/local/consul_exporter
cd /usr/local/
#可以启动(默认连接本地8500端口)
consul_exporter/consul_exporter
#默认9107,已经可以访问端口了
curl 127.0.0.1:9107/metrics

7.7.2 创建用户

#若consul用户已经存在,可略过该步骤:
useradd -r consul

7.7.3 创建service文件

保存于/lib/systemd/system/consul_exporter.service文件中

#vim /lib/systemd/system/consul_exporter.service
[Unit]
Description=consul_exporter
Documentation=https://prometheus.io/docs/introduction/overview/
After=network.target

[Service]
Type=simple
User=consul
EnvironmentFile=-/etc/default/consul_exporter
# 具体使用时,若consul_exporter与consul server不在同一主机时,consul server要指向实际的地址;
ExecStart=/usr/local/consul_exporter/consul_exporter \
            --consul.server="http://localhost:8500" \
            --web.listen-address=":9107" \
            --web.telemetry-path="/metrics" \
            --log.level=info \
            $ARGS
ExecReload=/bin/kill -HUP $MAINPID
TimeoutStopSec=20s
Restart=always

[Install]
WantedBy=multi-user.target

#启动服务
systemctl daemon-reload
systemctl enable --now consul_exporter.service

7.7.5 修改prometheus配置文件监控 consul_exporter

vim /usr/local/prometheus/conf/prometheus.yml
.....
  - job_name: "consul_exporter"
    static_configs:
      - targets: ["10.0.0.152:9107"]
.....

systemctl reload prometheus.service

7.8 黑盒监控 blackbox_exporter

黑盒测试,主要是测试连通性(icmp, tcp port, http/https)

7.8.2 blackbox_exporter 安装

https://prometheus.io/download/#blackbox_exporter

 7.8.2.1 二进制安装

[root@ubuntu2204 ~]#cd /usr/local/src
[root@ubuntu2204 src]#wget https://github.com/prometheus/blackbox_exporter/releases/download/v0.22.0/blackbox_exporter-0.22.0.linux-amd64.tar.gz

[root@ubuntu2204 src]#tar xf blackbox_exporter-0.24.0.linux-amd64.tar.gz -C /usr/local/
[root@ubuntu2204 src]#ln -s /usr/local/blackbox_exporter-0.24.0.linux-amd64/ /usr/local/blackbox_exporter
[root@ubuntu2204 src]#ls /usr/local/blackbox_exporter
blackbox_exporter blackbox.yml LICENSE NOTICE

[root@ubuntu2204 ~]#cd /usr/local/blackbox_exporter/
[root@ubuntu2204 blackbox_exporter]#mkdir bin conf
[root@ubuntu2204 blackbox_exporter]#mv blackbox_exporter bin/
[root@ubuntu2204 blackbox_exporter]#mv blackbox.yml conf/

#默认配置文件无需修改
[root@ubuntu2204 ~]#cat /usr/local/blackbox_exporter/conf/blackbox.yml

#创建service文件
[root@ubuntu2204 ~]#cat > /lib/systemd/system/blackbox_exporter.service
[Unit]
Description=Prometheus Black Exporter
After=network.target

[Service]
Type=simple
ExecStart=/usr/local/blackbox_exporter/bin/blackbox_exporter --config.file=/usr/local/blackbox_exporter/conf/blackbox.yml --web.listen-address=:9115
Restart=on-failure
LimitNOFILE=100000

[Install]
WantedBy=multi-user.target

[root@ubuntu2204 ~]#systemctl daemon-reload ;systemctl enable --now blackbox_exporter

#浏览器访问下面链接,可以看到如下(里面的metrics是自身的指标)
http://10.0.0.151:9115/

7.8.3 Prometheus 配置定义监控规则

在 Prometheus 上定义实现具体的业务的监控规则的配置

7.8.3.1 网络连通性监控

[root@ubuntu2204 ~]#vim /usr/local/prometheus/conf/prometheus.yml
......
  # ping 检测
  - job_name: 'ping_status_blackbox_exporter'
    metrics_path: /probe
    params:
      module: [icmp]                        #探测方式
    static_configs:
      - targets: ['www.wangxiaochun.com','www.google.com']   #探测的目标主机地址
        labels:
          instance: 'ping_status'
          group: 'icmp'
    relabel_configs:
      - source_labels: [__address__] #修改目标URL地址的标签[__address__]为__param_target,用于发送给blackbox使用
        target_label: __param_target #此为必须项
      - target_label: __address__    #添加新标签.用于指定black_exporter服务器地址,此为必须项
        replacement: black-exporter.wang.org:9115 #指定black_exporter服务器地址,注意名称解析
      - source_labels: [__param_target]  #Grafana 使用此标签进行显示
        target_label: ipaddr
.....

[root@ubuntu2204 ~]#promtool check config /usr/local/prometheus/conf/prometheus.yml
[root@ubuntu2204 ~]#systemctl reload prometheus.service

#通过blackbox_exporter的网页 http://10.0.0.151:9115/ 查看连接成功失败

7.8.3.2 TCP端口连通性监控

[root@ubuntu2204 ~]#vim /usr/local/prometheus/conf/prometheus.yml
......
  #端口监控
  - job_name: 'port_status_blackbox_exporter'
    metrics_path: /probe
    params:
      module: [tcp_connect]
    static_configs:
      - targets: ['www.wangxiaochun.com:8888']
        labels:
          instance: 'port_status'
          group: 'port'
    relabel_configs:
      - source_labels: [__address__] #修改目标URL地址的标签[__address__]为__param_target,用于发送给blackbox使用
        target_label: __param_target #此为必须项
      - target_label: __address__    #添加新标签.用于指定black_exporter服务器地址,此为必须项
        replacement: black-exporter.wang.org:9115 #指定black_exporter服务器地址,注意名称解析
      - source_labels: [__param_target]  #Grafana 使用此标签进行显示
        target_label: ipaddr_port
.....

[root@ubuntu2204 ~]#promtool check config /usr/local/prometheus/conf/prometheus.yml
[root@ubuntu2204 ~]#systemctl reload prometheus.service

7.8.3.3 Http/Https 网站监控

有证书过期时间

[root@ubuntu2204 ~]#vim /usr/local/prometheus/conf/prometheus.yml
......
   # 网站监控
  - job_name: 'http_status_blackbox_exporter'
    metrics_path: /probe
    params:
      module: [http_2xx]
    static_configs:  #如果有https网站,还会自动额外显示TLS版本和证书的有效期,但有些网站可能不会显示证书信息,比如taobao
      - targets: ['https://www.baidu.com','http://www.wangxiaochun.com'] #baidu必须加https才能显示,xiaomi不需要
        #- www.jd.com
        #- www.taobao.com
        labels:                       #添加标签
          instance: http_status
          group: web
    relabel_configs:
      - source_labels: [__address__]  #修改目标URL地址的标签[__address__]为__param_target,用于发送给blackbox使用
        target_label: __param_target  #此为必须项
      - target_label: __address__     #添加新标签,用于指定black_exporter服务器地址,此为必须项
        replacement: black-exporter.wang.org:9115  #指定black_exporter服务器地址,注意名称解析
      - source_labels: [__param_target]  #Grafana 使用此url标签,否则有些模板可能无法显示
        target_label: url
      #- target_label: region       #测试添加标签,可选
      # replacement: "remote"
......

#服务生效
[root@ubuntu2204 ~]#promtool check config /usr/local/prometheus/conf/prometheus.yml
[root@ubuntu2204 ~]#systemctl reload prometheus

7.8.4 Grafana 展示

10.0.0.151:3000
#grafana导入9965 的模板, 选择数据源
只能能看到证书过期时间

8 Prometheus 实现容器监控

8.1 cAdvisor 简介

采集docker信息,通过宿主机上的文件采集出docker的对应的信息

8.2 cAdvisor 安装

cAdvisor本身是个docker容器

在需要被监控docker的主机准备 docker 环境

8.2.2 Docker 方式安装 cAdvisor

范例: 拉取镜像

#dockerhub上的版本比较老,谷歌不更新了,要去谷歌网站
#安装说明
https://github.com/google/cadvisor/
#容器下载
gcr.io/cadvisor/cadvisor

#范例: 拉取镜像
#docker官方仓库的cAdvisor镜像只有旧版本,而且不再更新
docker pull google/cadvisor:v0.33.0  
#从google下载最新版的docker镜像,需要上外网
docker pull gcr.io/cadvisor/cadvisor:v0.49.1
docker pull gcr.io/cadvisor/cadvisor:v0.47.0
docker pull gcr.io/cadvisor/cadvisor:v0.37.0
#从国内镜像下载
docker pull wangxiaochun/cadvisor:v0.49.1
docker pull wangxiaochun/cadvisor:v0.47.0
docker pull wangxiaochun/cadvisor:v0.45.0
docker pull wangxiaochun/cadvisor:v0.37.0

#代理网站下载:https://dockerproxy.com/ (输入gcr.io/cadvisor/cadvisor:v0.49.1)
docker pull gcr.dockerproxy.com/cadvisor/cadvisor:v0.49.1
#第三方镜像
https://hub.docker.com/r/zcube/cadvisor/tags

范例:在线下载并启动

#从google官方下载需要上外网
]#VERSION=v0.49.1
]#docker run \
  --volume=/:/rootfs:ro \
  --volume=/var/run:/var/run:ro \
  --volume=/sys:/sys:ro \
  --volume=/var/lib/docker/:/var/lib/docker:ro \
  --volume=/dev/disk/:/dev/disk:ro \
  --publish=8080:8080 \
  --detach=true \
  --name=cadvisor \
  --privileged \
  --device=/dev/kmsg \
 gcr.dockerproxy.com/cadvisor/cadvisor:$VERSION

#从国内镜像在线下载镜像
VERSION=v0.47.0
docker run \
  --volume=/:/rootfs:ro \
  --volume=/var/run:/var/run:ro \
  --volume=/sys:/sys:ro \
  --volume=/var/lib/docker/:/var/lib/docker:ro \
  --volume=/dev/disk/:/dev/disk:ro \
  --publish=8080:8080 \
  --detach=true \
  --name=cadvisor \
  --privileged \
  --device=/dev/kmsg \
 wangxiaochun/cadvisor:$VERSION
 
 #跑个nginx容器,之后看容器信息
 ]#docker run -d --name mynginx nginx
 
 #启动后,可以访问下面链接(能即使发现本机上对应的容器)
 http://10.0.0.151:8080/
 #点击Docker Containers可以看到自己的容器,点击看对应容器指标
 http://10.0.0.151:8080/containers/
 #指标地址
 http://10.0.0.151:8080/metrics

8.3 Prometheus 配置

修改 Prometheus 配置

#修改prometheus的配置文件,让它自动过滤文件中的节点信息
# vim /usr/local/prometheus/conf/prometheus.yml
...
  - job_name: "cadvisor"
    static_configs:
      - targets: #添加安装cAdvisor的主机
        - "10.0.0.151:8080"
        #- "10.0.0.102:8080" #这里就一台机器,下面都注释了
        #- "10.0.0.103:8080"
        #- "10.0.0.104:8080"
        #- "10.0.0.105:8080"
        #- "10.0.0.106:8080"
      
#重启服务
systemctl reload prometheus.service
#稍等几秒钟,到浏览器中查看监控目标

8.5 Grafana 监控

导入指定模板 193或14282

 

9 Prometheus Federation 联邦 (了解)

解决单机Prometheus性能问题, 只有大型项目才会用到

9.2 实战案例: Prometheus 联邦

 环境准备

#所有联邦节点和Prometheus的主节点安装方法是一样的
[root@ubuntu2204 ~]#bash install_prometheus.sh

#在所有被监控的节点上安装 Node Exporter,安装方式一样
[root@ubuntu2204 ~]#bash install_node_exporter.sh

#配置 Prometheus 联邦节点监控 Node Exporter
#第一个联邦节点配置监控Node Exporter
[root@ubuntu2204 ~]#tail /usr/local/prometheus/conf/prometheus.yml
  - job_name: "node_exporter"
    static_configs:
      - targets: ["10.0.0.101:9100"]
]#systemctl reload prometheus.service

#第二个联邦节点配置监控Node Exporter
[root@ubuntu2204 ~]#tail /usr/local/prometheus/conf/prometheus.yml 
.....
  - job_name: "node_exporter"
    static_configs:
      - targets: ["10.0.0.102:9100"]
]#systemctl reload prometheus.service

9.2.4 配置 Prometheus 主节点管理 Prometheus 联邦节点

范例: 配置 Prometheus 主节点管理 Prometheus 联邦节点

[root@ubuntu2204 ~]#vim /usr/local/prometheus/conf/prometheus.yml
  - job_name: 'federate-201'
    scrape_interval: 15s
    honor_labels: true
    metrics_path: '/federate'       #指定采集端点的路径,默认为/federate
    static_configs:
      - targets:
        - '10.0.0.201:9090'   #指定联邦节点prometheus节点地址,如果在k8s集群内,需要指定k8s的SVC的NodePort的地址信息   
    params:
      'match[]':
        - '{job="prometheus"}'      #指定只采集指定联邦节点的Job名称对应的数据,默认不指定不会采集任何联邦节点的采集的数据
        - '{job="node_exporter"}'   #指定采集联邦节点的job名称,和联邦节点配置的job_name必须匹配,如果不匹配则不会采集
        - '{__name__=~"job:.*"}'    #指定采集job:开头的job_name,多个匹配条件是或的关系
        
  - job_name: 'federate-202'
    scrape_interval: 15s
    honor_labels: true
    metrics_path: '/federate'
    static_configs: 
      - targets:
        - '10.0.0.202:9090'    #指定联邦节点prometheus节点地址,如果在k8s集群,需要指定k8s的SVC的NodePort的地址信息    
    params:
      'match[]':
        - '{job="prometheus"}'
        - '{__name__=~"job:.*"}'    #指定采集job:开头的job_name
        - '{__name__=~"node.*"}'    #指定从联邦节点中采集job_name以node开头的数据

]#systemctl reload prometheus.service

#这时可以在主Prometheus的网页搜参数可以看到下面所有节点

 

10 Prometheus 存储

10.1 Prometheus 本地存储

10.1.1 Prometheus TSDB数据库

10.1.2 Prometheus TSDB数据存储机制

1.最新的数据是保存在内存中的,并同时写入至预写日志(WAL)
2.以每2小时为一个时间窗口,将内存中的数据存储为一个单独的 Block
3.Block会被压缩及合并历史Block块,压缩合并后Block数量会减少
4.Block的大小并不固定,但最小会保存两个小时的数据
5.后续生成的新数据保存在内存和WAL中,重复以上过程

10.1.3 Prometheus 数据目录结构

10.1.6 Prometheus 配置本地存储相关选项

--storage.tsdb.path           #数据存储位置,默认是安装和录下的data子目录。
--storage.tsdb.retention.time #保留时间,默认是15天,过15天之后就删除。该配置会覆盖--storage.tsdb.retention的值。
--storage.tsdb.retention.size #要保留的块Block的最大字节数(不包括WAL大小)。比如:100GB,支持单位: B,KB, MB, GB, TB, PB, 
              EB如果达到指定大小,则最旧的数据会首先被删除。默认为0或禁用,注意:此值不是指定每个段文件chunk的大小
#注意:上面两个参数值retention.time和retention.size只要有一个满足条件,就会删除旧的数据 --storage.tsdb.wal-compression #开启预写日志的压缩,默认开启

10.2 Prometheus 远程存储 VictoriaMetrics

10.2.1 VictoriaMetrics 介绍

VictoriaMetrics支持高可用, 大型项目才会用

10.2.2 VictoriaMetrics 单机布署 (了解,单机和用Prometheus自己的差不多,没什么意义)

10.2.2.1 基于二进制单机部署

10.2.2.1.1 基于二进制安装

#官方下载: 
https://github.com/VictoriaMetrics/VictoriaMetrics/releases

#范例:
[root@ubuntu2204 ~]#cd /usr/local/src
[root@ubuntu2204 src]#wget https://github.com/VictoriaMetrics/VictoriaMetrics/releases/download/v1.82.1/victoria-metrics-linux-amd64-v1.82.1.tar.gz
[root@ubuntu2204 src]#tar tvf victoria-metrics-linux-amd64-v1.82.1.tar.gz
-rwxr-xr-x valyala/valyala 18627904 2022-10-14 15:16 victoria-metrics-prod
[root@ubuntu2204 src]#tar xf victoria-metrics-linux-amd64-v1.82.1.tar.gz
[root@ubuntu2204 src]#mv victoria-metrics-prod /usr/local/bin/

#查看支持选项
[root@ubuntu2204 src]#victoria-metrics-prod --help

#准备用户和数据目录
[root@ubuntu2204 ~]#useradd -r -s /sbin/nologin victoriametrics
[root@ubuntu2204 ~]#mkdir -p /data/victoriametrics
[root@ubuntu2204 ~]#chown victoriametrics.victoriametrics /data/victoriametrics

#创建 service 文件
[root@ubuntu2204 ~]#cat > /lib/systemd/system/victoriametrics.service <<EOF
[Unit]
Description=VictoriaMetrics
Documentation=https://docs.victoriametrics.com/Single-serverVictoriaMetrics.html
After=network.target

[Service]
Restart=on-failure
User=victoriametrics
Group=victoriametrics
ExecStart=/usr/local/bin/victoria-metrics-prod -httpListenAddr=0.0.0.0:8428 -
storageDataPath=/data/victoriametrics -retentionPeriod=12
#ExecReload=/bin/kill -HUP \$MAINPID
LimitNOFILE=65535

[Install]
WantedBy=multi-user.target
EOF

#说明
-httpListenAddr string #监听地址和端口,默认为0.0.0.0:8428
-storageDataPath string #指定数据存储路径,默认当前目录下的victoria-metrics-data
-retentionPeriod value  #指定数据保存时长,支持h (hour), d (day), w (week), y (year). 
If suffix isn't set, then the duration is counted in months (default 1)

#启动服务
[root@ubuntu2204 ~]#systemctl daemon-reload 
[root@ubuntu2204 ~]#systemctl enable --now victoriametrics
#查看状态
[root@ubuntu2204 ~]#systemctl status victoriametrics
#确认端口
[root@ubuntu2204 ~]#ss -ntlp|grep victoria
LISTEN 0      4096         0.0.0.0:8428       0.0.0.0:*   users:(("victoria-metric",pid=2836,fd=10)
#数据目录自动生成相关数据
[root@ubuntu2204 ~]#ls /data/victoriametrics/
data flock.lock indexdb metadata snapshots tmp

#浏览器访问:
http://victoriametrics.wang.org:8428/

10.2.2.1.2 修改prometheus 使用victoriametrics 实现远程存储

[root@ubuntu2204 ~]#vim /usr/local/prometheus/conf/prometheus.yml
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).
  
#加下面两行,和global平级
remote_write:
  - url: http://victoriametrics.wang.org:8428/api/v1/write
  
#重启生效
[root@ubuntu2204 ~]#systemctl resload prometheus.service

12.2.2.1.3 访问 victoriametrics 的Web UI 验证数据

http://victoriametrics.wang.org:8428/vmui

10.2.2.1.4 Grafana 展示 victoriametrics 数据

在Grafana 添加新的数据源,类型为 Prometheus,URL为 victoriametrics 的地址和端口

http://victoriametrics.wang.org:8428
#导入模板8919,1860,11074等模板,指定使用上面创建的数据源
#注意: 如果以前存在,先删除模板再导入

10.2.3 VictoriaMetrics 集群部署

至少3个节点: vmselect读, vmstorage存东西, vminsert写, 因为存在单点问题, 各自需要2个

实际上VictoriaMetrics自身就是个监控系统, 可以代替Prometheus, 我们这里只用他的远程存储功能

 集群版的victoriametrics有下面主要服务组成:

10.2.3.2 VictoriaMetrics 集群二进制部署

以下实现部署一个三节点的 VictoriaMetrics 集群,且三节点同时都提供vmstorage,vminsert和 vmselect角色

这个方案,vmstorage如果坏一个,就丢1/3数据,解决这个问题,可用vmstorage副本技术

10.2.5.2.1 下载集群二进制程序文件

在所有三个节点下载集群的二进制程序文件

[root@ubuntu2204 ~]#cd /usr/local/src
[root@ubuntu2204 src]#wget https://github.com/VictoriaMetrics/VictoriaMetrics/releases/download/v1.82.1/victoria-metrics-linux-amd64-v1.82.1-cluster.tar.gz

[root@ubuntu2204 src]#tar tvf victoria-metrics-linux-amd64-v1.82.1-cluster.tar.gz 
-rwxr-xr-x valyala/valyala 11964760 2022-10-14 15:32 vminsert-prod
-rwxr-xr-x valyala/valyala 13493976 2022-10-14 15:32 vmselect-prod
-rwxr-xr-x valyala/valyala 12269208 2022-10-14 15:32 vmstorage-prod

[root@ubuntu2204 src]#tar xf victoria-metrics-linux-amd64-v1.82.1-cluster.tar.gz -C /usr/local/bin/
[root@ubuntu2204 src]#ls /usr/local/bin/
vminsert-prod vmselect-prod vmstorage-prod

10.2.3.2.2 配置和启动 vmstorage

在所有三个节点都部署 vmstorage

[root@ubuntu2204 ~]#mkdir -p /data/vmstorage

#查看选项
[root@ubuntu2204 ~]#vmstorage-prod --help

#创建 service 文件
[root@ubuntu2204 ~]#cat > /lib/systemd/system/vmstorage.service <<EOF
[Unit]
Description=VictoriaMetrics Cluster Vmstorage
Documentation=https://docs.victoriametrics.com/Cluster-VictoriaMetrics.html
After=network.target

[Service]
Restart=on-failure
ExecStart=/usr/local/bin/vmstorage-prod  -httpListenAddr :8482 -vminsertAddr:8400 -vmselectAddr :8401 -storageDataPath /data/vmstorage -loggerTimezone Asia/Shanghai
#ExecReload=/bin/kill -HUP \$MAINPID
LimitNOFILE=65535

[Install]
WantedBy=multi-user.target
EOF

#主要参数说明:
-loggerTimezone string
#Timezone to use for timestamps in logs. Timezone must be a valid IANA Time Zone. 
For example: America/New_York, Europe/Berlin, Etc/GMT+3 or Local (default "UTC")
-httpListenAddr string
#Address to listen for http connections (default ":8482")
-vminsertAddr string
#TCP address to accept connections from vminsert services (default ":8400")
-vmselectAddr string
#TCP address to accept connections from vmselect services (default ":8401")

[root@ubuntu2204 ~]#systemctl daemon-reload;systemctl enable --now 
vmstorage;systemctl status vmstorage

[root@ubuntu2204 ~]#ss -nltp |grep vmstorage
LISTEN 0      4096               0.0.0.0:8400       0.0.0.0:*   users:
(("vmstorage-prod",pid=2415,fd=10))
LISTEN 0      4096               0.0.0.0:8401       0.0.0.0:*   users:
(("vmstorage-prod",pid=2415,fd=11))
LISTEN 0      4096               0.0.0.0:8482       0.0.0.0:*   users:
(("vmstorage-prod",pid=2415,fd=12))
[root@ubuntu2204 ~]#pstree -p |grep vmstorage-prod
           `-vmstorage-prod(2415)-+-{vmstorage-prod}(2416)
                                 |-{vmstorage-prod}(2417)
                                 |-{vmstorage-prod}(2418)
                                 |-{vmstorage-prod}(2419)
                                 |-{vmstorage-prod}(2420)
                                  `-{vmstorage-prod}(2421)
                                  
[root@ubuntu2204 ~]#ls /data/vmstorage/
data flock.lock indexdb metadata snapshots
#测试访问
http://10.0.0.201:8482/metrics
http://10.0.0.202:8482/metrics
http://10.0.0.203:8482/metrics

10.2.3.2.3 配置和启动 vminsert

在所有三个节点部署 vminsert

#查看选项
[root@ubuntu2204 ~]#vminsert-prod --help

[root@ubuntu2204 ~]#cat > /lib/systemd/system/vminsert.service <<EOF
[Unit]
Description=VictoriaMetrics Cluster Vminsert
Documentation=https://docs.victoriametrics.com/Cluster-VictoriaMetrics.html
After=network.target

[Service]
Restart=on-failure
ExecStart=/usr/local/bin/vminsert-prod -httpListenAddr :8480 -
storageNode=10.0.0.201:8400,10.0.0.202:8400,10.0.0.203:8400
#ExecReload=/bin/kill -HUP \$MAINPID
LimitNOFILE=65535

[Install]
WantedBy=multi-user.target
EOF

#主要参数说明:
-httpListenAddr string
#Address to listen for http connections (default ":8480")
-storageNode array
#Comma-separated addresses of vmstorage nodes; usage: -storageNode=vmstoragehost1,...,vmstorage-hostN,Supports an array of values separated by comma or specified via multiple flags.
-replicationFactor int  
#此选项可以实现多副本,实现数据高用性
#Replication factor for the ingested data, i.e. how many copies to make among distinct -storageNode instances. Note that vmselect must run with -dedup.minScrapeInterval=1ms for data de-duplication when replicationFactor is greater than 1. Higher values for -dedup.minScrapeInterval at vmselect is OK (default 1)
https://docs.victoriametrics.com/Cluster-VictoriaMetrics.html #replication-and-data-safety

[root@ubuntu2204 ~]#systemctl daemon-reload;systemctl enable --now vminsert
[root@ubuntu2204 ~]#systemctl status vminsert

[root@ubuntu2204 ~]#ss -nltp |grep vminsert
LISTEN 0      4096                           0.0.0.0:8480       0.0.0.0:*   
users:(("vminsert-prod",pid=2182,fd=3)) 
[root@ubuntu2204 ~]#pstree -p |grep vminsert-prod
           |-vminsert-prod(2182)-+-{vminsert-prod}(2183)
           |                     |-{vminsert-prod}(2184)
           |                     |-{vminsert-prod}(2185)
           |                     |-{vminsert-prod}(2186)
           |                     |-{vminsert-prod}(2187)
           |                     |-{vminsert-prod}(2188)
           |                     `-{vminsert-prod}(2189)
#测试访问
http://10.0.0.201:8480/metrics
http://10.0.0.202:8480/metrics
http://10.0.0.203:8480/metrics

10.2.3.2.4 配置和启动 vmselect

在所有三个节点部署 vmselect

#查看选项
[root@ubuntu2204 ~]#vmselect-prod --help
[root@ubuntu2204 ~]#cat > /lib/systemd/system/vmselect.service <<EOF
[Unit]
Description=VictoriaMetrics Cluster Vmselect
Documentation=https://docs.victoriametrics.com/Cluster-VictoriaMetrics.html
After=network.target

[Service]
Restart=on-failure
ExecStart=/usr/local/bin/vmselect-prod  -httpListenAddr :8481 -
storageNode=10.0.0.201:8401,10.0.0.202:8401,10.0.0.203:8401
#ExecReload=/bin/kill -HUP \$MAINPID
LimitNOFILE=65535

[Install]
WantedBy=multi-user.target
EOF

#主要参数说明:
-httpListenAddr string
#Address to listen for http connections (default ":8481")
-storageNode array
#Comma-separated addresses of vmstorage nodes; usage: -storageNode=vmstorage-host1,...,vmstorage-hostN,Supports an array of values separated by comma or specified via multiple flags.

[root@ubuntu2204 ~]#systemctl daemon-reload;systemctl enable --now vmselect
[root@ubuntu2204 ~]#systemctl status vmselect

[root@ubuntu2204 ~]#ss -nltp |grep vmselect
LISTEN 0      4096               0.0.0.0:8481       0.0.0.0:*   users:
(("vmselect-prod",pid=2592,fd=9))
[root@ubuntu2204 ~]#pstree -p |grep vmselect-prod
           |-vmselect-prod(2592)-+-{vmselect-prod}(2593)
           |                     |-{vmselect-prod}(2594)
           |                     |-{vmselect-prod}(2595)
           |                     |-{vmselect-prod}(2596)
           |                     |-{vmselect-prod}(2597)
           |                     |-{vmselect-prod}(2598)
           |                     `-{vmselect-prod}(2599) 
#查看端口
[root@ubuntu2204 ~]#ss -ntl|grep 84
LISTEN 0      4096               0.0.0.0:8480       0.0.0.0:*          
LISTEN 0      4096               0.0.0.0:8481       0.0.0.0:*          
LISTEN 0      4096               0.0.0.0:8482       0.0.0.0:*          
LISTEN 0      4096               0.0.0.0:8400       0.0.0.0:*          
LISTEN 0      4096               0.0.0.0:8401       0.0.0.0:*  

#测试访问
http://10.0.0.201:8481/metrics
http://10.0.0.202:8481/metrics
http://10.0.0.203:8481/metrics

10.2.3.2.5 配置 Prometheus 使用 victoriametrics 实现集群存储

[root@ubuntu2204 ~]#vim /usr/local/prometheus/conf/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).
#加下面集群地址的行
remote_write:
  - url: http://10.0.0.201:8480/insert/0/prometheus
  - url: http://10.0.0.202:8480/insert/0/prometheus
  - url: http://10.0.0.203:8480/insert/0/prometheus
remote_read:
  - url: http://10.0.0.201:8481/select/0/prometheus
  - url: http://10.0.0.202:8481/select/0/prometheus
  - url: http://10.0.0.203:8481/select/0/prometheus  
#说明
10.0.0.20[1-3]:8480为 三个集群节点的IP和vminsert组件端口
0表示租户ID,即逻辑名称空间,用于区分不同的prometheus集群

[root@ubuntu2204 ~]#systemctl reload prometheus.service

10.2.3.2.6 Grafna 展示

#在Grafana 添加新的数据源,类型为 Prometheus,URL为 victoriametrics 任意集群节点的的地址和vmselect端口,如下填写
http://10.0.0.201:8481/select/0/prometheus
#0表示租户ID

#也可以使用负载均衡的VIP和端口,以Haproxy为例,如下配置
vim /etc/haproxy/haproxy.cfg
......
listen victoriametrics-vmselect-8481
   bind 10.0.0.200:8481
   mode tcp
   server vmselect1 10.0.0.201:8481 check inter 1s fall 3 rise 5
   server vmselect2 10.0.0.202:8481 check inter 1s fall 3 rise 5
   server vmselect3 10.0.0.203:8481 check inter 1s fall 3 rise 5
......

#URL填写下面VIP地址和端口
http://10.0.0.200:8481/select/0/prometheus

#导入模板 8919或11074或13824,指定使用上面创建的数据源, 注意: 如果以前存在,先删除模板再导入

 

posted @ 2024-10-31 15:56  战斗小人  阅读(9)  评论(0编辑  收藏  举报