云时代曾经降临,云上很多场景下都须要数据的迁徙、备份和流转,各大云厂商也大都提供了本人的迁徙工具。本文次要介绍京东云数据库为解决用户数据迁徙的常见场景所提供的解决方案。
场景一:数据迁徙上云
数据迁徙上云是最常见的一类场景,目前京东云提供了两个 DTS(Data Transformation Service)迁徙工具供选择,一个是数据迁徙,一个是数据同步:
二者的次要区别如下:
上面是这两个工具应用中的一些常见问题:
01 两个迁徙工具的原理是什么?
以 MySQL 为例,两个工具都有全量迁徙 / 增量迁徙 / 数据校验三个阶段,这三个阶段的次要原理如下:
全量阶段:
数据迁徙应用 mysqldump –single-transaction 来获得一致性快照,但无奈保障非事务引擎表的数据一致性,加上增量才能够保证数据的最终一致性,这个过程是串行操作;
数据同步应用多表并行的 select 形式,依据主键程序分批获取记录,循环执行,如果没有主键,则进行全表查问。为了最大限度缩小对源实例的影响,这个过程不加锁,也不必开启事务取得统一读,因而全量期间迁徙的数据是不统一的,通过增量阶段能够达到最终一致性。所以数据同步只提供了‘全量 + 增量’和‘增量’两种选项,不提供独自的‘全量’选项。
增量阶段:
数据迁徙和数据同步一样,都是通过迁徙启动前记录的 gtid 点位,抓取对应 binlog 同步 apply 到指标端,二者区别在于迁徙是串行的,同步会将同一个表的事务合并后一次提交,效率更高。
数据校验:
将源库的数据分块计算 crc,每个块的元数据和校验信息记录到指标实例 \_jdts\_check 为前缀的库下 checksum 表中。指标库同步实现后依据同样算法进行计算,比拟对应块号的 crc 值是否统一来判断校验是否胜利。
02 迁徙速度能够调整吗?
数据迁徙不能够,数据同步能够抉择更大的迁徙实例和减少更多的并发来调整,但因为并发机制是基于表粒度的,对于大量大表的状况,减少并发并不会有显著作用。
03 迁徙进度为什么显示超过 100%?
为了效率更高,迁徙显示的进度是依据曾经迁徙的记录数除以数据字典记录的记录数显示,数据字典的值并不齐全精确,因而实践上会呈现进度超过 100% 的景象。
04 迁徙延时为什么很长?
大多状况是源库写操作压力大导致指标库 binlog apply 进度赶不上源库的写入速度,也有可能是指标库读写压力大或者迁徙实例压力大,具体须要分割京东云技术服务及时染指。
05 迁徙期间指标库是否能够读写数据?
实践上能够读写,但不倡议在迁徙期间操作,次要有两个弊病:
- 写入脏数据会导致校验不统一。
- 读写数据会导致指标库压力增大,减缓数据同步速度。
06 指标端如果有同名库表是否会被笼罩?
不会的,如果指标库库表有数据,预检的时候会报错不通过;如果是空的库表,则能够间接写入。
07 自检提醒源或指标库网络不通怎么办?
查看源库和指标库的白名单限度,须要加上 dts 迁徙实例的 ip,在迁徙工作配置的时候会在页面提醒。
08 指标库中的_jdts 为前缀的库能够删除吗?
迁徙实现能够删除。
09 能够从只读实例同步吗?
只有源实例是 gtid 形式复制的,都能够通过主实例或只读实例同步。
10 数据迁徙抉择内网时,为啥只能用 json 格局,不能图形化抉择库表?
因为数据迁徙创立工作的时候,迁徙实例还未创立,无奈判断内网连通性;数据同步曾经做了改良,内外网均能够通过图形化形式抉择库表。
11 迁徙期间对源实例有影响吗?
无论数据迁徙还是数据同步,都须要对源实例库表做 select,会有肯定的读 IO 压力,倡议尽量在业务低峰期同步或从只读实例同步。对于数据同步工作,可通过控制台暂停工作,待源库负载升高,再启动数据同步工作。
12 mysql 零碎库应该如何迁徙?
目前不反对迁徙 MySQL 库,倡议用户迁徙时提前在指标库创立配置好对应的用户和权限。或者通过 mysqldump 等工具从源库导入。
13 迁徙过程呈现 Got fatal error 1236 … 的报错怎么办?
这个报错可能会在增量迁徙过程呈现,次要起因是增量须要的 binlog 在源端被删除所致,因而迁徙期间尽量将源端 binlog 保留较长的工夫。如果呈现此类报错,如果无奈找回被删 binlog,只能从新开始迁徙。
14 源端指标端版本必须统一吗?
数据迁徙要求两边版本统一;数据同步目前反对低 -> 高版本迁徙。
场景二:异地灾备
用户常常会对数据有异地灾备的需要,京东云目前提供了两种形式,一种是能够配置跨地区备份同步,如下图:
这种形式简略收费,会定期将最新备份同步到异地,毛病是数据是非实时的,如果灾备复原会有数据失落。
另外一种计划是灾备同步(目前暂只反对 MySQL),能够在京东云控制台创立一个异地灾备实例,而后利用 DTS 的数据同步性能将灾备实例和源实例进行数据同步,同步形式抉择灾备同步。和一般同步机制不同,灾备同步利用的是 MySQL 的原生复制,因而灾备实例和源实例是完全一致的,相当于一个异地的只读实例,这样就能够达到异地灾备的目标。
对于灾备实例,有几点须要留神:
- 灾备实例目前只反对和京东云 MySQL 进行同步,暂不反对自建或第三方云实例。
- 灾备实例无奈进行变配 / 重启 / 主从切换等操作,须要提前选好规格。
- 灾备实例也是主从实例,能够读但无奈进行写操作,相似异地只读实例,能够手工晋升为主备实例。
- 灾备实例是基于 dts 同步的,一旦手工完结同步,灾备实例将主动晋升为一般主备实例。
场景三:数据订阅
很多业务场景都会用到数据订阅,比方订阅数据到 ES 扩大搜寻、上下游订阅价格变更 / 服务告诉、多业务库数据合并 / 构建宽表等。京东云提供了数据订阅性能来满足相似需要,目前源端反对
MySQL/Percona/MariaDB/PostgreSQL,指标端仅反对 Kafka。
指标端应用 json 格局记录订阅信息,上面是一个 update 操作的例子:
{
"version": "0.1",
"database": "dbtest",
"table": "t1",
"type": "update",
"ts": 1582617997,
"time_zone": "Asia/Shanghai",
"host": "mysql-internet-cn-north-1-c52cb616874d4d29.rds.jdcloud.com",
"data": {
"created": "2020-02-25 16:01:46",
"flag": "10691",
"info": "dts_test",
"pkid": "11663",
"uuid": "11cae53d-57a5-11ea-98a6-fa163ea31339"
},
"old": {
"created": "2020-02-25 16:01:46",
"flag": "10691",
"info": null,
"pkid": "11663",
"uuid": "11cae53d-57a5-11ea-98a6-fa163ea31339"
},
"pks": {"pkid": "11663"}
}
数据订阅有几点须要留神:
- 订阅的音讯长度如果超过中间件的最大音讯长度,音讯将被抛弃,因而实践上会有失落数据危险。
- 指标端承受的数据终点默认为订阅的实时工夫点,如果须要全量订阅能够分割京东云技服人员。
场景四: 自建 MySQL 和云上 MySQL 互相复制
用户常常有这样的需要,是否能够用自建 MySQL 来同步云上 MySQL?或者反过来,是否能够云上 MySQL 作为自建 MySQL 的从库来满足某些场景?
- 从 MySQL 复制机制来看,实践上应该都是能够的,但京东云的账号不反对赋予 super 权限,无奈执行 change master 操作,所以云上 MySQL 无奈作为自建 MySQL 的从库。
- 反过来,自建 MySQL 能够有 super 权限,是能够作为云上 MySQL 的从库。但这个是非规范操作,并不倡议用户应用。次要起因是在某些状况下,会造成复制中断。比方云上 MySQL 配置变更后须要主从切换,而此时自建从库和切换前的源主库有复制提早,局部 binlog 还未传递到自建从库,此时主从切换后复新主库因为没有这些 binlog,会造成自建从库报 1236 的谬误。针对这种状况,用户能够在扩容时抉择提早切换,能够避开业务顶峰,在肯定水平上防止相似问题。
作者:翟振兴