Canal监听阿里云RDS

canal简介

早期,阿里巴巴B2B公司因为存在杭州和美国双机房部署,存在跨机房同步的业务需求。不过早期的数据库同步业务,主要是基于trigger的方式获取增量变更,不过从2010年开始,阿里系公司开始逐步的尝试基于数据库的日志解析,获取增量变更进行同步,由此衍生出了增量订阅&消费的业务,从此开启了一段新纪元。ps. 目前内部版本已经支持mysql和oracle部分版本的日志解析,当前的canal开源版本支持5.7及以下的版本(阿里内部mysql 5.7.13, 5.6.10, mysql 5.5.18和5.1.40/48)

canal可以干嘛:

基于日志增量订阅&消费支持的业务:
数据库镜像
数据库实时备份
多级索引 (卖家和买家各自分库索引)
search build
业务cache刷新
价格变化等重要业务消息

下载地址:链接: https://github.com/alibaba/canal/releases

在这里插入图片描述

RDS

有不少公司的生产环境数据库用的是阿里云的RDS,我们知道canal监听我们自己服务器的数据库只需要改改数据库的配置就行了但是RDS怎么改呢接下来让我们开始

1 创建RDS账号

登入到RDS控制台

### 使用 Canal 监听 MySQL 数据变化 Canal 是阿里巴巴开源的一个日志解析工具,主要用于增量数据订阅和消费。它能够实时捕获 MySQL 的 Binlog 日志并将其转换为易于理解的消息格式,从而实现对数据库变更的监听。 以下是关于如何使用 Canal监听 MySQL 数据变化的相关说明: #### 配置 MySQL 实例支持 Binlog 为了使 Canal 能够正常工作,MySQL 必须启用 Binlog 功能,并设置合适的模式(推荐 ROW 模式)。可以通过修改 MySQL 配置文件 `my.cnf` 或者动态调整参数来完成此操作[^1]。 ```ini [mysqld] server-id=1 log-bin=mysql-bin binlog-format=ROW ``` 重启 MySQL 服务以应用上述配置更改。 #### 安装与部署 Canal Server 下载最新版本的 Canal 发行包后解压至目标目录,在该路径下找到 `conf/example/instance.properties` 文件进行编辑。主要关注以下几个关键属性项[^2]: - **canal.instance.master.address**: 设置为主库地址, 如 `localhost:3306`. - **canal.instance.dbUsername/canal.instance.dbPassword**: 提供具有适当权限访问 binlogs 用户名密码组合. - **canal.instance.filter.regex**: 利用正则表达式指定需要同步哪些 schema 和 table. 启动 canal server 后端程序即可开始接收来自 mysql 的事件流通知。 #### 开发客户端应用程序处理消息 最后一步就是编写自己的业务逻辑去消费由 canal-server 推送过来的数据变动记录。官方提供了多种语言 SDK 支持开发者快速集成开发环境。下面给出一段简单的 Java 示例代码展示怎样连接到 canal 并获取最新的增删改查动作: ```java public class SimpleCanalClientTest { public static void main(String[] args) throws Exception{ // 创建链接对象 CanalConnector connector = CanalConnectors.newSingleConnector(new InetSocketAddress("127.0.0.1", 11111), "example", "", ""); int batchSize = 1000; try { connector.connect(); connector.subscribe(".*\\..*"); while (true){ Message message = connector.getWithoutAck(batchSize); long batchId = message.getId(); int size = message.getEntries().size(); if (batchId == -1 || size == 0 ){ Thread.sleep(1000); }else{ printEntry(message.getEntries()); } connector.ack(batchId); } } finally { connector.disconnect(); } } private static void printEntry(List<CanalEntry.Entry> entrys){ for(CanalEntry.Entry entry : entrys){ if(entry.getEntryType() == EntryType.TRANSACTIONBEGIN || entry.getEntryType() == EntryType.TRANSACTIONEND){ continue; } RowChange rowChage=null; try{ rowChage = RowChange.parseFrom(entry.getStoreValue()); EventType eventType=rowChage.getEventType(); System.out.println(String.format("================>%s===================",eventType)); List<RowData> rowDataList =rowChage.getRowDatasList(); for(RowData rowData :rowDataList){ if(eventType == EventType.DELETE){ System.out.println("--DELETE--"); showColumn(rowData.getBeforeColumnsList()); }else if(eventType == EventType.INSERT){ System.out.println("--INSERT--"); showColumn(rowData.getAfterColumnsList()); }else{ System.out.println("--UPDATE--"); showColumn(rowData.getBeforeColumnsList()); showColumn(rowData.getAfterColumnsList()); } } }catch(Exception e){ throw new RuntimeException("ERROR ## parser of eromanga-event has an error , data:" +entry.toString(),e); } } } private static void showColumn(List<Column> columns){ for(Column column :columns){ System.out.println(column.getName()+":"+column.getValue()+"\t\t Type:"+column.getMysqlTypeName()); } } } ``` 以上即完成了整个流程介绍从准备阶段到最后实际运行测试环节都做了详尽描述.
评论 8
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值