相对于从其它数据库向 TiDB 进行单次迁移切换,TiDB 到 TiDB 的数据复制体系一般是长期的高可用容灾场景,适用于多机房、多数据中心等环境,需要更加稳定可靠。建议增加服务管理和数据比对校验等辅助机制。

    DataX 工具实现跨 TiDB 集群的增量数据复制,是在 TiDB 4.0 的 CDC 工具正式发布前比较成熟的一项选择,有利于在数据中心内统一同异构平台的数据传输工具。

    下面会以双 TiDB 集群互为主备的场景为案例进行操作讲解。从设计上既满足了传统数据库运维的要求,生产数据库拥有容灾备库提高系统健壮性,又使得服务器硬件等资源得到了更充分的利用。

    方案设计如图所示

    图片

    具体操作步骤:

    第一步:部署DataX

    下载

    1. wget http://datax-opensource.oss-cn-hangzhou.aliyuncs.com/datax.tar.gz

    解压

    1. tar -zxvf datax.tar.gz

    自检

    1. python {YOUR_DATAX_HOME}/bin/datax.py {YOUR_DATAX_HOME}/job/job.json

    第二步:编辑同步Job

    vi increase.json

    1. {
    2. "job": {
    3. "setting": {
    4. "speed": {
    5. "channel": 128 #根据业务情况调整Channel
    6. }
    7. },
    8. "content": [{
    9. "reader": {
    10. "name": "tidbreader",
    11. "parameter": {
    12. "username": "${srcUserName}",
    13. "password": "${srcPassword}",
    14. "column": ["*"],
    15. "connection": [{
    16. "table": ["${tableName}"],
    17. "jdbcUrl": ["${srcUrl}"]
    18. }],
    19. "where": "updateTime >= '${syncTime}'"
    20. }
    21. },
    22. "writer": {
    23. "name": "tidbwriter",
    24. "parameter": {
    25. "username": "${desUserName}",
    26. "password": "${desPassword}",
    27. "writeMode": "replace",
    28. "column": ["*"],
    29. "connection": [{
    30. "jdbcUrl": "${desUrl}",
    31. "table": ["${tableName}"]
    32. }],
    33. "preSql": [
    34. "replace into t_sync_record(table_name,start_date,end_date) values('@table',now(),null)"],
    35. "postSql": [
    36. "update t_sync_record set end_date=now() where table_name='@table' " ]
    37. }
    38. }
    39. }]
    40. }
    41. }

    第三步:编写运行DataX Job的Shell执行脚本

    vi datax_excute_job.sh

    1. #!/bin/bash
    2. source /etc/profile
    3. srcUrl="Reader SourceTiDB 地址"
    4. srcUserName="账号"
    5. srcPassword="密码"
    6. desUrl="Writer DestTiDB 地址"
    7. desUserName="账号"
    8. desPassword="密码"
    9. #同步开始时间
    10. defaultsyncUpdateTime="2020-03-03 18:00:00.000"
    11. #同步周期(秒)
    12. sleepTime="N"
    13. tableName="Table1,Table2,..."
    14. #循环次数标识,-1为一直循环,其他按输入次数循环,可根据需求自定义传参。
    15. flg=-1
    16. while [ "$flg" -gt 0 -o "$flg" -eq -1 ]
    17. do
    18. #更新时间设置为上次循序执行的时间
    19. if [ "" = "$preRunTime" ]; then
    20. syncTime=$defaultsyncUpdateTime
    21. else
    22. syncTime=$preRunTime
    23. fi
    24. #记录下本次循环执行时间,供下次循环使用
    25. preRunTime=$(date -d +"%Y-%m-%d %T")".000";
    26. echo $syncTime
    27. echo $preRunTime
    28. echo $flg
    29. python {YOUR_DATAX_HOME}/bin/datax.py -p "-DsyncTime='${syncTime}' -DtableName='${tableName}' -DsrcUrl='${srcUrl}' -DsrcUserName='${srcUserName}' -DsrcPassword='${srcPassword}' -DdesUrl='${desUrl}' -DdesUserName='${desUserName}' -DdesPassword='${desPassword}'" {YOUR_DATAX_HOME}/job/increase.json
    30. if [ -1 -lt "$flg" ]; then
    31. let "flg-=1"
    32. fi
    33. sleep $sleepTime
    34. done

    第四步:执行Shell脚本

    1. chmod +x datax_excute_job.sh
    2. nohup ./datax_excute_job.sh > log.file 2>&1 &

    DataX Job 的 Shell 执行脚本可以注册在 Supervisor 等服务工具中管理。当双 TiDB 集群需要进行主备切换时,可以做到任务随时启停,正反向同步随时切换。

    第五步:数据校验服务

    按自定义时间跨度查询两个 TiDB 的数据,设置流式读取两个 TiDB 中表数据,转成字符串进行对比,更高效。在比对过程中,为了提高比对效率,如果发现不一致,记录哪张表的哪个时间片有不一致即可,不需要运算定位到具体某一行。对于发现不一致的记录可以发送报警,人工介入处理,也可以调动同步脚本,重新同步一次,可根据自己的业务灵活选择。

    简单的数据校验流程可以参考下图。

    图片

    用DataX 进行双 TiDB 集群间的数据同步不一定是最好的,但每个方案都有其特定存在的场景和意义。如果双集群间广域网链路质量不太稳定,又或者有特殊的定制需求等原因时,可以考虑本方案。