Prometheus03 Prometheus服务发现, 各种exporter, 容器化监控, Federation联邦, VictoriaMetrics远程存储
6 服务发现
6.1 服务发现原理
#准备主机节点列表文件,可以支持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.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.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.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.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>
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>
[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网页上也可以看到变更
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.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.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
Haproxy的监控有两种实现方式 1.借助于专用的haproxy_exporter组件来采集 haproxy的csv数据 haproxy_exporter 可以和 haproxy 处于不同的环境,不同主机等 2.借助于 haproxy本身的机制,暴露metrics指标 /metrics 和 /haproxy-status 是同时配置的 相当于 zookeeper 的 /metrics
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
这里java应用以tomcat为例
7.4.1 准备 Java 环境
#方法1:包安装 Tomcat [root@ubuntu2004 ~]#apt update && apt -y install tomcat9
#获取软件 #新版本 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
#修改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.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.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.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
#若consul用户已经存在,可略过该步骤: useradd -r consul
保存于/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
vim /usr/local/prometheus/conf/prometheus.yml ..... - job_name: "consul_exporter" static_configs: - targets: ["10.0.0.152:9107"] ..... systemctl reload prometheus.service
黑盒测试,主要是测试连通性(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/
在 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
10.0.0.151:3000 #grafana导入9965 的模板, 选择数据源 只能能看到证书过期时间
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
修改 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性能问题, 只有大型项目才会用到
环境准备
#所有联邦节点和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中,重复以上过程
--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.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
在所有三个节点都部署 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
在所有三个节点部署 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,指定使用上面创建的数据源, 注意: 如果以前存在,先删除模板再导入