# [FAQ]如何通过 Prometheus 监测 TiDB-binlog 的 Replication Lag

## keywords

TiDB-binlog, binlog_drainer_checkpoint_delay_seconds, binlog_drainer_checkpoint_tso, pump, drainer

## 问题描述 

通过 TiDB-binlog 同步上下游的 TiDB 集群，如何监测 TiDB binlog 的 Replication lag，如果已经发生 Replication Lag 如何处理？

## 解决方案 

### Binlog replication lag 在 Grafana 和 Altermanager 的方案

1.Grafana 方案，建议使用 Metric：binlog_drainer_checkpoint_delay_seconds 检测 TiDB binlog 的 Replication Lag 情况(暂时没有官网介绍）。

Drainer 的 Metric：binlog_drainer_checkpoint_delay_seconds 采用 Prometheus 直方图的方式记录 CommitTS 和 Drainer 的服务器时间差异，用来检测 Replication Lag。

Pump 的 Metric： binlog_drainer_pump_position：可以通过 curl 获取的 Pump_postion 是 Drainer 记录的 Pump 的位置，detect-interval （默认 5s) ，每隔 5 秒数从 PD 更新一次 Pumps 信息，以获取节点加入或离开等事件，获得的时间戳是已提交 CommitTS。

2.Altermanager 方案，Altermanager 采用 Binlog replication lag = time() - binlog_drainer_checkpoint_tso 而不采用  binlog_drainer_checkpoint_delay_seconds 作为延迟告警的原因是， 后者因为 Drainer 完全卡住的话，drainer node 节点的 tidb() 也会卡住不推进，计算的结果一直是旧的，最终导致无法告警。

```yml
Binlog replication lag = time() - binlog_drainer_checkpoint_tso
```

time() : Promethues 的服务器时间，理论上和 Pump、Drainer 的服务器时间时一样的；

Drainer 的 Metric：binlog_drainer_checkpoint_tso/1000（秒）：上游的 CommitTS 也就是最近一个 binlog 检查点的时间戳（已经成功得同步到下游）。

> **注意**
>
> 在实时同步的情况下。Drainer 的 Upstream-CommitTS 应该要小于所有 binlog_drainer_pump_position 的最大值，获取的时间戳是最新完成同步的 CommitTS，始终是最新值。如果使用 binlog_drainer_pump_position - Drainer-Upstream-CommitTS 有时候会是负数，所以不建议用于监控 Replication Lag。

```bash
curl pump-ip:pump-status-port/status
```

3.目前 TiDB-binlog 不支持控制 Pump 和 Drainer 延迟的功能，建议通过 Altermanager 设置一个触发脚本，当发声 Replication Lag 时候，通过 “pause-pump" 和 “resume-pump” 来尝试恢复同步。

## 流程图

![faq-binlog-dashboard-relication-lag](/images/TiDB-Binlog/faq-binlog-dashboard-relication-lag.png)

## Reference

Alertmanager 监测 Replication Lag 的参考代码： [https://github.com/pingcap/tidb-binlog/blob/master/drainer/syncer.go##L260](https://github.com/pingcap/tidb-binlog/blob/master/drainer/syncer.go##L260)

binlog_drainer_checkpoint_tso 的参考代码  [https://github.com/pingcap/tidb-binlog/blob/v4.0.14/drainer/syncer.go##L265](https://github.com/pingcap/tidb-binlog/blob/v4.0.14/drainer/syncer.go##L265)

binlog_drainer_checkpoint_delay_seconds 参考  [https://github.com/pingcap/tidb-binlog/blob/v4.0.14/drainer/metrics.go##L71-L79](https://github.com/pingcap/tidb-binlog/blob/v4.0.14/drainer/metrics.go##L71-L79)

Alertmanager 监测 Replication Lag 的官方文档：[https://docs.pingcap.com/tidb/v4.0/monitor-tidb-binlog-cluster##binlog_drainer_checkpoint_high_delay](https://docs.pingcap.com/tidb/v4.0/monitor-tidb-binlog-cluster##binlog_drainer_checkpoint_high_delay)

Drainer 的 detect-interval 配置文档 [https://docs.pingcap.com/tidb/stable/tidb-binlog-configuration-file##detect-interval](https://docs.pingcap.com/tidb/stable/tidb-binlog-configuration-file##detect-interval) 