TiDB Binlog 集群运维

本文首先介绍 Pump 和 Drainer 的状态及启动、退出的内部处理流程,然后说明如何通过 binlogctl 工具或者直接在 TiDB 执行 SQL 操作来管理 binlog 集群,最后的 FAQ 部分会介绍一些常见问题以及处理方法。

Pump/Drainer 的状态

Pump/Drainer 中状态的定义:

  • online:正常运行中
  • pausing:暂停中
  • paused:已暂停
  • closing:下线中
  • offline:已下线

这些状态由 Pump/Drainer 服务自身进行维护,并定时将状态信息更新到 PD 中。

Pump/Drainer 的启动、退出流程

Pump

  • 启动:Pump 启动时会通知所有 online 状态的 Drainer,如果通知成功,则 Pump 将状态设置为 online,否则 Pump 将报错,然后将状态设置为 paused 并退出进程。
  • 退出:Pump 进程正常退出前要选择进入暂停或者下线状态;非正常退出(kill -9、进程 panic、宕机)都依然保持 online 状态。

    • 暂停:使用 kill(非 kill -9)、Ctrl+C 或者使用 binlogctl 的 pause-pump 命令都可以暂停 Pump。接收到暂停指令后,Pump 会变更状态为 pausing,并停止接受 binlog 的写请求,也停止向 Drainer 提供 binlog 数据。安全退出所有线程后,更新状态为 paused 然后退出进程。
    • 下线:仅在使用 binlogctl 的 offline-pump 命令的情况下才会下线 Pump。接收到下线指令后,Pump 会变更状态为 closing,并停止接受 binlog 的写请求。Pump 继续向 Drainer 提供 binlog,等待所有 binlog 数据都被 Drainer 消费后再将状态设置为 offline 并退出进程。

Drainer

  • 启动:Drainer 启动时将状态设置为 online,并尝试从所有非 offline 状态的 Pump 获取 binlog,如果获取 binlog 失败,会不断尝试重新获取。
  • 退出:Drainer 进程正常退出前要选择进入暂停或者下线状态;非正常退出(kill -9 、进程 panic、宕机)都依然保持 online 状态。

    • 暂停:使用 kill(非 kill -9)、Ctrl+C 或者使用 binlogctl 的 pause-drainer 命令都可以暂停 Drainer。接收到指令后,Drainer 会变更状态为 pausing,并停止从 Pump 获取 binlog。安全退出所有线程后,更新状态为 paused 然后退出进程。
    • 下线:仅在使用 binlogctl 的 offline-drainer 命令的情况下才会下线 Drainer。接收到下线指令后,Drainer 变更状态为 closing,并停止从 Pump 获取 binlog。安全退出所有线程后,更新状态为 offline 然后退出进程。

关于 Pump/Drainer 暂停、下线、状态查询、状态修改等具体的操作方法,参考如下 binlogctl 工具的使用方法介绍。

binlogctl 工具

支持如下这些功能:

  • 查看 Pump/Drainer 状态
  • 暂停/下线 Pump/Drainer
  • Pump/Drainer 异常状态处理

使用 binlogctl 的场景:

  • 同步出现故障/检查运行情况,需要查看 Pump/Drainer 的状态
  • 维护集群,需要暂停/下线 Pump/Drainer
  • Pump/Drainer 异常退出,状态没有更新,或者状态不符合预期,对业务造成影响

binlogctl 下载链接:

  1. wget https://download.pingcap.org/tidb-{version}-linux-amd64.tar.gz && \
  2. wget https://download.pingcap.org/tidb-{version}-linux-amd64.sha256

检查文件完整性,返回 ok 则正确:

  1. sha256sum -c tidb-{version}-linux-amd64.sha256

对于 v2.1.0 GA 及以上版本,binlogctl 已经包含在 TiDB 的下载包中,其他版本需要单独下载 binlogctl:

  1. wget https://download.pingcap.org/tidb-enterprise-tools-latest-linux-amd64.tar.gz && \
  2. wget https://download.pingcap.org/tidb-enterprise-tools-latest-linux-amd64.sha256

检查文件完整性,返回 ok 则正确:

  1. sha256sum -c tidb-enterprise-tools-latest-linux-amd64.sha256

binlogctl 使用说明:

命令行参数:

  1. Usage of binlogctl:
  2. -V
  3. 输出 binlogctl 的版本信息
  4. -cmd string
  5. 命令模式,包括 "generate_meta"(已废弃), "pumps", "drainers", "update-pump" ,"update-drainer", "pause-pump", "pause-drainer", "offline-pump", "offline-drainer"
  6. -data-dir string
  7. 保存 Drainer checkpoint 的文件的路径 (默认 "binlog_position")(已废弃)
  8. -node-id string
  9. Pump/Drainer ID
  10. -pd-urls string
  11. PD 的地址,如果有多个,则用"," 连接 (默认 "http://127.0.0.1:2379")
  12. -ssl-ca string
  13. SSL CAs 文件的路径
  14. -ssl-cert string
  15. PEM 格式的 X509 认证文件的路径
  16. -ssl-key string
  17. PEM 格式的 X509 key 文件的路径
  18. -time-zone string
  19. 如果设置时区,在 "generate_meta" 模式下会打印出获取到的 tso 对应的时间。例如 "Asia/Shanghai" CST 时区,"Local" 为本地时区
  20. -show-offline-nodes
  21. 在用 -cmd pumps -cmd drainers 时使用,这两个命令默认不显示 offline 的节点,仅当明确指定 -show-offline-nodes 时会显示

命令示例:

  • 查询所有的 Pump/Drainer 的状态:

    设置 cmdpumps 或者 drainers 来查看所有 Pump 或者 Drainer 的状态。例如:

    1. bin/binlogctl -pd-urls=http://127.0.0.1:2379 -cmd pumps
    1. [2019/04/28 09:29:59.016 +00:00] [INFO] [nodes.go:48] ["query node"] [type=pump] [node="{NodeID: 1.1.1.1:8250, Addr: pump:8250, State: online, MaxCommitTS: 408012403141509121, UpdateTime: 2019-04-28 09:29:57 +0000 UTC}"]
    1. bin/binlogctl -pd-urls=http://127.0.0.1:2379 -cmd drainers
    1. [2019/04/28 09:29:59.016 +00:00] [INFO] [nodes.go:48] ["query node"] [type=drainer] [node="{NodeID: 1.1.1.1:8249, Addr: 1.1.1.1:8249, State: online, MaxCommitTS: 408012403141509121, UpdateTime: 2019-04-28 09:29:57 +0000 UTC}"]
  • 暂停/下线 Pump/Drainer

    binlogctl 提供以下命令暂停/下线服务:

    | cmd | 说明 | 示例 | | ———————- | ——————- | ————————————————————————————————————————————————| | pause-pump | 暂停 Pump | bin/binlogctl -pd-urls=http://127.0.0.1:2379 -cmd pause-pump -node-id ip-127-0-0-1:8250 | | pause-drainer | 暂停 Drainer | bin/binlogctl -pd-urls=http://127.0.0.1:2379 -cmd pause-drainer -node-id ip-127-0-0-1:8249 | | offline-pump | 下线 Pump | bin/binlogctl -pd-urls=http://127.0.0.1:2379 -cmd offline-pump -node-id ip-127-0-0-1:8250 | | offline-drainer | 下线 Drainer | bin/binlogctl -pd-urls=http://127.0.0.1:2379 -cmd offline-drainer -node-id ip-127-0-0-1:8249 |

    binlogctl 会发送 HTTP 请求给 Pump/Drainer,Pump/Drainer 收到命令后会主动执行对应的退出流程。

  • 异常情况下修改 Pump/Drainer 的状态

    在服务正常运行以及符合流程的暂停、下线过程中,Pump/Drainer 的状态都是可以正确的。但是在一些异常情况下 Pump/Drainer 无法正确维护自己的状态,可能会影响数据同步任务,在这种情况下需要使用 binlogctl 修复状态信息。

    设置 cmdupdate-pump 或者 update-drainer 来更新 Pump 或者 Drainer 的状态。Pump 和 Drainer 的状态可以为 paused 或者 offline。例如:

    1. bin/binlogctl -pd-urls=http://127.0.0.1:2379 -cmd update-pump -node-id ip-127-0-0-1:8250 -state paused

    注意:

    Pump/Drainer 在正常运行过程中会定期在 PD 中更新自己的状态,而这条命令是直接去修改 Pump/Drainer 保存在 PD 中的状态,所以在 Pump/Drainer 服务正常的情况下使用这些命令是没有意义的。仅在 Pump/Drainer 服务异常的情况下使用,具体哪些场景下使用这条命令可以参考 FAQ。

使用 TiDB SQL 管理 Pump/Drainer

要查看和管理 binlog 相关的状态,可在 TiDB 中执行相应的 SQL 语句。

  • 查看 TiDB 是否开启 binlog

    1. show variables like "log_bin";
    1. +---------------+-------+
    2. | Variable_name | Value |
    3. +---------------+-------+
    4. | log_bin | ON |
    5. +---------------+-------+

    值为 ON 时表示 TiDB 开启了 binlog。

  • 查看 Pump/Drainer 状态

    1. show pump status;
    1. +--------|----------------|--------|--------------------|---------------------|
    2. | NodeID | Address | State | Max_Commit_Ts | Update_Time |
    3. +--------|----------------|--------|--------------------|---------------------|
    4. | pump1 | 127.0.0.1:8250 | Online | 408553768673342237 | 2019-05-01 00:00:01 |
    5. +--------|----------------|--------|--------------------|---------------------|
    6. | pump2 | 127.0.0.2:8250 | Online | 408553768673342335 | 2019-05-01 00:00:02 |
    7. +--------|----------------|--------|--------------------|---------------------|
    1. show drainer status;
    1. +----------|----------------|--------|--------------------|---------------------|
    2. | NodeID | Address | State | Max_Commit_Ts | Update_Time |
    3. +----------|----------------|--------|--------------------|---------------------|
    4. | drainer1 | 127.0.0.3:8249 | Online | 408553768673342532 | 2019-05-01 00:00:03 |
    5. +----------|----------------|--------|--------------------|---------------------|
    6. | drainer2 | 127.0.0.4:8249 | Online | 408553768673345531 | 2019-05-01 00:00:04 |
    7. +----------|----------------|--------|--------------------|---------------------|
  • 异常情况下修改 Pump/Drainer 状态

    1. change pump to node_state ='paused' for node_id 'pump1';
    1. Query OK, 0 rows affected (0.01 sec)
    1. change drainer to node_state ='paused' for node_id 'drainer1';
    1. Query OK, 0 rows affected (0.01 sec)

    该 SQL 的功能和 binlogctl 中的 update-pump 和 update-drainer 命令的功能一样,因此也只有在 Pump/Drainer 异常的情况下使用。

注意:

  1. 查看 binlog 开启状态以及 Pump/Drainer 状态的功能在 TiDB v2.1.7 及以上版本中支持。
  2. 修改 Pump/Drainer 状态的功能在 TiDB v3.0.0-rc.1 及以上版本中支持。该功能只修改 PD 中存储的 Pump/Drainer 状态,如果需要暂停/下线节点,仍然需要使用 binlogctl