TiDB Binlog 集群部署

    推荐使用 TiUP 部署 TiDB Binlog。即在使用 TiUP 部署 TiDB 时,在拓扑文件中添加 TiDB Binlog 的 和 pump 节点信息后,再随 TiDB 一起部署。详细部署方式参考 。

    TiDB Binlog 安装包位于 TiDB 离线工具包中。下载方式,请参考 TiDB 工具下载

    使用样例

    假设有三个 PD,一个 TiDB,另外有两台机器用于部署 Pump,一台机器用于部署 Drainer。各个节点信息如下:

    下面以此为例,说明 Pump/Drainer 的使用。

    1. 使用 binary 部署 Pump

        1. Usage of Pump:
        2. -L string
        3. 日志输出信息等级设置:debuginfowarnerrorfatal (默认 "info")
        4. -V
        5. 打印版本信息
        6. -addr string
        7. Pump 提供服务的 RPC 地址(-addr="192.168.0.11:8250")
        8. -advertise-addr string
        9. Pump 对外提供服务的 RPC 地址(-advertise-addr="192.168.0.11:8250")
        10. -config string
        11. 配置文件路径,如果你指定了配置文件,Pump 会首先读取配置文件的配置;
        12. 如果对应的配置在命令行参数里面也存在,Pump 就会使用命令行参数的配置来覆盖配置文件里的配置。
        13. -data-dir string
        14. Pump 数据存储位置路径
        15. -gc int
        16. Pump 只保留多少天以内的数据 (默认 7)
        17. -heartbeat-interval int
        18. Pump PD 发送心跳间隔 (单位 秒)
        19. -log-file string
        20. log 文件路径
        21. -log-rotate string
        22. log 文件切换频率,hour/day
        23. -metrics-addr string
        24. Prometheus Pushgateway 地址,不设置则禁止上报监控信息
        25. -metrics-interval int
        26. 监控信息上报频率 (默认 15,单位 秒)
        27. -node-id string
        28. Pump 节点的唯一识别 ID,如果不指定,程序会根据主机名和监听端口自动生成
        29. -pd-urls string
        30. PD 集群节点的地址 (-pd-urls="http://192.168.0.16:2379,http://192.168.0.15:2379,http://192.168.0.14:2379")
        31. -fake-binlog-interval int
        32. Pump 节点生成 fake binlog 的频率 (默认 3,单位 秒)
      • Pump 配置文件(以在 “192.168.0.11” 上部署为例)

      • 启动示例

        1. ./pump -config pump.toml

        如果命令行参数与配置文件中的参数重合,则使用命令行设置的参数的值。

    2. 使用 binary 部署 Drainer

      • Drainer 命令行参数说明(以在 “192.168.0.13” 上部署为例)

        1. # Drainer Configuration.
        2. # Drainer 提供服务的地址("192.168.0.13:8249")
        3. addr = "192.168.0.13:8249"
        4. # Drainer 对外提供服务的地址
        5. advertise-addr = "192.168.0.13:8249"
        6. # 向 PD 查询在线 Pump 的时间间隔 (默认 10,单位 秒)
        7. detect-interval = 10
        8. # Drainer 数据存储位置路径 (默认 "data.drainer")
        9. data-dir = "data.drainer"
        10. # PD 集群节点的地址 (英文逗号分割,中间不加空格)
        11. # log 文件路径
        12. log-file = "drainer.log"
        13. # Drainer 从 Pump 获取 binlog 时对数据进行压缩,值可以为 "gzip",如果不配置则不进行压缩
        14. # compressor = "gzip"
        15. # [security]
        16. # 如无特殊安全设置需要,该部分一般都注解掉
        17. # 包含与集群连接的受信任 SSL CA 列表的文件路径
        18. # ssl-ca = "/path/to/ca.pem"
        19. # 包含与集群连接的 PEM 形式的 X509 certificate 的路径
        20. # ssl-cert = "/path/to/pump.pem"
        21. # 包含与集群链接的 PEM 形式的 X509 key 的路径
        22. # ssl-key = "/path/to/pump-key.pem"
        23. # Syncer Configuration
        24. [syncer]
        25. # 如果设置了该项,会使用该 sql-mode 解析 DDL 语句,此时如果下游是 MySQL 或 TiDB 则
        26. # 下游的 sql-mode 也会被设置为该值
        27. # sql-mode = "STRICT_TRANS_TABLES,NO_ENGINE_SUBSTITUTION"
        28. # 输出到下游数据库一个事务的 SQL 语句数量 (默认 20)
        29. txn-batch = 20
        30. # 同步下游的并发数,该值设置越高同步的吞吐性能越好 (默认 16)
        31. worker-count = 16
        32. # 是否禁用拆分单个 binlog 的 SQL 的功能,如果设置为 true,则按照每个 binlog
        33. # 顺序依次还原成单个事务进行同步(下游服务类型为 MySQL, 该项设置为 False)
        34. disable-dispatch = false
        35. # safe mode 会使写下游 MySQL/TiDB 可被重复写入
        36. # 会用 replace 替换 insert 语句,用 delete + replace 替换 update 语句
        37. safe-mode = false
        38. # Drainer 下游服务类型(默认为 mysql)
        39. # 参数有效值为 "mysql","tidb","file","kafka"
        40. db-type = "mysql"
        41. # 事务的 commit ts 若在该列表中,则该事务将被过滤,不会同步至下游
        42. ignore-txn-commit-ts = []
        43. # db 过滤列表 (默认 "INFORMATION_SCHEMA,PERFORMANCE_SCHEMA,mysql,test"),
        44. # 不支持对 ignore schemas 的 table 进行 rename DDL 操作
        45. ignore-schemas = "INFORMATION_SCHEMA,PERFORMANCE_SCHEMA,mysql"
        46. # replicate-do-db 配置的优先级高于 replicate-do-table。如果配置了相同的库名,支持使用正则表达式进行配置。
        47. # 以 '~' 开始声明使用正则表达式
        48. # replicate-do-db = ["~^b.*","s1"]
        49. # [syncer.relay]
        50. # 保存 relay log 的目录,空值表示不开启。
        51. # 只有下游是 TiDB 或 MySQL 时该配置才生效。
        52. # log-dir = ""
        53. # 每个文件的大小上限
        54. # max-file-size = 10485760
        55. # [[syncer.replicate-do-table]]
        56. # tbl-name = "log"
        57. # db-name ="test"
        58. # tbl-name = "~^a.*"
        59. # 忽略同步某些表
        60. # [[syncer.ignore-table]]
        61. # db-name = "test"
        62. # tbl-name = "log"
        63. # db-type 设置为 mysql 时,下游数据库服务器参数
        64. [syncer.to]
        65. host = "192.168.0.13"
        66. user = "root"
        67. # 如果你不想在配置文件中写明文密码,则可以使用 `./binlogctl -cmd encrypt -text string` 生成加密的密码
        68. # 如果配置了 encrypted_password 且非空,那么配置的 password 不生效。encrypted_password 和 password 无法同时生效。
        69. password = ""
        70. encrypted_password = ""
        71. port = 3306
        72. [syncer.to.checkpoint]
        73. # 当 checkpoint type 是 mysql 或 tidb 时可以开启该选项,以改变保存 checkpoint 的数据库
        74. # schema = "tidb_binlog"
        75. # 目前只支持 mysql 或者 tidb 类型。可以去掉注释来控制 checkpoint 保存的位置。
        76. # db-type 默认的 checkpoint 保存方式是:
        77. # mysql/tidb -> 对应的下游 mysql/tidb
        78. # file/kafka -> file in `data-dir`
        79. # type = "mysql"
        80. # host = "127.0.0.1"
        81. # user = "root"
        82. # password = ""
        83. # 使用 `./binlogctl -cmd encrypt -text string` 加密的密码
        84. # encrypted_password 非空时 password 会被忽略
        85. # encrypted_password = ""
        86. # port = 3306
        87. # db-type 设置为 file 时,存放 binlog 文件的目录
        88. # [syncer.to]
        89. # dir = "data.drainer"
        90. # db-type 设置为 kafka 时,Kafka 相关配置
        91. # [syncer.to]
        92. # kafka-addrs 和 zookeeper-addrs 只需要一个,两者都有时程序会优先用 zookeeper 中的 kafka 地址
        93. # zookeeper-addrs = "127.0.0.1:2181"
        94. # kafka-addrs = "127.0.0.1:9092"
        95. # kafka-version = "0.8.2.0"
        96. # 配置单条 broker request 中的最大 message 数(即 binlog 数),不配置或配置小于等于 0 时会使用默认值 1024
        97. # kafka-max-messages = 1024
        98. # 配置单条 broker request 的最大 size(单位为 Byte),默认为 1 GiB,最大可配置为 2 GiB
        99. # kafka-max-message-size = 1073741824
        100. # 保存 binlog 数据的 Kafka 集群的 topic 名称,默认值为 <cluster-id>_obinlog
        101. # 如果运行多个 Drainer 同步数据到同一个 Kafka 集群,每个 Drainer 的 topic-name 需要设置不同的名称
        102. # topic-name = ""
      • 启动示例

        初次启动时使用参数 initial-commit-ts, 命令如下:

        如果命令行参数与配置文件中的参数重合,则使用命令行设置的参数的值。

    • 在运行 TiDB 时,需要保证至少一个 Pump 正常运行。
    • 通过给 TiDB 增加启动参数 enable-binlog 来开启 binlog 服务。尽量保证同一集群的所有 TiDB 都开启了 binlog 服务,否则在同步数据时可能会导致上下游数据不一致。如果要临时运行一个不开启 binlog 服务的 TiDB 实例,需要在 TiDB 的配置文件中设置 run_ddl= false
    • Drainer 不支持对 ignore schemas(在过滤列表中的 schemas)的 table 进行 rename DDL 操作。
    • 在已有的 TiDB 集群中启动 Drainer,一般需要全量备份并且获取快照时间戳,然后导入全量备份,最后启动 Drainer 从对应的快照时间戳开始同步增量数据。
    • 如果存在上游 TiDB 能运行但下游 MySQL 不支持的 DDL 语句时(例如下游 MySQL 使用 InnoDB 引擎时同步语句 CREATE TABLE t1(a INT) ROW_FORMAT=FIXED;),Drainer 也会同步失败,此时可以在 Drainer 配置中跳过该事务,同时在下游手动执行兼容的语句,详见跳过事务