tidb-in-action

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

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

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

方案设计如图所示

图片

具体操作步骤:

第一步:部署DataX

下载

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

解压

tar -zxvf datax.tar.gz

自检

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

第二步:编辑同步Job

vi increase.json

{

    "job": {

        "setting": {

            "speed": {

                "channel": 128 #根据业务情况调整Channel数

            }

        },

        "content": [{

            "reader": {

                "name": "tidbreader",

                "parameter": {

                    "username": "${srcUserName}",

                    "password": "${srcPassword}",

                    "column": ["*"],

                    "connection": [{

                        "table": ["${tableName}"],

                        "jdbcUrl": ["${srcUrl}"]

                    }],

                    "where": "updateTime >= '${syncTime}'"

                }

            },

            "writer": {

                "name": "tidbwriter",

                "parameter": {

                    "username": "${desUserName}",

                    "password": "${desPassword}",

                    "writeMode": "replace",

                    "column": ["*"],

                    "connection": [{

                        "jdbcUrl": "${desUrl}",

                        "table": ["${tableName}"]

                    }],

                    "preSql": [

                       "replace into t_sync_record(table_name,start_date,end_date) values('@table',now(),null)"],

                    "postSql": [

                       "update t_sync_record set end_date=now() where table_name='@table' " ]

                }

            }

        }]

    }

}

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

vi datax_excute_job.sh

#!/bin/bash

source /etc/profile

srcUrl="Reader SourceTiDB 地址"

srcUserName="账号"

srcPassword="密码"

desUrl="Writer DestTiDB 地址"

desUserName="账号"

desPassword="密码"

#同步开始时间

defaultsyncUpdateTime="2020-03-03 18:00:00.000"

#同步周期(秒)

sleepTime="N"

tableName="Table1,Table2,..."

#循环次数标识,-1为一直循环,其他按输入次数循环,可根据需求自定义传参。

flg=-1

while [ "$flg" -gt 0 -o "$flg" -eq -1 ]

do

        #更新时间设置为上次循序执行的时间

        if [ "" = "$preRunTime" ]; then

                syncTime=$defaultsyncUpdateTime

        else

                syncTime=$preRunTime

        fi

        #记录下本次循环执行时间,供下次循环使用

        preRunTime=$(date -d +"%Y-%m-%d %T")".000";

        echo $syncTime

        echo $preRunTime

        echo $flg

        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

        if [ -1  -lt  "$flg" ]; then

               let "flg-=1"

        fi

        sleep $sleepTime

done

第四步:执行Shell脚本

chmod +x datax_excute_job.sh

nohup ./datax_excute_job.sh > log.file 2>&1 &

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

第五步:数据校验服务

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

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

图片

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