From 5265aaa41b0b872d9244a1b5f1704df34558ebec Mon Sep 17 00:00:00 2001 From: Neil Shen Date: Mon, 15 Jun 2020 19:57:26 +0800 Subject: [PATCH 1/7] cdc: add cyclic replication doc Signed-off-by: Neil Shen --- media/cdc-cyclic-replication.png | Bin 0 -> 16858 bytes ticdc/manage-ticdc.md | 127 ++++++++++++++++++++++++++++--- 2 files changed, 117 insertions(+), 10 deletions(-) create mode 100644 media/cdc-cyclic-replication.png diff --git a/media/cdc-cyclic-replication.png b/media/cdc-cyclic-replication.png new file mode 100644 index 0000000000000000000000000000000000000000..2b22d1667b3e53f73ced6b4ace870337cf4677e7 GIT binary patch literal 16858 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 ```shell - cdc cli capture list --pd=http://127.0.0.1:2379 + cdc cli capture list --pd=http://10.0.10.25:2379 ``` ``` @@ -80,7 +80,7 @@ cdc server --pd=http://10.0.10.25:2379 --log-file=ticdc_3.log --addr=0.0.0.0:830 {{< copyable "shell-regular" >}} ```shell -cdc cli changefeed create --pd=http://127.0.0.1:2379 --sink-uri="mysql://root:123456@127.0.0.1:3306/" +cdc cli changefeed create --pd=http://10.0.10.25:2379 --sink-uri="mysql://root:123456@127.0.0.1:3306/" create changefeed ID: 28c43ffc-2316-4f4f-a70b-d1a7c59ba79f info {"sink-uri":"mysql://root:123456@127.0.0.1:3306/","opts":{},"create-time":"2020-03-12T22:04:08.103600025+08:00","start-ts":415241823337054209,"target-ts":0,"admin-job-type":0,"config":{"filter-case-sensitive":false,"filter-rules":null,"ignore-txn-start-ts":null}} ``` @@ -142,7 +142,7 @@ create changefeed ID: 28c43ffc-2316-4f4f-a70b-d1a7c59ba79f info {"sink-uri":"mys {{< copyable "shell-regular" >}} ```shell -cdc cli changefeed list --pd=http://127.0.0.1:2379 +cdc cli changefeed list --pd=http://10.0.10.25:2379 ``` ``` @@ -160,7 +160,7 @@ cdc cli changefeed list --pd=http://127.0.0.1:2379 {{< copyable "shell-regular" >}} ```shell -cdc cli changefeed query --pd=http://127.0.0.1:2379 --changefeed-id=28c43ffc-2316-4f4f-a70b-d1a7c59ba79f +cdc cli changefeed query --pd=http://10.0.10.25:2379 --changefeed-id=28c43ffc-2316-4f4f-a70b-d1a7c59ba79f ``` ``` @@ -203,7 +203,7 @@ cdc cli changefeed query --pd=http://127.0.0.1:2379 --changefeed-id=28c43ffc-231 {{< copyable "shell-regular" >}} ```shell -cdc cli changefeed pause --pd=http://127.0.0.1:2379 --changefeed-id 28c43ffc-2316-4f4f-a70b-d1a7c59ba79f +cdc cli changefeed pause --pd=http://10.0.10.25:2379 --changefeed-id 28c43ffc-2316-4f4f-a70b-d1a7c59ba79f ``` 以上命令中: @@ -217,7 +217,7 @@ cdc cli changefeed pause --pd=http://127.0.0.1:2379 --changefeed-id 28c43ffc-231 {{< copyable "shell-regular" >}} ```shell -cdc cli changefeed resume --pd=http://127.0.0.1:2379 --changefeed-id 28c43ffc-2316-4f4f-a70b-d1a7c59ba79f +cdc cli changefeed resume --pd=http://10.0.10.25:2379 --changefeed-id 28c43ffc-2316-4f4f-a70b-d1a7c59ba79f ``` 以上命令中: @@ -231,7 +231,7 @@ cdc cli changefeed resume --pd=http://127.0.0.1:2379 --changefeed-id 28c43ffc-23 {{< copyable "shell-regular" >}} ```shell -cdc cli changefeed remove --pd=http://127.0.0.1:2379 --changefeed-id 28c43ffc-2316-4f4f-a70b-d1a7c59ba79f +cdc cli changefeed remove --pd=http://10.0.10.25:2379 --changefeed-id 28c43ffc-2316-4f4f-a70b-d1a7c59ba79f ``` - `--changefeed=uuid` 为需要操作的 `changefeed` ID。 @@ -243,7 +243,7 @@ cdc cli changefeed remove --pd=http://127.0.0.1:2379 --changefeed-id 28c43ffc-23 {{< copyable "shell-regular" >}} ```shell - cdc cli processor list --pd=http://127.0.0.1:2379 + cdc cli processor list --pd=http://10.0.10.25:2379 ``` ``` @@ -261,7 +261,7 @@ cdc cli changefeed remove --pd=http://127.0.0.1:2379 --changefeed-id 28c43ffc-23 {{< copyable "shell-regular" >}} ```shell - cdc cli processor query --pd=http://127.0.0.1:2379 --changefeed-id=28c43ffc-2316-4f4f-a70b-d1a7c59ba79f + cdc cli processor query --pd=http://10.0.10.25:2379 --changefeed-id=28c43ffc-2316-4f4f-a70b-d1a7c59ba79f ``` ``` @@ -335,3 +335,110 @@ curl -X POST http://127.0.0.1:8301/capture/owner/resign ``` election: not leader ``` + +## 环形同步 + +> **警告:** +> +> 环形同步功能还在实验中,没有经过完备的测试。暂时请避免在生产环境中使用该功能。 + +环形同步功能可以在多个独立的 TiDB 集群间同步数据。比如有三个 TiDB 集群 A,B 和 C,它们都有一个数据表 `test.user_data`,并且各自对它有写入。环形同步功能可以将 A,B 和 C 对 `test.user_data` 的写入同步其它集群上,使三个集群上的 `test.user_data` 达到最终一致。 + +### 环形同步使用示例 + +在三个集群 A, B 和 C 上开启环形复制,其中 A 到 B 的同步使用两个 TiCDC。A 作为 + +![TiCDC cyclic replication](/media/cdc-cyclic-replication.png) + +环形复制的使用需要设置同步任务的创建参数: + ++ `--cyclic-replica-id`,为上游集群的写入指定来源 ID,需要确保每个集群的 ID 唯一性。 ++ `--cyclic-filter-replica-ids`,指定需要过滤的写入来源 ID,通常为下游集群的 ID。 ++ `--cyclic-sync-ddl`,是否同步 DDL 到下游,只能在一个集群的 CDC 上开启同步 DDL。 + +环形同步任务创建步骤如下: + +1. 在 TiDB 集群 A,B 和 C 上[启动 TiCDC 组件](#TiCDC-部署)。 + + {{< copyable "shell-regular" >}} + + ```shell + # 在 TiDB 集群 A 上启动 TiCDC 组件。 + cdc server \ + --pd="http://${PD_A_HOST}:${PD_A_PORT}" \ + --log-file=ticdc_1.log \ + --addr=0.0.0.0:8301 \ + --advertise-addr=127.0.0.1:8301 + + # 在 TiDB 集群 B 上启动 TiCDC 组件。 + cdc server \ + --pd="http://${PD_B_HOST}:${PD_B_PORT}" \ + --log-file=ticdc_2.log \ + --addr=0.0.0.0:8301 \ + --advertise-addr=127.0.0.1:8301 + + # 在 TiDB 集群 C 上启动 TiCDC 组件。 + cdc server \ + --pd="http://${PD_C_HOST}:${PD_C_PORT}" \ + --log-file=ticdc_3.log \ + --addr=0.0.0.0:8301 \ + --advertise-addr=127.0.0.1:8301 + ``` + +2. 在 TiDB 集群 A,B 和 C 上创建环形同步需要使用的标记数据表 (`mark table`)。 + + {{< copyable "shell-regular" >}} + + ```shell + # 在 TiDB 集群 A 上创建表数据表。 + cdc cli changefeed cyclic create-marktables \ + --cyclic-upstream-dsn="root@tcp(${TIDB_A_HOST}:${TIDB_A_PORT})/" + + # 在 TiDB 集群 B 上创建表数据表。 + cdc cli changefeed cyclic create-marktables \ + --cyclic-upstream-dsn="root@tcp(${TIDB_B_HOST}:${TIDB_B_PORT})/" + + # 在 TiDB 集群 C 上创建表数据表。 + cdc cli changefeed cyclic create-marktables \ + --cyclic-upstream-dsn="root@tcp(${TIDB_C_HOST}:${TIDB_C_PORT})/" + ``` + +3. 在 TiDB 集群 A,B 和 C 上创建环形同步任务。 + + {{< copyable "shell-regular" >}} + + ```shell + # 在 TiDB 集群 A 上创建环形同步任务。 + cdc cli changefeed create \ + --sink-uri="mysql://root@${TiDB_B_HOST}/" \ + --pd="http://${PD_A_HOST}:${PD_A_PORT}" \ + --cyclic-replica-id 1 \ + --cyclic-filter-replica-ids 2 \ + --cyclic-sync-ddl true + + # 在 TiDB 集群 B 上创建环形同步任务。 + cdc cli changefeed create \ + --sink-uri="mysql://root@${TiDB_C_HOST}/" \ + --pd="http://${PD_B_HOST}:${PD_B_PORT}" \ + --cyclic-replica-id 2 \ + --cyclic-filter-replica-ids 3 \ + --cyclic-sync-ddl false + + # 在 TiDB 集群 C 上创建环形同步任务。 + cdc cli changefeed create \ + --sink-uri="mysql://root@${TiDB_A_HOST}/" \ + --pd="http://${PD_C_HOST}:${PD_C_PORT}" \ + --cyclic-replica-id 3 \ + --cyclic-filter-replica-ids 1 \ + --cyclic-sync-ddl false + ``` + +### 环形同步使用限制 + +1. 环形复制功能使用到的表急表必须在创建环形同步任务前使用 `cdc cli changefeed cyclic create-marktables` 创建。 +3. 开启环形复制的数据表只包含 [a-zA-z0-9_] 字符。 +3. 开启环形复制的数据表表必须在创建环形同步任务前创建完毕。 +4. 开启环形复制后,不能创建一个会被环形同步任务同步的表。 +5. 如果想在线 DDL,需要确保: + 1. 多个集群中有且仅有一个集群的 CDC(s) 开启了 cyclic-sync-ddl,例如示例中的 A 集群 CDC + 2. DDL 执行在开启 cyclic-sync-ddl 的集群上,例如示例中的 A 集群 From dc6138d127ebe836ce44cad24df283b160adf4bd Mon Sep 17 00:00:00 2001 From: Neil Shen Date: Tue, 16 Jun 2020 13:03:57 +0800 Subject: [PATCH 2/7] address lint Signed-off-by: Neil Shen --- ticdc/manage-ticdc.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ticdc/manage-ticdc.md b/ticdc/manage-ticdc.md index 8d15b74c30a3..77725a1807ae 100644 --- a/ticdc/manage-ticdc.md +++ b/ticdc/manage-ticdc.md @@ -436,7 +436,7 @@ election: not leader ### 环形同步使用限制 1. 环形复制功能使用到的表急表必须在创建环形同步任务前使用 `cdc cli changefeed cyclic create-marktables` 创建。 -3. 开启环形复制的数据表只包含 [a-zA-z0-9_] 字符。 +2. 开启环形复制的数据表只包含 [a-zA-z0-9_] 字符。 3. 开启环形复制的数据表表必须在创建环形同步任务前创建完毕。 4. 开启环形复制后,不能创建一个会被环形同步任务同步的表。 5. 如果想在线 DDL,需要确保: From 2e5df08174895f3d6b80621293688f544bca6153 Mon Sep 17 00:00:00 2001 From: Neil Shen Date: Tue, 16 Jun 2020 14:28:06 +0800 Subject: [PATCH 3/7] address comments Signed-off-by: Neil Shen --- media/cdc-cyclic-replication.png | Bin 16858 -> 17163 bytes ticdc/manage-ticdc.md | 14 +++++++------- 2 files changed, 7 insertions(+), 7 deletions(-) diff --git a/media/cdc-cyclic-replication.png b/media/cdc-cyclic-replication.png index 2b22d1667b3e53f73ced6b4ace870337cf4677e7..90bd33baf35e1609b6f6be332c948f1b26ec300d 100644 GIT binary patch literal 17163 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 ZX+lBcX9vEY4Zz*~44$rjF6*2UngBd?Jp%v$ literal 16858 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 ```shell - # 在 TiDB 集群 A 上创建表数据表。 + # 在 TiDB 集群 A 上创建标记数据表。 cdc cli changefeed cyclic create-marktables \ --cyclic-upstream-dsn="root@tcp(${TIDB_A_HOST}:${TIDB_A_PORT})/" - # 在 TiDB 集群 B 上创建表数据表。 + # 在 TiDB 集群 B 上创建标记数据表。 cdc cli changefeed cyclic create-marktables \ --cyclic-upstream-dsn="root@tcp(${TIDB_B_HOST}:${TIDB_B_PORT})/" - # 在 TiDB 集群 C 上创建表数据表。 + # 在 TiDB 集群 C 上创建标记数据表。 cdc cli changefeed cyclic create-marktables \ --cyclic-upstream-dsn="root@tcp(${TIDB_C_HOST}:${TIDB_C_PORT})/" ``` @@ -422,7 +422,7 @@ election: not leader --pd="http://${PD_B_HOST}:${PD_B_PORT}" \ --cyclic-replica-id 2 \ --cyclic-filter-replica-ids 3 \ - --cyclic-sync-ddl false + --cyclic-sync-ddl true # 在 TiDB 集群 C 上创建环形同步任务。 cdc cli changefeed create \ @@ -435,10 +435,10 @@ election: not leader ### 环形同步使用限制 -1. 环形复制功能使用到的表急表必须在创建环形同步任务前使用 `cdc cli changefeed cyclic create-marktables` 创建。 +1. 环形复制功能使用到的标记表必须在创建环形同步任务前使用 `cdc cli changefeed cyclic create-marktables` 创建。 2. 开启环形复制的数据表只包含 [a-zA-z0-9_] 字符。 3. 开启环形复制的数据表表必须在创建环形同步任务前创建完毕。 4. 开启环形复制后,不能创建一个会被环形同步任务同步的表。 5. 如果想在线 DDL,需要确保: - 1. 多个集群中有且仅有一个集群的 CDC(s) 开启了 cyclic-sync-ddl,例如示例中的 A 集群 CDC - 2. DDL 执行在开启 cyclic-sync-ddl 的集群上,例如示例中的 A 集群 + 1. 多个集群的 CDC 构成一个单向 DDL 同步链,不能成环,例如示例中只有 C 集群的 CDC 关闭 sync-ddl。 + 2. DDL 必须在单向 DDL 同步链的开始集群上执行,例如示例中的 A 集群。 From de11b50041ad3592b344ebc7a16c2ca6c34e5f3a Mon Sep 17 00:00:00 2001 From: Neil Shen Date: Tue, 16 Jun 2020 16:21:52 +0800 Subject: [PATCH 4/7] update command usage Signed-off-by: Neil Shen --- ticdc/manage-ticdc.md | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/ticdc/manage-ticdc.md b/ticdc/manage-ticdc.md index 812b841498c1..a4246a79baad 100644 --- a/ticdc/manage-ticdc.md +++ b/ticdc/manage-ticdc.md @@ -392,15 +392,18 @@ election: not leader ```shell # 在 TiDB 集群 A 上创建标记数据表。 cdc cli changefeed cyclic create-marktables \ - --cyclic-upstream-dsn="root@tcp(${TIDB_A_HOST}:${TIDB_A_PORT})/" + --cyclic-upstream-dsn="root@tcp(${TIDB_A_HOST}:${TIDB_A_PORT})/" \ + --pd="http://${PD_A_HOST}:${PD_A_PORT}" \ # 在 TiDB 集群 B 上创建标记数据表。 cdc cli changefeed cyclic create-marktables \ - --cyclic-upstream-dsn="root@tcp(${TIDB_B_HOST}:${TIDB_B_PORT})/" + --cyclic-upstream-dsn="root@tcp(${TIDB_B_HOST}:${TIDB_B_PORT})/" \ + --pd="http://${PD_B_HOST}:${PD_B_PORT}" \ # 在 TiDB 集群 C 上创建标记数据表。 cdc cli changefeed cyclic create-marktables \ - --cyclic-upstream-dsn="root@tcp(${TIDB_C_HOST}:${TIDB_C_PORT})/" + --cyclic-upstream-dsn="root@tcp(${TIDB_C_HOST}:${TIDB_C_PORT})/" \ + --pd="http://${PD_C_HOST}:${PD_C_PORT}" \ ``` 3. 在 TiDB 集群 A,B 和 C 上创建环形同步任务。 From 4bc3e0e438c1b370605ffbd6b5958cc055417ead Mon Sep 17 00:00:00 2001 From: Neil Shen Date: Wed, 17 Jun 2020 19:58:59 +0800 Subject: [PATCH 5/7] Apply suggestions from code review Co-authored-by: Lilian Lee --- ticdc/manage-ticdc.md | 22 +++++++++++----------- 1 file changed, 11 insertions(+), 11 deletions(-) diff --git a/ticdc/manage-ticdc.md b/ticdc/manage-ticdc.md index a4246a79baad..2f9f1b856cc3 100644 --- a/ticdc/manage-ticdc.md +++ b/ticdc/manage-ticdc.md @@ -340,9 +340,9 @@ election: not leader > **警告:** > -> 环形同步功能还在实验中,没有经过完备的测试。暂时请避免在生产环境中使用该功能。 +> 目前环形同步属于实验特性,尚未经过完备的测试,不建议在生产环境中使用该功能。 -环形同步功能可以在多个独立的 TiDB 集群间同步数据。比如有三个 TiDB 集群 A,B 和 C,它们都有一个数据表 `test.user_data`,并且各自对它有写入。环形同步功能可以将 A,B 和 C 对 `test.user_data` 的写入同步其它集群上,使三个集群上的 `test.user_data` 达到最终一致。 +环形同步功能支持在多个独立的 TiDB 集群间同步数据。比如有三个 TiDB 集群 A、B 和 C,它们都有一个数据表 `test.user_data`,并且各自对它有数据写入。环形同步功能可以将 A、B 和 C 对 `test.user_data` 的写入同步其它集群上,使三个集群上的 `test.user_data` 达到最终一致。 ### 环形同步使用示例 @@ -350,15 +350,15 @@ election: not leader ![TiCDC cyclic replication](/media/cdc-cyclic-replication.png) -环形复制的使用需要设置同步任务的创建参数: +使用环形同步功能时,需要设置同步任务的创建参数: -+ `--cyclic-replica-id`,为上游集群的写入指定来源 ID,需要确保每个集群的 ID 唯一性。 -+ `--cyclic-filter-replica-ids`,指定需要过滤的写入来源 ID,通常为下游集群的 ID。 -+ `--cyclic-sync-ddl`,是否同步 DDL 到下游,只能在一个集群的 CDC 上开启同步 DDL。 ++ `--cyclic-replica-id`:用于指定为上游集群的写入指定来源 ID,需要确保每个集群 ID 的唯一性。 ++ `--cyclic-filter-replica-ids`:用于指定需要过滤的写入来源 ID,通常为下游集群的 ID。 ++ `--cyclic-sync-ddl`:用于指定是否同步 DDL 到下游,只能在一个集群的 CDC 上开启 DDL 同步。 环形同步任务创建步骤如下: -1. 在 TiDB 集群 A,B 和 C 上[启动 TiCDC 组件](#TiCDC-部署)。 +1. 在 TiDB 集群 A,B 和 C 上[启动 TiCDC 组件](#ticdc-部署)。 {{< copyable "shell-regular" >}} @@ -438,10 +438,10 @@ election: not leader ### 环形同步使用限制 -1. 环形复制功能使用到的标记表必须在创建环形同步任务前使用 `cdc cli changefeed cyclic create-marktables` 创建。 +1. 在创建环形同步任务前,必须使用 `cdc cli changefeed cyclic create-marktables` 创建环形复制功能使用到的标记表。 2. 开启环形复制的数据表只包含 [a-zA-z0-9_] 字符。 -3. 开启环形复制的数据表表必须在创建环形同步任务前创建完毕。 +3. 在创建环形同步任务前,开启环形复制的数据表必须已创建完毕。 4. 开启环形复制后,不能创建一个会被环形同步任务同步的表。 -5. 如果想在线 DDL,需要确保: - 1. 多个集群的 CDC 构成一个单向 DDL 同步链,不能成环,例如示例中只有 C 集群的 CDC 关闭 sync-ddl。 +5. 如果想在线 DDL,需要确保以下两点: + 1. 多个集群的 CDC 构成一个单向 DDL 同步链,不能成环,例如示例中只有 C 集群的 CDC 关闭了 sync-ddl。 2. DDL 必须在单向 DDL 同步链的开始集群上执行,例如示例中的 A 集群。 From 3b02b27693cee42cde2ec95a90d8c0a40ed3c47c Mon Sep 17 00:00:00 2001 From: Neil Shen Date: Wed, 17 Jun 2020 20:00:25 +0800 Subject: [PATCH 6/7] complete sentence Signed-off-by: Neil Shen --- ticdc/manage-ticdc.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ticdc/manage-ticdc.md b/ticdc/manage-ticdc.md index 2f9f1b856cc3..24b58625f9f3 100644 --- a/ticdc/manage-ticdc.md +++ b/ticdc/manage-ticdc.md @@ -346,7 +346,7 @@ election: not leader ### 环形同步使用示例 -在三个集群 A, B 和 C 上开启环形复制,其中 A 到 B 的同步使用两个 TiCDC。A 作为 +在三个集群 A, B 和 C 上开启环形复制,其中 A 到 B 的同步使用两个 TiCDC。A 作为三个集群的 DDL 入口。 ![TiCDC cyclic replication](/media/cdc-cyclic-replication.png) From 7f2c2489d3801045c7ca26d0a661eec667c2acc9 Mon Sep 17 00:00:00 2001 From: Neil Shen Date: Wed, 17 Jun 2020 20:01:40 +0800 Subject: [PATCH 7/7] =?UTF-8?q?use=20"=E3=80=81"=20instead=20of=20","?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: Neil Shen --- ticdc/manage-ticdc.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ticdc/manage-ticdc.md b/ticdc/manage-ticdc.md index 24b58625f9f3..cb0110bc7a97 100644 --- a/ticdc/manage-ticdc.md +++ b/ticdc/manage-ticdc.md @@ -346,7 +346,7 @@ election: not leader ### 环形同步使用示例 -在三个集群 A, B 和 C 上开启环形复制,其中 A 到 B 的同步使用两个 TiCDC。A 作为三个集群的 DDL 入口。 +在三个集群 A、B 和 C 上开启环形复制,其中 A 到 B 的同步使用两个 TiCDC。A 作为三个集群的 DDL 入口。 ![TiCDC cyclic replication](/media/cdc-cyclic-replication.png)