Mysql 异地多活数据双向同步-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 平台
评论0
最新资源