Mysql异地多活数据双向同步-CloudCanal实战

junyu-cloudcanal 阅读原文

简述

异地多活是一项系统性工作,包含 web 层、应用服务层、数据层的流量分配和同步。

数据层的双向同步是整个方案基础,CloudCanal 在 MySQL <-> MySQL 链路有效支持了这个能力,本文简要介绍如何使用 CloudCanal 配置这样的双向同步链路。

技术点

数据冲突

双向同步中, 暂时无法完全通过数据层解决的是数据冲突问题,如一个订单同时在两地被修改价格,到底哪个为准,这个具有外部依赖性。

针对这个问题,最有效的解决方案是通过业务流量分配(比如user_id),将同一条数据(或相关数据)写入放在其中一边,更加简单暴力的方式是将具备冲突条件的数据写入完全放在一地。

另外同步工具层面可添加数据冲突策略,比如版本号对比、设定数据优先级等,甚至人工介入解决。

同步回环

回环问题,即防止数据在双向链路中写回产生日志的实例,导致老数据覆盖新数据。

业界常用解决方案包括以下几种:

  • 修改数据库引擎,将同步过来的日志写入打上特殊标记(如 MySQL relay_log apply),对向链路识别该标记并决定是否同步
  • 同步数据写到对端时, 同一个事务带上一个特定操作,对向链路识别这个操作,决定整个事务是否同步
  • 依赖数据库自身提供的防回环机制(比如 MySQL GTID),同步工具做相应动作

CloudCanal 目前在 MySQL 到 MySQL 链路采用了 GTID 方案,一是 MySQL 自带这个防重能力,二是尽量避免做更多操作。

举个 “栗子”

准备 CloudCanal

本次案例使用 docker 社区版, 安装参考

添加数据源

  • 本案例 MySQL 数据库放在上海杭州, CloudCanal社区版运行于上海 ECS

  • 登录 CloudCanal 平台

  • 数据源管理 -> 添加数据源

  • 选择 自建 MySQL ,阿里云 RDS 账号权限不支持链接上设置 GTID_NEXT

  • 自建 MySQL 开 binlog 和 GTID

    server-id       = 2
    log-bin         = mysql-bin
    gtid_mode = on
    enforce_gtid_consistency = on
    
  • 确认 MySQL GTID 已经生效(请写几条测试数据)

  • 建议对数据源进行描述修改,防止配置正反链路时,识别错数据库

创建正向同步任务

  • 任务管理->新建任务
  • 双向同步中,正向任务一般指源端有数据,目标端无数据的链路,涉及对端数据初始化
  • 源端和目标端选择数据源, 并分别点击 测试连接 按钮以测试数据库连通性和获取 schema 级别元信息
  • 选择源端和目标端 schema
  • 点击下一步
    杭州到上海任务配置.png
  • 选择 数据同步,并且勾选 全量数据初始化
  • 规格可以根据任务重要度以及部署机器的内存容量合理选择,一般 2GB 内存规格即可
  • 勾选 DDL 同步
  • 点击 下一步
    杭州到上海任务开全量.png
  • 表、列映射裁剪…此处省略
  • 对任务内容进行确认 ,置灰 自动启动任务 按钮以便调参数
  • 点击确认创建
    杭州到上海不自动启动.png
  • 任务详情 -> 参数设置
  • 设置目标数据源配置 deCycle , enableTransaction , 源端数据源配置 gtidMode 参数为 true
    杭州到上海参数配置.png
  • 生效配置并启动

创建反向同步任务

  • 任务管理->新建任务
  • 源端和目标端选择数据源(请和正向任务所选数据源对调), 并分别点击 测试连接 按钮以测试数据库连通性和获取 schema 级别元信息
  • 选择源端和目标端 schema
  • 点击下一步
    上海到杭州任务配置.png
  • 选择 数据同步,并去除 全量数据初始化
  • 勾选 DDL 同步
  • 点击 下一步
    上海到杭州任务不开全量.png
  • 表、列映射裁剪…此处省略
  • 对任务内容进行确认 ,置灰 自动启动任务 按钮以便调参数
  • 点击确认创建
    上海到杭州不自动启动.png
  • 任务详情 -> 参数设置
  • 设置目标数据源配置 deCycle , enableTransaction , 源端数据源配置 gtidMode 参数为 true
  • 生效配置并启动
    上海到杭州参数配置.png

任务同步

  • 正向任务和反向任务正常同步,进行源和目标数据校验一致
    负载前.png

测试

FAQ

为什么不用 MySQL 原生的双 Master 复制

如果对数据不做映射、裁剪、转换、冲突策略(比如略过冲突数据)等动作,使用 MySQL 双 Master 复制是一个选择。

另外对于长距离双向同步,还需做一些防网络中断等工作。

综合这两方面,第三方有商业支持或开源软件可能会表现出更好的应变性。毕竟改 MySQL 代码不容易。

为什么不用 Paxos 或 Raft 支持的数据库异地 3 副本或 5 副本

一部分原因和上面是一致的,毕竟是数据库内部机制,很难做一些定制。对于 3 副本或者 5 副本,一般做法是多数派副本在同城(不同机架、机房),少数副本在异地,异地副本靠异步同步数据。

对于单 Leader 写入机制,连业务层面设计不冲突写入策略的机会可能都没有。Multi-Master 涉及更加复杂的算法。

综合来看,没有孰好孰坏,按业务对数据的实际要求和所能提供的硬件条件进行选择。

双向同步还支持哪些链路?

目前 CloudCanal 方案只实现了 MySQL->MySQL ,并且方案上依赖 GTID ,对于 ORACLE ,PG ,SQLSERVER 等关系型数据库,可能需要实现通用方案(主要是事务方案), 将他们同构或者异构链接起来。

总结

本文简单介绍了如何使用 CloudCanal 构建 MySQL->MySQL 双向同步链路,如果各位有需求,可以尝试使用下我们的免费社区版体验。

最后,如果各位觉得这篇文章还不错,请点赞、评论加转发吧。

更多精彩

社区快讯

  • 我们创建 CloudCanal 微信粉丝群啦,在里面,你可以得到最新版本发布信息和资源链接,你能看到其他用户一手评测、使用情况,你更能得到热情的问题解答,当然你还可以给我们提需求和问题。快快加入吧。
    • 扫描下方二维码,添加我们小助手微信suhuayue001拉您进群,接头语(“CloudCanal yyds”)

CloudCanal-免费好用的企业级数据同步工具,欢迎品鉴。
了解更多产品可以查看官方网站http://www.clougence.com
CloudCanal社区https://www.askcug.com/

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 211,817评论 6 492
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 90,329评论 3 385
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 157,354评论 0 348
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,498评论 1 284
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 65,600评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,829评论 1 290
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,979评论 3 408
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,722评论 0 266
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,189评论 1 303
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,519评论 2 327
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,654评论 1 340
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,329评论 4 330
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,940评论 3 313
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,762评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,993评论 1 266
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,382评论 2 360
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,543评论 2 349

推荐阅读更多精彩内容