阿里云DTS数据同步实施

372 阅读13分钟

阿里云DTS数据同步实施

背景说明

基于线下IDC机房传统数据库需要和云上数据实现数据一致性需求,并实现数据库之间的实时增量同步功能,特此借助于阿里云的DTS数据同步服务来保证线下线上数据间的实时同步,并确保业务数据的一致性和完整性。

DTS数据同步原理

实时同步功能能够实现两个数据源之间的增量数据实时同步。DTS将陆续支持OLTP->OLAP的数据实时同步

同步链路的创建过程如下:

  • 同步初始化

    将源实例的历史存量数据在目标实例初始化一份

  • 增量数据实时同步

    当初始化完成后进入两边增量数据实时同步阶段,该阶段DTS将实现源实例和目标实例的数据动态同步。

增量数据实时同步过程,DTS的底层实现模块主要包括:

  • 日志读取模块

    日志读取模块从源实例读取原始数据,经过解析、过滤及标准格式化,最终将数据在本地持久化。日志读取模块通过数据库协议连接并读取源实例的增量日志。如果源数据库为RDS MySQL,那么数据抓取模块通过Binlog dump协议连接源库。

  • 日志回放模块

    日志回放模块从日志读取模块中请求增量数据,并根据用户配置的同步对象进行数据过滤,然后在保证事务时序性及事务一致性的前提下,将日志记录同步到目标实例

DTS具备日志读取模块、日志回放模块的高可用,DTS容灾系统一旦检测到链路异常,就会在健康服务节点上断点重启链路,从而有效保证同步链路的高可用。

数据同步前准备工作

数据库权限账号配置

  • 为自建MySQL创建账号并设置binlog

    当数据迁移/同步/订阅的源库为自建MySQL时,为满足预检查阶段对源库的要求,保障任务的顺利执行,在正式配置之前,您需要在自建MySQL数据库上创建账号并设置binlog。

    执行该操作需要重启MySQL服务,为避免影响您的业务使用,请在业务低峰期操作。

  • 元数据库实例创建同步账号

    CREATE USER 'username'@'10.0.0.0/24' IDENTIFIED BY 'password';
    # 说明
    username:待创建的账号。
    host:允许该账号登录的主机,如果允许该账号从任意主机登录数据库,可以使用百分号(%)。
    password:账号的密码。
    
  • 对账号进行授权操作

    本次原实例需要赋予的权限为:Replication slave、Replication client及所有同步对象的Select权限,如果还有视图需要同步也需要show view的权限

    GRANT privileges ON databasename.tablename TO 'username'@'10.0.0.0/24' WITH GRANT OPTION;
    # 说明
    privileges:授予该账号的操作权限,如SELECTINSERTUPDATE等,如果要授予该账号所有权限,则使用ALL。
    databasename:数据库名。如果要授予该账号具备所有数据库的操作权限,则使用星号(*)。
    tablename:表名。如果要授予该账号具备所有表的操作权限,则使用星号(*)。
    username:待授权的账号。
    host:允许该账号登录的主机,如果允许该账号从任意主机登录,则使用百分号(%)。
    WITH GRANT OPTION:授予该账号使用GRANT命令的权限,该参数为可选。
    
  • 修改binglong参数

    # 修改binlog参数(/etc/my.cnf)
    log_bin=mysql_bin
    binlog_format=row
    server_id=2 //设置大于1的整数
    binlog_row_image=full //当自建MySQL的版本大于5.6时,则必须设置该项。
    # 针对mysql中的全局权限
    由于Replication slave、Replication client在mysql中属于全局权限,并且binlog不是针对库的,所有的库都混写在一个binlog日志中,无法针对库赋予权限,所以授权方式为:
    GRANT REPLICATION SLAVE REPLICATION CLIENT *.* TO username@host IDENTIFIED BY password;
    # 此方式只适合自建库,阿里云不支持
    如果只让拉取指定库的日志可以做如下配置:
    在/etc/my.cnf中添加如下配置:
    Binlog_Do_DB:设定哪些数据库(Schema)需要记录Binlog;
    Binlog_Ignore_DB:设定哪些数据库(Schema)不要记录Binlog;
    

连接其他云服务商

示例图如下:

连接本地IDC

允许DTS访问专线、VPN网关或智能网关所属网络

在配置数据迁移、数据同步或数据订阅时,如果源或目标库为通过专线、VPN网关或智能网关接入的自建数据库,需要放通DTS对该网络的访问。

迁移/同步/订阅本地数据库时需添加的IP白名单

当迁移/同步/订阅的源或目标数据库为有公网IP的自建数据库或通过专线/VPN网关/智能网关接入的自建数据库时,且您的自建数据库具备白名单等安全设置,您需要将DTS服务器的IP地址段加入到自建数据库对应的安全设置中

数据迁移/订阅

  • 当数据迁移的源或目标数据库为有公网IP的自建数据库或通过专线/VPN网关/智能网关接入的自建数据库时,通过下表定位到目标数据库所在区域,获取对应的IP地址段并将其加入到源和目标数据库的安全设置中。

    例如:源数据库地区为深圳,目标数据库地区为杭州,您只需要将杭州地区的IP地址段加入到源和目标数据库的安全设置中。

  • 当数据订阅的源数据库为有公网IP的自建数据库或通过专线/VPN网关/智能网关接入的自建数据库时,通过下表定位到源数据库所在区域,获取对应的IP地址段并将其加入到源数据库的安全设置中。

ip地址段如下:

区域本地数据库通过专线/VPN网关/智能网关接入
华北2(北京)100.104.183.0/24,100.104.164.0/24

数据同步

当数据同步的源数据库为通过专线/VPN网关/智能网关接入的自建数据库时,您需要根据业务情况进行配置:

  • 例如:源数据库地区为深圳,目标数据库地区为杭州,您需要将深圳和杭州地区的IP地址段,都加入到源数据库的安全设置中。
  • 例如:源数据库地区为深圳,目标数据库地区为杭州,您只需将杭州地区的IP地址段,加入到目标数据库的安全设置中
区域本地数据库通过专线/VPN网关/智能网关接入
华北2(北京)100.104.183.0/24,100.104.164.0/24

操作步骤

  • IDC数据中心侧需要实现的功能如下:

    • 需要配置同步账号并附加的权限为:Replication slave、Replication client及所有同步对象的Select权限,如果还有视图需要同步也需要show view的权限。

    • 修改binlog参数(/etc/my.cnf)

      # 配置my.cnf
      log_bin=mysql_bin
      binlog_format=row
      server_id=2 //设置大于1的整数
      binlog_row_image=full //当自建MySQL的版本大于5.6时,则必须设置该项
      
    • 提供同步实例的账号、密码、主机IP地址,如果不是3306端口还需提供mysql监听的端口号,需要同步的库名和表名。

    • 源数据库实例允许100.104.183.0/24,100.104.164.0/24网段的访问iP通过

    • 源数据库所在的网络放行100.104.183.0/24,100.104.160.0/24的网络,并且将上述网段的路由下一跳地址指向专线互联地址

    • 测试和DTS网络的可达性

      # 执行如下命令,测试网络通路
      traceroute  100.104.183.1
      
  • 线上阿里云侧需要实现的功能如下:

    1、首先需要将边界路由器VBR和云数据库实例所在的VPC加入到云企业网中,并将DTS所在的网络加入到云企业网中

    2、目标数据库所在实例允许100.104.183.0/24,100.104.164.0/24网段的访问iP通过

    3、目标数据库所在网络放行100.104.183.0/24,100.104.160.0/24的网络,并在云企业网中配置对应的网段路由,下一跳指向VPC所在的网络

    云企业网添加DTS操作步骤:

    • 背景信息

      云服务指使用阿里云云服务地址段100.64.0.0/10提供服务的云产品,例如对象存储(OSS)、日志服务(SLS)、数据传输服务(DTS)等。在VPC、VBR或CCN加载到同一个云企业网实例后,您的本地网络可以通过云企业网访问部署在VPC中的云服务

    • 操作步骤

      • 在设置云服务页面,配置以下信息

        • 内网IP:输入属于100.64.0.0/10 子网段的云服务IP地址或地址段。例如:100.118.28.52/32。

          本次配置地址为: 100.64.0.0/11和100.96.0.0/11

        • 服务所在地:选择云服务所在的地域

          • 服务VPC:选择已加载到云企业网中的VPC网络实例, 配置完成后,VBR、CCN将以该VPC的身份访问云服务
          • 访问所在地:选择需要访问该云服务的VBR或CCN所在的地域
          • 描述:(可选)输入云服务描述信息,描述信息可以为空;或填写2~256个中英文字符,不能以http://https://开头。

数据同步具体实现

结构初始化涉及的数据类型映射关系

由于不同的数据库支持的数据类型不一样,数据类型无法一一对应。所以DTS在进行数据同步的结构初始化时,会根据目标库支持的数据类型进行类型映射。本文为您列出数据类型的映射关系,便于您查阅和评估数据同步对业务的影响。

从自建MySQL、RDS MySQL或PolarDB MySQL同步至AnalyticDB for MySQL

MySQL数据类型AnalyticDB for MySQL数据类型
BIGINTBIGINT
BITBOOLEAN
CHARVARCHAR
DATEDATE
DATETIMETIMESTAMP
DECIMALDECIMAL
DOUBLEDOUBLE
ENUMVARCHAR
FLOATREAL
INTINT
INTEGERINT
JSONJSON
MEDIUMINTINT
NUMERICDECIMAL
SETVARCHAR
SMALLINTSMALLINT
TIMETIME
TIMESTAMPTIMESTAMP
TINYINTSMALLINT
TINYTEXT/TEXT/MEDIUMTEXT/LONGTEXTVARCHAR
VARCHARVARCHAR
YEARINTEGER

Mysql间数据同步

数据传输服务DTS(Data Transmission Service)支持将通过专线、VPN网关或智能网关接入的自建MySQL同步至RDS MySQL,实现增量数据的实时同步。

前提条件

  • 数据同步的目标RDS实例已存在,如不存在请创建RDS实例
  • 自建MySQL数据库版本为5.1、5.5、5.6、5.7或8.0版本。
  • 已经将自建MySQL数据库通过专线、VPN网关或智能网关接入至阿里云专有网络,详情请参见连接本地IDC

注意事项

  • DTS在执行全量数据初始化时将占用源库和目标库一定的读写资源,可能会导致数据库的负载上升,在数据库性能较差、规格较低或业务量较大的情况下(例如源库有大量慢SQL、存在无主键表或目标库存在死锁等),可能会加重数据库压力,甚至导致数据库服务不可用。因此您需要在执行数据同步前评估源库和目标库的性能,同时建议您在业务低峰期执行数据同步(例如源库和目标库的CPU负载在30%以下)。
  • 如果同步对象为单个或多个表(非整库),那么在数据同步时,请勿对源库的同步对象使用gh-ost或pt-online-schema-change等类似工具执行在线DDL变更,否则会导致同步失败。
  • RDS MySQL实例必须具备内网地址
  • 如果源数据库没有主键或唯一约束,且所有字段没有唯一性,可能会导致目标数据库中出现重复数据
  • 全量初始化过程中,并发insert导致目标实例的表碎片,全量初始化完成后,目标实例的表空间比源实例的表空间大

数据同步前准备工作

在正式配置数据同步作业之前,需要为自建MySQL创建账号并设置binlog

操作步骤

  • 购买数据同步作业

  • 登录数据传输控制台

  • 在左侧导航栏,单击数据同步

  • 在同步作业列表页面顶部,选择同步的目标实例所属地域

  • 定位至已购买的数据同步实例,单击该实例的配置同步链路

  • 配置同步通道的源实例及目标实例信息

    类别配置说明
    同步作业名称DTS会自动生成一个同步作业名称,建议配置具有业务意义的名称(无唯一性要求),便于后续识别
    源实例信息实例类型选择通过专线/VPN网关/智能网关接入的自建数据库
    实例地区购买数据同步实例时选择的源实例地域信息,不可变更
    对端专有网络选择自建数据库接入的VPC ID
    数据库类型购买数据同步实例时选择的数据库类型:MySQL,不可变更
    IP地址填入自建MySQL数据库的服务器IP地址
    端口填入自建MySQL数据库的服务端口,默认为3306
    数据库账号填入自建MySQL的数据库账号,需要具备Replication slave、Replication client、show view及所有同步对象的Select权限
    数据库密码填入该数据库账号对应的密码
    目标实例信息实例类型选择RDS实例
    实例地区购买数据同步实例时选择的目标实例地域信息,不可变更
    实例ID选择作为数据同步目标的RDS实例ID
    数据库账号填入目标RDS的数据库账号
    数据库密码填入该数据库账号对应的密码
    连接方式根据需求选择非加密连接或SSL安全连接。如果设置为SSL安全连接,您需要提前开启RDS实例的SSL加密功能,详情请参见设置SSL加密
  • 单击页面右下角的授权白名单并进入下一步

  • 配置同步策略及对象信息

  • 上述配置完成后,单击页面右下角的下一步

  • 配置同步初始化的高级配置信息

    此步骤会将源实例中已经存在同步对象的结构及数据在目标实例中初始化,作为后续增量同步数据的基线数据。

    同步初始化类型细分为:结构初始化,全量数据初始化。默认情况下,需要选择结构初始化和全量数据初始化

  • 上述配置完成后,单击页面右下角的预检查并启动

  • 在预检查对话框中显示预检查通过后,关闭预检查对话框,同步作业将正式开始

  • 等待该同步作业的链路初始化完成,直至状态处于同步中