TiDB 中如何开启增量备份模式,答案就是通过 binlog 组件,关于 tidb-binlog 的架构可以参考官网,这里只简单记录如何 step by step 开启 binlog 功能。
一、部署 pump 组件
1、编辑 inventory.ini 配置文件,添加 pump服务器的配置,默认可以和 tidb-server 一起部署
pump1 ansible_host=172.16.3.51 deploy_dir=/home/tidb/deploy/pump
pump2 ansible_host=172.16.3.52 deploy_dir=/home/tidb/deploy/pump
pump3 ansible_host=172.16.3.53 deploy_dir=/home/tidb/deploy/pump
2、执行 deploy 操作
ansible-playbook deploy.yml --tags=pump
3、启动 pump 服务
ansible-playbook start.yml --tags=pump
4、更新并重启 tidb-server
ansible-playbook rolling_update.yml --tags=tidb
5、更新监控信息
ansible-playbook rolling_update_monitor.yml --tags=prometheus
6、通过 binlogctl 查看 pump 状态是否正常
binlogctl -pd-urls=http://pd-ip:2379 -cmd pumps
[tidb@node1 tidb-ansible]$ ./resources/bin/binlogctl -pd-urls=http://172.16.3.51:2379 -cmd pumps
[2019/04/28 21:29:25.780 +08:00] [INFO] [nodes.go:47] ["query node"] [type=pump] [node="{NodeID: node1:8250, Addr: 172.16.3.51:8250, State: online, MaxCommitTS: 408016168519204865, UpdateTime: 2019-04-28 21:29:24 +0800 CST}"]
[2019/04/28 21:29:25.780 +08:00] [INFO] [nodes.go:47] ["query node"] [type=pump] [node="{NodeID: node2:8250, Addr: 172.16.3.52:8250, State: online, MaxCommitTS: 408016168558526465, UpdateTime: 2019-04-28 21:29:24 +0800 CST}"]
[2019/04/28 21:29:25.780 +08:00] [INFO] [nodes.go:47] ["query node"] [type=pump] [node="{NodeID: node3:8250, Addr: 172.16.3.53:8250, State: online, MaxCommitTS: 408016168296382465, UpdateTime: 2019-04-28 21:29:23 +0800 CST}"]
7、通过 binlogctl 获取drainer 初次启动所需要的 tso 信息
./resources/bin/binlogctl -pd-urls=http://pd-ip:2379 -cmd generate_meta
[tidb@node1 tidb-ansible]$ ./resources/bin/binlogctl -pd-urls=http://172.16.3.51:2379 -cmd generate_meta
INFO[0000] [pd] create pd client with endpoints [http://172.16.3.51:2379]
INFO[0000] [pd] leader switches to: http://172.16.3.53:2379, previous:
INFO[0000] [pd] init cluster id 6684771076978537216
[2019/04/28 21:31:43.259 +08:00] [INFO] [meta.go:124] ["save meta"] [meta="commitTS: 408016205442187267"]
二、构造测试数据
MySQL [(none)]> create database dky_test1;
Query OK, 0 rows affected (1.44 sec)
MySQL [(none)]> use dky_test1;
Database changed
MySQL [dky_test1]> create table t1(id int auto_increment key, name char(10));
Query OK, 0 rows affected (1.28 sec)
MySQL [dky_test1]> insert into t1 (name) values ('a'), ('b'), ('c');
Query OK, 3 rows affected (1.62 sec)
Records: 3 Duplicates: 0 Warnings: 0
MySQL [dky_test1]> select * from t1;
+----+------+
| id | name |
+----+------+
| 1 | a |
| 2 | b |
| 3 | c |
+----+------+
3 rows in set (0.00 sec)
三、用 mydumper 做一个全量备份
sudo su
yum install wget
wget http://download.pingcap.org/tidb-enterprise-tools-latest-linux-amd64.tar.gz
mydumper -h 172.16.3.51 -P 4000 -u root -B dky_test1 --skip-tz-utc -o /home/tidb/deploy/tidb_bak
四、部署 drainer 组件
首先需要了解 tidb-binlog 的三种 输出模式,分别为 MySQL / TIDB,PB(增量文件)和 Kafka,下面以 pb 模式为例,讲解如何配置
1、编辑 inventory.ini 配置,添加 drainer 的配置项
如果是 pb(增量文件)的方式,配置如下
drainer_pb ansible_host=172.16.3.53 initial_commit_ts="408016205442187267"
#如果是 mysql 的方式,配置如下
#drainer_mysql ansible_host=172.16.3.53 initial_commit_ts="408016205442187267"
2、修改 drainer 配置文件模板
cd /home/tidb/tidb-ansible/conf
cp drainer-cluster.toml drainer_pb_drainer-cluster.toml
修改下面的配置项,
db-type = "pb"
注释掉默认 mysql 的连接串配置,取消注释下面三行,默认在 deploy_dir 目录下的 data.drainer
注意不要配置压缩 compression 的选项,否则目前版本的 reparo 解析增量 binlog 文件可能会有问题
[syncer.to]
dir = "data.drainer"
# compression = "gzip"
3、部署 drainer
ansible-playbook deploy_drainer.yml
4、启动 drainer
ansible-playbook start_drainer.yml
五、测试增量恢复
解析 tidb-binlog 文件是通过一个叫 reparo 的工具来实现,这个工具包目前是集成在 binlog 的工具集里面,大家能够直接下载,近期应该也会随 binlog 一起开源。
reparo 的下载及配置说明请参考官网,https://pingcap.com/docs-cn/tools/binlog/reparo/#reparo-使用文档
可以通过配置datetime 时间戳,或者 tso 来解析指定某一段时间的 binlog,测试时可以配置dest-type = "print" 将解析出的 binlog 打印到屏幕
六、tidb-binlog 常见问题 FAQ
1、已经部署 tidb-server 的情况下,是否可以后期再开启 binlog 功能?
可以,按照上面的步骤操作即可,不过会有一次 tidb-server 滚动重启的过程,而且一定要所有的 tidb-server 都开启 binlog 功能,不支持只开启部分 tidb-server 的 binlog 功能。
2、是否支持 tidb-binlog 不会影响 tidb-server 的运行?
默认场景下,我们认为既然要开启 binlog,那么就需要保证所有 tidb-server 的操作都要被记录到,如果 binlog 功能异常,默认配置下 tidb-server 是会被阻塞的,但是这个功能可以通过配置关闭,具体的参数是在 tidb.toml
[binlog]
ignore-error = false
3、如果希望 tidb-binlog 的内容被多个系统调用,如何实现,例如搭建一套 tidb 从库,同时又希望开启增量备份文件?
可以通过部署多个 drainer 模块来实现,如果多个 drainer 是部署在同一台服务器上,需要配置不同的监控端口。