diff --git a/media/prometheus-in-tidb.png b/media/prometheus-in-tidb.png index 757c5a6d2e47..377fef6ed9d7 100644 Binary files a/media/prometheus-in-tidb.png and b/media/prometheus-in-tidb.png differ diff --git a/media/view-dashboard.png b/media/view-dashboard.png new file mode 100644 index 000000000000..9ffa672720a7 Binary files /dev/null and b/media/view-dashboard.png differ diff --git a/op-guide/monitor-overview.md b/op-guide/monitor-overview.md index f719103662bf..86352e4f62db 100644 --- a/op-guide/monitor-overview.md +++ b/op-guide/monitor-overview.md @@ -5,14 +5,24 @@ category: monitoring # TiDB 监控框架概述 -TiDB 使用开源时序数据库 Prometheus 作为监控和性能指标信息存储方案,使用 Grafana 作为可视化组件进行展示。 +TiDB 使用开源时序数据库 [Prometheus](https://prometheus.io) 作为监控和性能指标信息存储方案,使用 [Grafana](https://grafana.com/grafana) 作为可视化组件进行展示。 -Prometheus 是一个拥有多维度数据模型,灵活的查询语句的时序数据库。Prometheus 作为热门的开源项目,拥有活跃的社区及众多的成功案例。 +## Prometheus 在 TiDB 中的应用 -Prometheus 提供了多个组件供用户使用。目前,我们使用 Prometheus Server,来收集和存储时间序列数据。Client 代码库,在程序中定制需要的 Metric 。Push GateWay 来接收 Client Push 上来的数据,统一供 Prometheus 主服务器抓取。以及 AlertManager 来实现报警机制。其结构如下图: +Prometheus 是一个拥有多维度数据模型的、灵活的查询语句的时序数据库。Prometheus 作为热门的开源项目,拥有活跃的社区及众多的成功案例。 + +Prometheus 提供了多个组件供用户使用。目前,TiDB 使用了以下组件: + +- Prometheus Server:用于收集和存储时间序列数据。 +- Client 代码库:用于定制程序中需要的 Metric。 +- Alertmanager:用于实现报警机制。 + +其结构如下图所示: ![Prometheus in TiDB](../media/prometheus-in-tidb.png) -Grafana 是一个开源的 metric 分析及可视化系统。我们使用 Grafana 来展示 TiDB 的各项性能指标 。如下图所示: +## Grafana 在 TiDB 中的应用 + +Grafana 是一个开源的 metric 分析及可视化系统。TiDB 使用 Grafana 来展示 TiDB 的各项性能指标。如下图所示: -![Grafana Screeshot](../media/grafana-screenshot.png) \ No newline at end of file +![Grafana in TiDB](../media/grafana-screenshot.png) \ No newline at end of file diff --git a/op-guide/monitor.md b/op-guide/monitor.md index 29ecc07d918f..0c72b74ff2dd 100644 --- a/op-guide/monitor.md +++ b/op-guide/monitor.md @@ -5,182 +5,315 @@ category: monitoring # TiDB 集群监控 -TiDB 集群状态监控目前有两种接口,第一种是通过 HTTP 接口对外汇报组件的信息,我们称之为组件的状态接口;第二种是使用 prometheus 记录组件中各种操作的详细信息,我们称之为 metrics 接口。 +TiDB 提供了以下两种接口来监控集群状态: -## 组件状态接口 +- [状态接口](#使用状态接口):通过 HTTP 接口对外汇报组件的信息。 +- [Metrics 接口](#使用-metrics-接口):使用 Prometheus 记录组件中各种操作的详细信息,使用 Grafana 进行可视化展示。 -这类接口可以获取组件的一些基本信息,并且可以作为 keepalive 监测接口。另外 PD 的接口可以看到整个 TiKV 集群的详细信息。 +## 使用状态接口 -### TiDB Server +状态接口用于监控组件的一些基本信息,并且可以作为 keepalive 的监测接口。另外,通过 PD 的状态接口可以看到整个 TiKV 集群的详细信息。 -TiDB API 地址:`http://${host}:${port}`。 +### TiDB Server -其中 port 默认为 10080,各类 `api_name` 详细信息参见 [TiDB API Doc](https://github.com/pingcap/tidb/blob/master/docs/tidb_http_api.md)。 +- TiDB API 地址:`http://${host}:${port}` +- 默认端口:10080 +- 各类 `api_name` 详细信息:参见 [TiDB API 文档](https://github.com/pingcap/tidb/blob/master/docs/tidb_http_api.md) -下面示例中,通过访问 `http://${host}:${port}/status` 获取当前 TiDB Server 的状态,以及判断是否存活。返回结果为 **Json** 格式: +以下示例中,通过访问 `http://${host}:${port}/status` 获取当前 TiDB Server 的状态,并判断该 TiDB Server 是否存活。结果以 **JSON** 格式返回: ```bash curl http://127.0.0.1:10080/status { - connections: 0, - version: "5.5.31-TiDB-1.0", - git_hash: "b99521846ff6f71f06e2d49a3f98fa1c1d93d91b" + connections: 0, # 当前 TiDB Server 上的客户端连接数 + version: "5.7.25-TiDB-v3.0.0-beta-250-g778c3f4a5", # TiDB 版本号 + git_hash: "778c3f4a5a716880bcd1d71b257c8165685f0d70" # TiDB 当前代码的 Git Hash } ``` -+ `connections`:当前 TiDB Server 上的客户端连接数 - + `version`:TiDB 版本号 - + `git_hash`:TiDB 当前代码的 Git Hash - ### PD Server -PD API 地址:`http://${host}:${port}/pd/api/v1/${api_name}`。 - -其中 port 默认为 2379,各类 api_name 详细信息参见 [PD API Doc](https://cdn.rawgit.com/pingcap/docs/master/op-guide/pd-api-v1.html)。 +- PD API 地址:`http://${host}:${port}/pd/api/v1/${api_name}` +- 默认端口:2379 +- 各类 `api_name` 详细信息:参见 [PD API Doc](https://cdn.rawgit.com/pingcap/docs/master/op-guide/pd-api-v1.html) -通过这个接口可以获取当前所有 TiKV 的状态以及负载均衡信息。其中最重要也是最常用的接口获取 TiKV 集群所有节点状态的接口,下面以一个单个 TiKV 构成的集群为例,说明一些用户需要了解的信息: +通过该接口可以获取当前所有 TiKV 节点的状态以及负载均衡信息。下面以一个单节点的 TiKV 集群为例,说明用户需要了解的信息: ```bash curl http://127.0.0.1:2379/pd/api/v1/stores { - "count": 1, TiKV 节点数量 - "stores": [ // TiKV 节点的列表 - // 下面列出的是这个集群中单个 TiKV 节点的信息 - { + "count": 1, # TiKV 节点数量 + "stores": [ # TiKV 节点的列表 + # 集群中单个 TiKV 节点的信息 + { "store": { "id": 1, - "address": "127.0.0.1:22161", - "state": 0 + "address": "127.0.0.1:20160", + "version": "3.0.0-beta", + "state_name": "Up" }, "status": { - "store_id": 1, // 节点的 ID - "capacity": 1968874332160, // 存储总容量 - "available": 1264847716352, // 存储剩余容量 - "region_count": 1, // 该节点上存放的 Region 数量 - "sending_snap_count": 0, - "receiving_snap_count": 0, - "start_ts": "2016-10-24T19:54:00.110728339+08:00", // 启动时间 - "last_heartbeat_ts": "2016-10-25T10:52:54.973669928+08:00", // 最后一次心跳时间 - "total_region_count": 1, // 总 Region 数量 - "leader_region_count": 1, // Leader Region 数量 - "uptime": "14h58m54.862941589s" - }, - "scores": [ - 100, - 35 - ] + "capacity": "20 GiB", # 存储总容量 + "available": "16 GiB", # 存储剩余容量 + "leader_count": 17, + "leader_weight": 1, + "leader_score": 17, + "leader_size": 17, + "region_count": 17, + "region_weight": 1, + "region_score": 17, + "region_size": 17, + "start_ts": "2019-03-21T14:09:32+08:00", # 启动时间 + "last_heartbeat_ts": "2019-03-21T14:14:22.961171958+08:00", # 最后一次心跳的时间 + "uptime": "4m50.961171958s" + } } ] -} ``` -## Metrics 监控 +## 使用 metrics 接口 -这部分主要对整个集群的状态、性能做监控,通过 Prometheus+Grafana 展现 metrics 数据,在下面一节会介绍如何搭建监控系统。 +Metrics 接口用于监控整个集群的状态和性能。 -### TiDB Server +- 如果使用 TiDB-Ansible 部署 TiDB 集群,监控系统(Prometheus 和 Grafana)会同时部署。 +- 如果使用其他方式部署 TiDB 集群,在使用 metrics 接口前,需先[部署 Prometheus 和 Grafana](#部署-prometheus-和-grafana)。 -+ query 处理时间,可以看到延迟和吞吐 -+ ddl 过程监控 -+ TiKV client 相关的监控 -+ PD client 相关的监控 +成功部署 Prometheus 和 Grafana 之后,[配置 Grafana](#配置-grafana)。 -### PD Server +### 部署 Prometheus 和 Grafana -+ 命令执行的总次数 -+ 某个命令执行失败的总次数 -+ 某个命令执行成功的耗时统计 -+ 某个命令执行失败的耗时统计 -+ 某个命令执行完成并返回结果的耗时统计 +假设 TiDB 的拓扑结构如下: -### TiKV Server +| 节点 | 主机 IP | 服务 | +| :-- | :-- | :-------------- | +| Node1 | 192.168.199.113| PD1, TiDB, node_export, Prometheus, Grafana | +| Node2 | 192.168.199.114| PD2, node_export | +| Node3 | 192.168.199.115| PD3, node_export | +| Node4 | 192.168.199.116| TiKV1, node_export | +| Node5 | 192.168.199.117| TiKV2, node_export | +| Node6 | 192.168.199.118| TiKV3, node_export | -+ GC 监控 -+ 执行 KV 命令的总次数 -+ Scheduler 执行命令的耗时统计 -+ Raft propose 命令的总次数 -+ Raft 执行命令的耗时统计 -+ Raft 执行命令失败的总次数 -+ Raft 处理 ready 状态的总次数 +#### 第 1 步:下载二进制包 -## 使用 Prometheus+Grafana +```bash +# 下载二进制包 +$ wget https://github.com/prometheus/prometheus/releases/download/v2.2.1/prometheus-2.2.1.linux-amd64.tar.gz +$ wget https://github.com/prometheus/node_exporter/releases/download/v0.15.2/node_exporter-0.15.2.linux-amd64.tar.gz +$ wget https://s3-us-west-2.amazonaws.com/grafana-releases/release/grafana-4.6.3.linux-x64.tar.gz + +# 解压二进制包 +$ tar -xzf prometheus-2.2.1.linux-amd64.tar.gz +$ tar -xzf node_exporter-0.15.2.linux-amd64.tar.gz +$ tar -xzf grafana-4.6.3.linux-x64.tar.gz +``` -### 部署架构 +#### 第 2 步:在 Node1,Node2,Node3,Node4 上启动 `node_exporter` -整个架构如下图所示,在 TiDB/PD/TiKV 三个组件的启动参数中添加 Prometheus Pushgateway 地址: +```bash +$ cd node_exporter-0.15.2.linux-amd64 -![Deployment Architecture](../media/monitor-architecture.png) +# 启动 node_exporter 服务 +$ ./node_exporter --web.listen-address=":9100" \ + --log.level="info" & +``` -### 搭建监控系统 +#### 第 3 步:在 Node1 上启动 Prometheus + +编辑 Prometheus 的配置文件: + +```yml +$ cd prometheus-2.2.1.linux-amd64 +$ vi prometheus.yml + +... + +global: + scrape_interval: 15s + evaluation_interval: 15s + # scrape_timeout 设置为全局默认值 (10s) + external_labels: + cluster: 'test-cluster' + monitor: "prometheus" + +scrape_configs: + - job_name: 'overwritten-nodes' + honor_labels: true # 不要覆盖 job 和实例的 label + static_configs: + - targets: + - '192.168.199.113:9100' + - '192.168.199.114:9100' + - '192.168.199.115:9100' + - '192.168.199.116:9100' + - '192.168.199.117:9100' + - '192.168.199.118:9100' + + - job_name: 'tidb' + honor_labels: true # 不要覆盖 job 和实例的 label + static_configs: + - targets: + - '192.168.199.113:10080' + + - job_name: 'pd' + honor_labels: true # 不要覆盖 job 和实例的 label + static_configs: + - targets: + - '192.168.199.113:2379' + - '192.168.199.114:2379' + - '192.168.199.115:2379' + + - job_name: 'tikv' + honor_labels: true # 不要覆盖 job 和实例的 label + static_configs: + - targets: + - '192.168.199.116:20180' + - '192.168.199.117:20180' + - '192.168.199.118:20180' + +... -- Prometheus Push Gateway 参考:https://github.com/prometheus/pushgateway -- Prometheus Server 参考:https://github.com/prometheus/prometheus#install -- Grafana 参考:http://docs.grafana.org +``` -### 配置 +启动 Grafana 服务: -#### TiDB/PD/TiKV 配置 +```bash +$ ./prometheus \ + --config.file="./prometheus.yml" \ + --web.listen-address=":9090" \ + --web.external-url="http://192.168.199.113:9090/" \ + --web.enable-admin-api \ + --log.level="info" \ + --storage.tsdb.path="./data.metrics" \ + --storage.tsdb.retention="15d" & +``` -+ TiDB +#### 第 4 步:在 Node1 上启动 Grafana + +编辑 Grafana 的配置文件: + +```ini +$ cd grafana-4.6.3 +$ vi conf/grafana.ini + +... + +[paths] +data = ./data +logs = ./data/log +plugins = ./data/plugins +[server] +http_port = 3000 +domain = 192.168.199.113 +[database] +[session] +[analytics] +check_for_updates = true +[security] +admin_user = admin +admin_password = admin +[snapshots] +[users] +[auth.anonymous] +[auth.basic] +[auth.ldap] +[smtp] +[emails] +[log] +mode = file +[log.console] +[log.file] +level = info +format = text +[log.syslog] +[event_publisher] +[dashboards.json] +enabled = false +path = ./data/dashboards +[metrics] +[grafana_net] +url = https://grafana.net + +... - 设置 \-\-metrics-addr 和 \-\-metrics-interval 两个参数,其中 metrics-addr 设为 Push Gateway 的地址,metrics-interval 为 push 的频率,单位为秒,默认值为 15 +``` -+ PD +启动 Grafana 服务: - 修改 toml 配置文件,填写 Push Gateway 的地址和推送频率 +```bash +$ ./bin/grafana-server \ + --config="./conf/grafana.ini" +``` - ```toml - [metric] - # prometheus client push interval, set "0s" to disable prometheus. - interval = "15s" - # prometheus pushgateway address, leaves it empty will disable prometheus. - address = "host:port" - ``` +### 配置 Grafana -+ TiKV +本小节介绍如何配置 Grafana。 - 修改 toml 配置文件,填写 Push Gateway 的地址和推送频率,job 字段一般设为“tikv”。 +#### 第 1 步:添加 Prometheus 数据源 - ```toml - [metric] - # the Prometheus client push interval. Setting the value to 0s stops Prometheus client from pushing. - interval = "15s" - # the Prometheus pushgateway address. Leaving it empty stops Prometheus client from pushing. - address = "host:port" - # the Prometheus client push job name. Note: A node id will automatically append, e.g., "tikv_1". - job = "tikv" - ``` +1. 登录 Grafana 界面。 -#### PushServer 配置 + - 默认地址:http://localhost:3000 + - 默认账户:admin + - 默认密码:admin -一般无需特殊配置,使用默认端口 9091 即可 +2. 点击 Grafana 图标打开侧边栏。 -#### Prometheus 配置 +3. 在侧边栏菜单中,点击 **Data Source**。 -在 yaml 配置文件中添加 Push Gateway 地址: +4. 点击 **Add data source**。 -```yaml - scrape_configs: -# The job name is added as a label `job=` to any timeseries scraped from this config. -- job_name: 'TiDB' +5. 指定数据源的相关信息: - # Override the global default and scrape targets from this job every 5 seconds. - scrape_interval: 5s + - 在 **Name** 处,为数据源指定一个名称。 + - 在 **Type** 处,选择 **Prometheus**。 + - 在 **URL** 处,指定 Prometheus 的 IP 地址。 + - 根据需求指定其它字段。 - honor_labels: true +6. 点击 **Add** 保存新的数据源。 - static_configs: - - targets: ['host:port'] # use the Push Gateway address -labels: - group: 'production' -``` +#### 第 2 步:导入 Grafana 面板 + +执行以下步骤,为 PD Server、TiKV Server 和 TiDB Server 分别导入 Grafana 面板: + +1. 点击侧边栏的 Grafana 图标。 + +2. 在侧边栏菜单中,依次点击 **Dashboards** > **Import** 打开 **Import Dashboard** 窗口。 + +3. 点击 **Upload .json File** 上传对应的 JSON 文件(下载 [TiDB Grafana 配置文件](https://github.com/pingcap/tidb-ansible/tree/master/scripts))。 + + > **注意:** TiKV、PD 和 TiDB 面板对应的 JSON 文件分别为:`tikv_pull.json`,`pd.json`,`tidb.json`。 + +4. 点击 **Load**。 + +5. 选择一个 Prometheus 数据源。 + +6. 点击 **Import**,Prometheus 面板即导入成功。 + +### 查看组件 metrics + +在顶部菜单中,点击 **New dashboard**,选择要查看的面板。 -#### Grafana 配置 +![view dashboard](../media/view-dashboard.png) -+ 进入 Grafana Web 界面(默认地址: http://localhost:3000 ,默认账号: admin 密码: admin) +可查看以下集群组件信息: - 点击 Grafana Logo -> 点击 Data Sources -> 点击 Add data source -> 填写 data source 信息 ( 注: Type 选 Prometheus,Url 为 Prometheus 地址,其他根据实际情况填写 ) ++ **TiDB Server:** + + query 处理时间,可以看到延迟和吞吐 + + ddl 过程监控 + + TiKV client 相关的监控 + + PD client 相关的监控 -+ 导入 dashboard 配置文件 ++ **PD Server:** + + 命令执行的总次数 + + 某个命令执行失败的总次数 + + 某个命令执行成功的耗时统计 + + 某个命令执行失败的耗时统计 + + 某个命令执行完成并返回结果的耗时统计 - 点击 Grafana Logo -> 点击 Dashboards -> 点击 Import -> 选择需要的 Dashboard [配置文件](https://grafana.com/tidb)上传 -> 选择对应的 data source ++ **TiKV Server:** + + GC 监控 + + 执行 KV 命令的总次数 + + Scheduler 执行命令的耗时统计 + + Raft propose 命令的总次数 + + Raft 执行命令的耗时统计 + + Raft 执行命令失败的总次数 + + Raft 处理 ready 状态的总次数