写点什么

多种姿势搞定 Tidb 集群监控大屏

  • 2022 年 8 月 26 日
    北京
  • 本文字数:3937 字

    阅读完需:约 13 分钟

作者: dba_360- 顾大伟原文来源:https://tidb.net/blog/5265be27

背景

Tidb 集群部署会自带一套完整的监控体系,给广大 tidb 粉带来了便利,方便的同时也是存在一些槽点,比如监控组件过多,收集的指标过广,出现性能问题在看监控的时候一时摸不到头脑, 无从下手,意识到这点 Tidb 在 V6.1.0 也推出了 Performance Overview 面板,抽出了关键指标供我们快速查询,这点还是不错的,但是还有个问题就是多集群 如何实现一起监控,几百上千个实例大屏展示如何实现,领导要统计数据一时半会拿不出咋办呢?定期巡检集群一眼看出端倪?下面主要就是解决上述问题

方案一:Prometheus+grafana+consul

1.1 架构图


默认 Tidb 安装完成 promethes+grafana 已经部署好了,在此不再部署

1.2 部署 consul

Wget https://releases.hashicorp.com/consul/1.6.1/consul_1.6.1_linux_amd64.zip


unzip consul_1.6.1_linux_amd64.zip && cp consul /sbin/ &&mkdir -p /etc/consul.d/ && mkdir -p /data1/consul/


创建配置文件


cat /etc/consul.d/server.json
{
"datacenter": "bjyt",
"data_dir": "/data1/consul",
"log_level": "INFO",
"node_name": "consul-server",
"server": true,
"bootstrap_expect": 1,
"bind_addr": "xx.xx.xx.xx",
"client_addr": "xx.xx.xx.xx",
"ui":true,
"retry_join": ["xx.xx.xx.xx"],
"retry_interval": "10s",
"enable_debug": false,
"rejoin_after_leave": true,
"start_join": ["xx.xx.xx.xx"],
"enable_syslog": true,
"syslog_facility": "local0"
}
复制代码


启动 consul 


nohup consul agent -config-dir=/etc/consul.d > /data/consul/consul.log &


访问 consul web 管理界面


http://ip:8500/


为了增强安全性也可以增加 ACL 设置,consul UI token 进行管理,可按照官网进行设置在此略过


1.3 服务注册

下面就是如何把 tidb exporter 信息注册到 consul:


首先就是如何获取到 tidb exporter 信息,有很多方式都行比如:


第一种 


curl http://ip:9090/api/v1/targets 获取到 tidb 所有的 exporter 主机 / 端口 /targets/lables 等信息后进行注册


第二种 


一般 tidb 部署的时候相关的元数据信息会存储到数据库表中,我这边也是存储到 mysql 对应的表中,可以方便的查询出需要的指标进行注册


服务注册:


下面主要是对 Tidb/Tikv/Pd 三种角色进行注册,可自定义注册哪些角色并打上 tag


Tidb:
curl -X PUT -d '{"id": "tidb-exporter","name": "tidb","address": "xx.xx.xx.xx","port": 10080,"tags": ["tidb","shyc2","product","xx.xx.xx.xx","10080"],"checks": [{"http": "http://xx.xx.xx.xx:10080/metrics", "interval": "5s"}]}' http://xx.xx.xx.xx:8500/v1/agent/service/register

Tikv:
curl -X PUT -d '{"id": "tikv-exporter","name": "tidb","address": "xx.xx.xx.xx","port": 20180,"tags": ["tidb","shyc2","product","xx.xx.xx.xx","20180"],"checks": [{"http": "http://xx.xx.xx.xx:20180/metrics", "interval": "5s"}]}' http://xx.xx.xx.xx:8500/v1/agent/service/register

Pd:
curl -X PUT -d '{"id": "pd-exporter","name": "tidb","address": "xx.xx.xx.xx","port": 2379,"tags": ["tidb","shyc2","product","xx.xx.xx.xx","2379"],"checks": [{"http": "http://xx.xx.xx.xx:2379/metrics", "interval": "5s"}]}' http://xx.xx.xx.xx:8500/v1/agent/service/register
复制代码


consul web ui 界面可以看到是否注册成功


1.4 Prometheus 联动 consul :

cat 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).

# Alertmanager configuration
alerting:
alertmanagers:
- static_configs:
- targets:
# - alertmanager:9093

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

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

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

static_configs:
- targets: ["localhost:9090"]
- job_name: 'tidb'
consul_sd_configs:
- server: 'xx.xx.xx.xx:8500'
services: ['tidb']
relabel_configs:
- source_labels: ['__meta_consul_tags']
regex: ',(.*),(.*),(.*),(.*),(.*),'
action: replace
target_label: 'instance'
replacement: '${1}_${4}_${5}'
- source_labels: ['__meta_consul_tags']
regex: ',(.*),(.*),(.*),(.*),(.*),'
action: replace
target_label: 'dc'
replacement: '${2}'
- source_labels: ['__meta_consul_tags']
regex: ',(.*),(.*),(.*),(.*),(.*),'
action: replace
target_label: 'env'
replacement: '${3}'
- source_labels: ['__meta_consul_tags']
regex: ',(.*),(.*),(.*),(.*),(.*),'
action: replace
target_label: 'service'
replacement: '${1}'
- source_labels: ['__meta_consul_service_address']
regex: "(.*)"
action: replace
target_label: 'ip'
replacement: '${1}'
- source_labels: ['__meta_consul_tags']
regex: ',(.*),(.*),(.*),(.*),(.*),'
action: replace
target_label: 'port'
replacement: '${5}'
复制代码


可以灵活根据 tags 进行正则匹配替换为自己想要的 grafana 展示的 label



简单配置 grafana 后,执行 tidb 一个监控项比如 tidb_server_connections 已经可以获取到我们在 consul 定制的 tag 指标


方案一 适用于数据库实例不是很多的情况下,上述方案完全可支撑,但是我司各种 db 有上万实例,consul 注册的时候会出现超时的情况,于是采用下面第二种方案

方案二: VictoriaMetrics+grafana+api

简单说下思路,主要利用 tornado 技术编写后端服务发现 api,然后 put db exporter 指标到 api,VM 再通过 api get 获取到 db 的 exporter 信息 grafana 图形化展示出来

2.1 架构图如下 


为什么用 VM,抛弃了 promethes,主要是 VM 性能相对更好,内存占用更小

2.2 VM vs promethes 性能测试

每组同时并发 24 个请求,每个请求统计 1 个小时内的,磁盘使用率和 MySQL OPS 的 Top10。


然后每组请求 3 次,求平均值。


总数据量:1.3 万亿


活跃 time series:1100 万



如下截图为执行完上面的查询命令后,


查看 VictoriaMetrics 和 Prometheus 两个进程的内存占用情况



可看到 vm 内存占用相对真的小很多,线上有个超大 Tidb 集群即时 TB 存储量,Prometheus 内存占用一直接近系统内存,因此用 VictoriaMetrics 替换了 Prometheus 采集监控数据后效果非常显著,下面介绍下如何使用 VM 替换 Prometheus ,这里简单介绍下单机版操作方式,集群版相对复杂点,可参考官网部署

2.3 VM 部署

wget https://github.com/VictoriaMetrics/VictoriaMetrics/releases/download/v1.65.0/victoria-metrics-amd64-v1.65.0.tar.gz


mkdir victoria-metrics && tar -xvzf victoria-metrics-amd64-v1.65.0.tar.gz && \


mv victoria-metrics-prod victoria-metrics/victoria-metrics


编辑配置文件


cat /etc/systemd/system/victoria-metrics-prod.service
[Unit]
Description=For Victoria-metrics-prod Service
After=network.target

[Service]
ExecStart=/usr/local/bin/victoria-metrics-prod -promscrape.config=/data1/tidb/deploy/conf/prometheus.yml -httpListenAddr=0.0.0.0:8428 -promscrape.config.strictParse=false -storageDataPath=/data1/victoria -retentionPeriod=3

[Install]
WantedBy=multi-user.target
复制代码


启动 vm 服务:


systemctl restart victoria-metrics-prod.service

2.4 VM 联动 grafana

修改 grafana:



Api 编写忽略,服务注册方式如下:


curl -sS --connect-timeout 10 -m 20 --retry 3 --retry-max-time 30 -H 'Content-Type: application/json' -XPUT -d '{"ip": "'${LOCAL_LISTEN_IP}'","instance_port": "'${DB_LISTEN_PORT}'","exporter_port": "'${LOCAL_LISTEN_PORT}'","role":"'${ROLE}'","token":"'${TOKEN}'"}'http://127.0.0.1:8888/tidb/${SERVICE_TYPE}


执行完上述命令后,会在 mysql 数据库表中插入 tidb 注册数据:



Grafana 具体监控指标可参考 tidb v6.1.0 起推出的 performance_overview.json,即使版本低于 6,也可以直接倒入这个 json 使用,个别监控项可以针对性调整下



最终 Tidb 集群合并监控如下:具体监控指标可自定义基本参考 6.1 推出的 performance_overview.json 即可



总结:

本文主要分享了 tidb 多集群监控整合的两种方案,方案还有很多,比如 prometheus 集群联邦机制等,选择一个适合自己的即可,主要目的是为了更方便巡检统计线上所有集群的重要监控指标,可以通过大屏的方式可视化出来,有无性能问题一览无余~


发布于: 刚刚阅读数: 4
用户头像

TiDB 社区官网:https://tidb.net/ 2021.12.15 加入

TiDB 社区干货传送门是由 TiDB 社区中布道师组委会自发组织的 TiDB 社区优质内容对外宣布的栏目,旨在加深 TiDBer 之间的交流和学习。一起构建有爱、互助、共创共建的 TiDB 社区 https://tidb.net/

评论

发布
暂无评论
多种姿势搞定Tidb集群监控大屏_监控_TiDB 社区干货传送门_InfoQ写作社区