• TiDB-Binlog 部署方案
    • TiDB-Binlog 简介
    • TiDB-Binlog 架构
      • Pump
      • Drainer
      • Kafka & ZooKeeper
  • TiDB-Binlog 安装
    • 下载官方 Binary
    • TiDB-Binlog 部署
      • 注意
      • Kafka 集群配置推荐
      • Kafka 配置参数推荐
      • 使用 tidb-ansible 部署 Pump
      • 使用 Binary 部署 Pump
      • 使用 Binary 部署 Drainer
  • 下载 PbReader 工具 (Linux)
  • TiDB-Binlog 监控
    • Pump/Drainer 配置
    • Grafana 配置

    TiDB-Binlog 部署方案

    本文档介绍如何部署 Kafka 版本的 TiDB-Binlog。如需部署 local 版本的 TiDB-Binlog,可参考 local 版本的 TiDB-Binlog 部署文档。

    TiDB-Binlog 简介

    TiDB-Binlog 用于收集 TiDB 的 Binlog,并提供实时备份和同步功能的商业工具。

    TiDB-Binlog 支持以下功能场景:

    • 数据同步:同步 TiDB 集群数据到其他数据库
    • 实时备份和恢复:备份 TiDB 集群数据,同时可以用于 TiDB 集群故障时恢复

    TiDB-Binlog 架构

    首先介绍 TiDB-Binlog 的整体架构。

    TiDB-Binlog 架构

    TiDB-Binlog 集群主要分为三个组件:

    Pump

    Pump 是一个守护进程,在每个 TiDB 主机的后台运行。其主要功能是实时记录 TiDB 产生的 Binlog 并顺序写入 Kafka 中。

    Drainer

    Drainer 从 Kafka 中收集 Binlog,并按照 TiDB 中事务的提交顺序转化为指定数据库兼容的 SQL 语句,最后同步到目的数据库或者写到顺序文件。

    Kafka & ZooKeeper

    Kafka 集群用来存储由 Pump 写入的 Binlog 数据,并提供给 Drainer 进行读取。

    注:local 版本将 Binlog 存储在文件中,最新版本则使用 Kafka 存储。

    TiDB-Binlog 安装

    下载官方 Binary

    CentOS 7+

    1. # 下载压缩包
    2. wget http://download.pingcap.org/tidb-binlog-latest-linux-amd64.tar.gz
    3. wget http://download.pingcap.org/tidb-binlog-latest-linux-amd64.sha256
    4. # 检查文件完整性,返回 ok 则正确
    5. sha256sum -c tidb-binlog-latest-linux-amd64.sha256
    6. # 解开压缩包
    7. tar -xzf tidb-binlog-latest-linux-amd64.tar.gz
    8. cd tidb-binlog-latest-linux-amd64

    TiDB-Binlog 部署

    注意

    • 需要为一个 TiDB 集群中的每台 TiDB server 部署一个 Pump,目前 TiDB server 只支持以 unix socket 的方式输出 Binlog。
    • 手动部署时,启动优先级为:Pump > TiDB;停止优先级为 TiDB > Pump。

      设置 TiDB 启动参数 binlog-socket 为对应的 Pump 参数 socket 所指定的 unix socket 文件路径,最终部署结构如下图所示:

      TiDB pump 模块部署结构

    • Drainer 不支持对 ignore schemas(在过滤列表中的 schemas)的 table 进行 rename DDL 操作。

    • 在已有的 TiDB 集群中启动 Drainer,一般需要全量备份并且获取 savepoint,然后导入全量备份,最后启动 Drainer 从 savepoint 开始同步;

      为了保证数据的完整性,在 Pump 运行 10 分钟左右后按顺序进行如下操作:

      • 使用 tidb-tools 项目中的 generate_binlog_position 工具生成 Drainer 启动需要的 savepoint 文件中,make generate_binlog_position 编译该工具。具体使用参考工具的 README 说明,也可以直接下载获取该工具:generate_binlog_position, 并使用sha256sum验证该文件 sha256。
      • 全量备份,例如 mydumper 备份 TiDB
      • 全量导入备份到目标系统
      • Kafka 版本 Drainer 启动的 savepoint 默认保存在下游 database tidb_binlog 下的 checkpoint 表中,如果 checkpoint 表中没有效的数据,可以通过设置 initial-commit-ts 启动 Drainer 从指定位置开始消费 - bin/drainer --config=conf/drainer.toml --initial-commit-ts=${commitTS}
    • Drainer 输出的 pb,要在配置文件中设置如下参数:

      1. [syncer]
      2. db-type = "pb"
      3. disable-dispatch = true
      4. [syncer.to]
      5. dir = "/path/pb-dir"
    • Kafka 和 ZooKeeper 集群需要在部署 TiDB-Binlog 之前部署好。Kafka 需要 0.9 及以上版本。

    Kafka 集群配置推荐

    名字 数量 内存 CPU 硬盘
    Kafka 3+ 16G 8+ 2+ 1TB
    ZooKeeper 3+ 8G 4+ 2+ 300G

    Kafka 配置参数推荐

    • auto.create.topics.enable = true:如果还没有创建 topic,Kafka 会在 broker 上自动创建 topic
    • broker.id:用来标识 Kafka 集群的必备参数,不能重复;如 broker.id = 1
    • fs.file-max = 1000000:Kafka 会使用大量文件和网络 socket,建议修改成 1000000,通过 vi /etc/sysctl.conf 进行修改

    使用 tidb-ansible 部署 Pump

    • 如无 Kafka 集群,可使用 kafka-ansible 部署 Kafka 集群。
    • 使用 tidb-ansible 部署 TiDB 集群时,修改 tidb-ansible/inventory.ini 文件,设置 enable_binlog = True,并配置 zookeeper_addrs 变量为 Kafka 集群的 ZooKeeper 地址,这样部署 TiDB 集群时会部署 Pump。

    配置样例:

    1. # binlog trigger
    2. enable_binlog = True
    3. # ZooKeeper address of Kafka cluster, example:
    4. # zookeeper_addrs = "192.168.0.11:2181,192.168.0.12:2181,192.168.0.13:2181"
    5. # You can also append an optional chroot string to the URLs to specify the root directory for all Kafka znodes, example:
    6. # zookeeper_addrs = "192.168.0.11:2181,192.168.0.12:2181,192.168.0.13:2181/kafka/123"
    7. zookeeper_addrs = "192.168.0.11:2181,192.168.0.12:2181,192.168.0.13:2181"

    使用 Binary 部署 Pump

    使用样例:

    假设我们有三个 PD,三个 ZooKeeper,一个 TiDB,各个节点信息如下:

    1. TiDB="192.168.0.10"
    2. PD1="192.168.0.16"
    3. PD2="192.168.0.15"
    4. PD3="192.168.0.14"
    5. ZK1="192.168.0.13"
    6. ZK2="192.168.0.12"
    7. ZK3="192.168.0.11"

    在 ip=”192.168.0.10” 的机器上面部署 Drainer/Pump;

    对应的 PD 集群的 ip=”192.168.0.16,192.168.0.15,192.168.0.14”;

    对应的 Kafka 集群的 ZooKeeper 的 ip=”192.168.0.13,192.168.0.12,192.168.0.11”。以此为例,说明 Pump/Drainer 的使用。

    1. Pump 命令行参数说明

      1. Usage of Pump:
      2. -L string
      3. 日志输出信息等级设置: debug, info, warn, error, fatal (默认 "info")
      4. -V
      5. 打印版本信息
      6. -addr string
      7. Pump 提供服务的 RPC 地址(-addr="192.168.0.10:8250")
      8. -advertise-addr string
      9. Pump 对外提供服务的 RPC 地址(-advertise-addr="192.168.0.10:8250")
      10. -config string
      11. 配置文件路径,如果你指定了配置文件,Pump 会首先读取配置文件的配置;
      12. 如果对应的配置在命令行参数里面也存在,Pump 就会使用命令行参数的配置来覆盖配置文件里面的。
      13. -data-dir string
      14. Pump 数据存储位置路径
      15. -enable-tolerant
      16. 开启 tolerant 后,如果 binlog 写入失败,Pump 不会报错(默认开启)
      17. -zookeeper-addrs string (-zookeeper_addrs = "192.168.0.11:2181,192.168.0.12:2181,192.168.0.13:2181")
      18. ZooKeeper 地址,该选项从 ZooKeeper 中获取 Kafka 地址,需要和 Kafka 中配置相同
      19. -gc int
      20. 日志最大保留天数 (默认 7),设置为 0 可永久保存
      21. -heartbeat-interval int
      22. Pump PD 发送心跳间隔 (单位 秒)
      23. -log-file string
      24. log 文件路径
      25. -log-rotate string
      26. log 文件切换频率,hour/day
      27. -metrics-addr string
      28. Prometheus pushgateway 地址,不设置则禁止上报监控信息
      29. -metrics-interval int
      30. 监控信息上报频率 (默认 15,单位 秒)
      31. -pd-urls string
      32. PD 集群节点的地址 (-pd-urls="http://192.168.0.16:2379,http://192.168.0.15:2379,http://192.168.0.14:2379")
      33. -socket string
      34. unix socket 模式服务监听地址(默认 unix:///tmp/pump.sock)
    2. Pump 配置文件

      1. # Pump Configuration.
      2. # Pump 提供服务的 RPC 地址("192.168.0.10:8250")
      3. addr = "192.168.0.10:8250"
      4. # Pump 对外提供服务的 RPC 地址("192.168.0.10:8250")
      5. advertise-addr = ""
      6. # binlog 最大保留天数 (默认 7),设置为 0 可永久保存
      7. gc = 7
      8. # Pump 数据存储位置路径
      9. data-dir = "data.pump"
      10. # ZooKeeper 地址,该选项从 ZooKeeper 中获取 Kafka 地址,若 Kafka 中配置了命名空间,则此处需同样配置
      11. # zookeeper-addrs = "192.168.0.11:2181,192.168.0.12:2181,192.168.0.13:2181"
      12. # 配置了命令空间的 ZooKeeper 地址配置示例
      13. # zookeeper-addrs = "192.168.0.11:2181,192.168.0.12:2181,192.168.0.13:2181/kafka/123"
      14. # Pump 向 PD 发送心跳的间隔 (单位 秒)
      15. heartbeat-interval = 3
      16. # PD 集群节点的地址
      17. pd-urls = "http://192.168.0.16:2379,http://192.168.0.15:2379,http://192.168.0.14:2379"
      18. # unix socket 模式服务监听地址 (默认 unix:///tmp/pump.sock)
      19. socket = "unix:///tmp/pump.sock"
    3. 启动示例

      1. ./bin/pump -config pump.toml

    使用 Binary 部署 Drainer

    1. Drainer 命令行参数说明

      1. Usage of Drainer:
      2. -L string
      3. 日志输出信息等级设置:debug, info, warn, error, fatal (默认 "info")
      4. -V
      5. 打印版本信息
      6. -addr string
      7. Drainer 提供服务的地址(-addr="192.168.0.10:8249")
      8. -c int
      9. 同步下游的并发数,该值设置越高同步的吞吐性能越好 (default 1)
      10. -config string
      11. 配置文件路径,Drainer 会首先读取配置文件的配置;
      12. 如果对应的配置在命令行参数里面也存在,Drainer 就会使用命令行参数的配置来覆盖配置文件里面的
      13. -data-dir string
      14. Drainer 数据存储位置路径 (默认 "data.drainer")
      15. -zookeeper-addrs string (-zookeeper-addrs="192.168.0.11:2181,192.168.0.12:2181,192.168.0.13:2181")
      16. ZooKeeper 地址,该选项从 ZooKeeper 中获取 Kafka 地址,需要和 Kafka 中配置相同
      17. -dest-db-type string
      18. Drainer 下游服务类型 (默认为 mysql)
      19. -detect-interval int
      20. PD 查询在线 Pump 的时间间隔 (默认 10,单位 秒)
      21. -disable-dispatch
      22. 是否禁用拆分单个 binlog sqls 的功能,如果设置为 true,则按照每个 binlog
      23. 顺序依次还原成单个事务进行同步(下游服务类型为 mysql,该项设置为 False
      24. -ignore-schemas string
      25. db 过滤列表 (默认 "INFORMATION_SCHEMA,PERFORMANCE_SCHEMA,mysql,test"),
      26. 不支持对 ignore schemas table 进行 rename DDL 操作
      27. -initial-commit-ts (默认为 0)
      28. 如果 Drainer 没有相关的断点信息,可以通过该项来设置相关的断点信息
      29. -log-file string
      30. log 文件路径
      31. -log-rotate string
      32. log 文件切换频率,hour/day
      33. -metrics-addr string
      34. Prometheus pushgateway 地址,不设置则禁止上报监控信息
      35. -metrics-interval int
      36. 监控信息上报频率(默认 15,单位 秒)
      37. -pd-urls string
      38. PD 集群节点的地址 (-pd-urls="http://192.168.0.16:2379,http://192.168.0.15:2379,http://192.168.0.14:2379")
      39. -txn-batch int
      40. 输出到下游数据库一个事务的 SQL 数量(默认 1
    2. Drainer 配置文件

      1. # Drainer Configuration.
      2. # Drainer 提供服务的地址("192.168.0.10:8249")
      3. addr = "192.168.0.10:8249"
      4. # 向 PD 查询在线 Pump 的时间间隔 (默认 10,单位 秒)
      5. detect-interval = 10
      6. # Drainer 数据存储位置路径 (默认 "data.drainer")
      7. data-dir = "data.drainer"
      8. # ZooKeeper 地址,该选项从 ZooKeeper 中获取 Kafka 地址,若 Kafka 中配置了命名空间,则此处需同样配置
      9. # zookeeper-addrs = "192.168.0.11:2181,192.168.0.12:2181,192.168.0.13:2181"
      10. # 配置了命令空间的 ZooKeeper 地址配置示例
      11. # zookeeper-addrs = "192.168.0.11:2181,192.168.0.12:2181,192.168.0.13:2181/kafka/123"
      12. # PD 集群节点的地址
      13. pd-urls = "http://192.168.0.16:2379,http://192.168.0.15:2379,http://192.168.0.14:2379"
      14. # log 文件路径
      15. log-file = "drainer.log"
      16. # Syncer Configuration.
      17. [syncer]
      18. ## db 过滤列表 (默认 "INFORMATION_SCHEMA,PERFORMANCE_SCHEMA,mysql,test"),
      19. ## 不支持对 ignore schemas 的 table 进行 rename DDL 操作
      20. ignore-schemas = "INFORMATION_SCHEMA,PERFORMANCE_SCHEMA,mysql"
      21. # 输出到下游数据库一个事务的 SQL 数量 (default 1)
      22. txn-batch = 1
      23. # 同步下游的并发数,该值设置越高同步的吞吐性能越好 (default 1)
      24. worker-count = 1
      25. # 是否禁用拆分单个 binlog 的 sqls 的功能,如果设置为 true,则按照每个 binlog
      26. # 顺序依次还原成单个事务进行同步(下游服务类型为 mysql, 该项设置为 False)
      27. disable-dispatch = false
      28. # Drainer 下游服务类型(默认为 mysql)
      29. # 参数有效值为 "mysql", "pb"
      30. db-type = "mysql"
      31. # replicate-do-db prioritizes over replicate-do-table when they have the same db name
      32. # and we support regex expressions,
      33. # 以 '~' 开始声明使用正则表达式
      34. #replicate-do-db = ["~^b.*","s1"]
      35. #[[syncer.replicate-do-table]]
      36. #db-name ="test"
      37. #tbl-name = "log"
      38. #[[syncer.replicate-do-table]]
      39. #db-name ="test"
      40. #tbl-name = "~^a.*"
      41. # db-type 设置为 mysql 时,下游数据库服务器参数
      42. [syncer.to]
      43. host = "192.168.0.10"
      44. user = "root"
      45. password = ""
      46. port = 3306
      47. # db-type 设置为 pb 时,存放 binlog 文件的目录
      48. # [syncer.to]
      49. # dir = "data.drainer"
    3. 启动示例

      1. ./bin/drainer -config drainer.toml

    下载 PbReader 工具 (Linux)

    PbReader 用于解析 Drainer 生成的 Pb 文件,并翻译成对应的 SQL 语句。

    CentOS 7+

    1. # 下载 PbReader 压缩包
    2. wget http://download.pingcap.org/pb_reader-latest-linux-amd64.tar.gz
    3. wget http://download.pingcap.org/pb_reader-latest-linux-amd64.sha256
    4. # 检查文件完整性,返回 ok 则正确
    5. sha256sum -c pb_reader-latest-linux-amd64.sha256
    6. # 解开压缩包
    7. tar -xzf pb_reader-latest-linux-amd64.tar.gz
    8. cd pb_reader-latest-linux-amd64

    PbReader 使用示例

    1. ./bin/pbReader -binlog-file=${path}/binlog-0000000000000000

    TiDB-Binlog 监控

    本部分主要介绍如何对 TiDB-Binlog 的状态、性能做监控,并通过 Prometheus + Grafana 展现 metrics 数据。

    Pump/Drainer 配置

    使用 Ansible 部署的 Pump 服务已经在启动参数设置 metrics。启动 Drainer 时可以设置以下两个参数:

    • --metrics-addr:设为 Push Gateway 的地址
    • --metrics-interval:设为 push 的频率,单位为秒,默认值为 15

    Grafana 配置

    • 进入 Grafana Web 界面(默认地址: http://localhost:3000,默认账号:admin,密码:admin)

      点击 Grafana Logo -> 点击 Data Sources -> 点击 Add data source -> 填写 data source 信息

      注:Type 选 Prometheus,URL 为 Prometheus 地址,根据实际情况添加/填写。

    • 导入 dashboard 配置文件

      点击 Grafana Logo -> 点击 Dashboards -> 点击 Import -> 选择需要的 dashboard 配置文件上传 -> 选择对应的 data source