关于DRC

DRC(Data Replication Center)是唯品会自研的MySQL双向复制方案,主要应用场景是数据库双向复制、单向复制。

目前DRC在唯品会还未正式使用,正在逐步验证,功能仍在完善中,目前可能存在一些未知问题,如果你需要使用DRC,请评估好相应风险。

DRC在实时数据管道(RDP)的基础上,实现了以下功能:

支持MySQL实例的数据双向复制。

规避双向复制导致的循环复制。

检测异常情况下导致的数据冲突,并能自动处理, 保证两端的数据最终一致。

支持多线程重放binlog数据(MTS算法), 保证复制的吞吐量。

支持数据对账, 检验双向复制正确性。

总体架构

以双向复制的场景为例,MySQL复制拓扑可以抽象为下图所示:

图中,MySQL分别部署在IDC_1和IDC_2,彼此相互同步变更事件(Change)。其中同步的工作由DRC来完成。

DRC总体架构如下所示:

图中,S0和S1是DB数据分片。

经过api_router流量分发后,写分片S0的流量由IDC1负责,写分片S1的流量由IDC2负责。

IDC1与IDC2之间的数据通过两个DRC实例进行同步。

数据分片可以对应不同的子表,也可以是对应同一个表中的不同范围。

单个DRC实例的架构如下所示:

DRC实例包含三个组件:

RDP:实时拉取源DB的binlog,解析之后的事务数据写入到Kafka。

Kafka:存储解析之后的事务数据。

Applier:订阅Kafka中的事务数据,通过执行SQL语句的方式,重放到目标DB。

关于Applier

Applier是DRC中的主要组件,订阅来自RDP解析后的binlog数据,构造SQL语句后在目标MySQL执行。

Applier的主要功能有:SQL构造, 并行执行,冲突检测与处理,过滤循环复制的数据,中断恢复,重复数据幂等处理。

限制条件

MySQL版本必须在5.7.19及以上(因为MySQL 5.7.19之前的MTS算法存在BUG)。

MySQL需要开启GTID, 并设置binlog_format=ROW, binlog_row_image=FULL。

业务数据库必须有主键字段(Applier处理数据冲突时依赖记录的主键)。

快速开始

1. 安装

源码安装

在源码根目录执行make,即可在build/mysql_applier/bin目录生成Applier可执行文件,同时产生实例配置文件:build/mysql-applier/etc/applier.ini.example。

[apps@localhost drc]$ make

[apps@localhost drc]$ ls build/mysql-applier/bin/

alarm.sh mysql-applier

[apps@localhost drc]$ ls build/mysql-applier/etc/

applier.ini.example

2. 修改配置

执行以下命令,修改Applier依赖的配置文件。

cp build/mysql-applier/etc && cp applier.ini.example applier.ini

vi applier.ini

修改Kafka连接信息, 包括:brokerlist、订阅topic、partition和version。

[kafka]

#The kafka address of applier to fetch binlog event

brokerlist = 10.10.10.1:9092,10.10.10.2:9092,10.10.10.3:9092

topic = test_topic_1

partition = 0

version = 1.1.0

该Kafka topic中的数据是由RDP生成的,可以认为是源DB的binlog流。

修改目标DB连接信息。

[mysql]

#The mysql address of applier to write

host = localhost

port = 3306

user = root

passwd = 123456

注意:目标DB需要是源DB的历史镜像,后续通过Applier重放源DB的增量binlog。

注意:目标DB的所需最低权限是:SELECT , INSERT, UPDATE, DELETE, CREATE, DROP, ALTER, REFERENCES, INDEX

修改Zookeeper连接信息,包括:Zookeeper地址、zk节点路径(多个Applier副本依赖zk进行选主)。

[zk]

zk_addr_list = 10.10.10.1:2181,10.10.10.2:2181,10.10.10.3:2181

zk_root = /drc/mysql_applier/1000x

修改冲突处理方式,这里选择overwrite,表示如果复制过程中出现冲突,直接覆盖目标DB的记录。

当然,也可以选择time_overwrite, 表示基于时间戳来进行冲突处理,但是前提是表结构需要有特定的时间字段。

#The strategy to handle conflict, may be time_ignore|time_overwrite|ignore|overwrite

#if handle conflict base on time,need set the column name of row update time

handle_conflict_strategy=overwrite

update_time_column = update_time

对于线上使用,需要审慎选择冲突处理的方式,如果是双向复制,必须两个方向的处理方式不同:比如一边是overwrite,另一边是ignore。

3. 启动

假设配置文件build/mysql-applier/etc/applier.ini已经修改完成,那么执行以下命令启动Applier:

mkdir -p build/mysql_applier/logs

mkdir -p build/mysql_applier/metrics

cd build/mysql_applier/bin

./mysql-applier

可以通过查看build/mysql_applier/logs目录下的日志文件,检查是否有ERROR信息。

如果有ERROR信息,请检查配置文件是否配置妥当。

4. 测试

在源DB执行DML或者DDL,检查是否在目标DB重放成功。

上述是单向复制搭建的步骤,双向复制搭建也是类似但更复杂些,建议用户根据自身需求,打造自动化搭建流程。

性能

关于DRC Applier的性能,请查看文档: DRC性能概览。

监控特性

关于DRC Applier的暴露的监控特性,请查看文档: 监控特性。

异常告警

关于DRC Applier运行过程中的异常告警,请查看文档:异常告警。

管理API

关于DRC Applier的提供的http管理API,请查看文档: 管理API。

数据对账

DRC提供了对账工具,用于比对两端数据是否一致,请查看文档: 数据对账。

开发团队

DRC项目由唯品会基础架构部—数据中间件组开发和维护。开发成员如下:

License

DRC项目遵循Apache 2.0 license。

mysql active_GitHub - vipshop/drc: MySQL active-active replication solution.相关推荐

  1. ERROR Streaming result set com.mysql.jdbc.RowDataDynamic@1d5a7f6 is still active. No statements may

    用sqoop导入mysql出现错误: [jifeng@jifeng02 sqoop]$ bin/sqoop import --connect jdbc:mysql://10.X.X.X:3306/li ...

  2. java.sql.SQLException: Streaming result set com.mysql.jdbc.RowDataDynamic@44f16719 is still active.

    sqoop 导入mysql 表时,出现以下异常: 19/07/28 07:44:44 ERROR manager.SqlManager: Error reading from database: ja ...

  3. MySQL 运行状态为Active: active (auto-restart)或Active: active (start)

    MySQL 运行状态为Active: active (auto-restart)或Active: active (start) 有的小伙伴在往Linux安装Mysql时出现了Active: activ ...

  4. mysql数据库group_key_【MySQL】数据库复制:组复制(Group Replication)

    [root@wallet01 ~]# uuidgen 8d1945a5-5c74-4ba0-8240-e9d731110753 [root@wallet01 ~]# vi /etc/my.cnf ## ...

  5. MySQL高可用框架--组复制(group replication)搭建测试

    一.框架搭建       1.首先备份主库数据,有两种方法,冷备份和热备份.冷备份需要先停止master服务,sudo/etc/init.d/mysql stop,然后通过cp或者scp等命令将数据文 ...

  6. mysql longtext db2_从 MySQL 或 PostgreSQL 迁移到 DB2 Express-C

    从 MySQL 或 PostgreSQL 迁移到 DB2 Express-C 用三个简单步骤迁移到 DB2 Vikram Khatri, Nora Sokolof, 和 Manas Dadarkar ...

  7. MySQL 5.5 到MySQL 5.6半同步复制(SSL)

    数据放在一个raid 1上: [root@slave1 ~]# yum -y install mdadm [root@slave1 ~]# mdadm -C /dev/md0 -l1 -n2 /dev ...

  8. 【MySQL高可用】MySQL高可用之MGR部署

    [MySQL高可用]MySQL高可用之MGR部署 参考:https://www.xmmup.com/dbbao45mysqlgaokeyongzhimgrconsuljiagoubushu.html ...

  9. keepalived实现mysql高可用_keepalived+MySQL实现高可用

    (一)keepalived概述 Keepalived通过VRRP(虚拟路由冗余协议)协议实现虚拟IP的漂移.当master故障后,VIP会自动漂移到backup,这时通知下端主机刷新ARP表,如果业务 ...

最新文章

  1. jieba分词实现原理(C++版 + python篇)(二)
  2. 计算机组成原理mbps,2016年湖北师范学院计算机组成原理(同等学力加试)复试笔试仿真模拟题...
  3. VM虚拟机中Linux扩展磁盘空间的方法
  4. html倒计时timer,js如何使用定时器实现倒计时功能
  5. Linux当前终端走代理ip
  6. [dfs] 洛谷 P1242 新汉诺塔
  7. Surprise官方文档练习
  8. 个人JS脚本验证大全[转]
  9. dojo mobile问题汇总
  10. canvas 加载图片
  11. Kettle使用教程(问题)
  12. CSRF和SSRF漏洞
  13. android robotium教程,Robotium + Android studio
  14. protobuf如何使用Protogen工具生成CS代码详细教学篇
  15. UVA - 1589 Xiangqi (象棋)
  16. 怎样用计算机xp命令修复软件,系统之家xp系统修复控制台命令使用方法
  17. Linux 系统调用 fork wait exec
  18. excel拆分表格之多条件拆分
  19. 微前端是什么、价值、不足、典型模式
  20. cpu怎么开启php,cpu怎么换

热门文章

  1. 显卡RTX 3090运行pytorch报错CUDA error: no kernel image is available for execution on the device
  2. 大数据的“媒体玩法”
  3. 三星在美最高法院吐苦水,苹果设计专利索赔太多
  4. jpa存储byte到postgresql
  5. 从省市区多重级联想到的,react和jquery的差别
  6. 专业词汇---BUG部分-02
  7. android 语音搜索动画,Android自定义控件实现UC浏览器语音搜索效果
  8. 昆仑通态9针通讯口定义_昆仑通态触摸屏与常见PLC的连接方法(3)——OmronHostLink...
  9. wordpress插件_8个虚拟教室的必备WordPress插件
  10. 使用Linux创建自己的视频流服务器