首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >一个实时收集MySql变更记录的组件CanalSharp.AspNetCore

一个实时收集MySql变更记录的组件CanalSharp.AspNetCore

作者头像
Edison Zhou
发布2019-04-25 10:34:07
1K0
发布2019-04-25 10:34:07
举报
文章被收录于专栏:EdisonTalkEdisonTalk

一、关于CanalSharp

  CanalSharp 是阿里巴巴开源项目 Canal 的 .NET 客户端。为 .NET 开发者提供一个更友好的使用 Canal 的方式。Canal 是mysql数据库binlog的增量订阅&消费组件。

  CanalSharp 是 Canal 的 .NET 客户端,它与 Canal 是采用的Socket来进行通信的,传输协议是TCP,交互协议采用的是 Google Protocol Buffer 3.0。

  CanalSharp的作者是园子里的晓晨WithLin

  更多关于CanalSharp的信息请浏览:https://github.com/CanalClient/CanalSharp

  更多关于Canal的信息请浏览:https://github.com/alibaba/canal

二、关于CanalSharp.AspNetCore

  CanalSharp.AspNetCore是一个基于CanalSharp的适用于ASP.NET Core的一个后台任务组件,它可以随着ASP.NET Core实例的启动而启动,目前采用轮询的方式对Canal Server进行监听(我比较懒,目前主要是借鉴了晓晨的Demo来改写的),获得MySql行更改(RowChange)后写入MySql指定的记录表中(canal.logs,CanalSharp.AspNetCore会自动帮我们创建这张记录表)。当然,这只是我目前的业务需求,完全可以改为事件订阅+自定义输出的方式进行完善,这是后话了。

  这个项目的GitHub地址为:https://github.com/XiLife-OSPC/CanalSharp.AspNetCore

三、使用前的准备工作

3.1 MySql

  当前的canal开源版本支持5.7及以下的版本,针对阿里云RDS账号默认已经有binlog dump权限,不需要任何权限或者binlog设置,可以直接跳过这一步。 开启binlog写入功能,并且配置binlog模式为row。

  修改C:\ProgramData\MySQL\MySQL Server 5.7\my.ini的以下内容

log-bin=mysql-bin
binlog-format=Row
server-id=1

  重启数据库服务,测试修改是否生效

show variables like 'binlog_format';
show variables like 'log_bin';

  创建一个用户Canal用于获取binlog的用户并授予权限

CREATE USER canal IDENTIFIED BY canal; 
GRANT SELECT, REPLICATION SLAVE, REPLICATION CLIENT ON *.* TO canal @'%';
FLUSH PRIVILEGES;

3.2 Canal-Server

  本文通过Docker方式来启动Canal-Server,也可以不通过Docker方式来,更多内容可以参考Canal的github。

  通过Docker拉取Canal镜像:

docker pull canal/canal-server:v1.1.2

  通过以下命令启动Canal实例:

docker run --restart=always --name core_productservice_canal \
-e canal.instance.master.address=192.168.16.150:3306 \
-e canal.instance.dbUsername=canal \
-e canal.instance.dbPassword=canal \
-e canal.destinations=products \
-e canal.instance.defaultDatabaseName=products_dev \
-e canal.instance.filter.regex=products_dev\\..* \
-e canal.instance.filter.black.regex=products_dev\\.canal.* \
-p 8001:11111 \
-d canal/canal-server:v1.1.2

PS:其中name、destinations、defaultDatabaseName、filter根据要监听的业务数据库按需修改。

四、开始使用CanalSharp.AspNetCore

4.1 安装Nuget包

  通过NuGet或项目引用添加该组件,搜索CanalSharp.AspNetCore

  目前最新版本为0.0.3,支持.NET Core 2.1及以上,暂未弄成.NET Standard类库。

4.2 添加配置文件项

  在配置文件(appSettings.json)中添加以下配置项:

"Canal": {
    "Enabled": true,
    "LogSource": "Core.Product.Canal",
    "ServerIP": "192.168.16.190", // Canal-Server所在的服务器IP
    "ServerPort": 8001, // Canal-Server所在的服务器Port
    "Destination": "products", // 建议与Canal-Server中配置的destination保持一致
    "Filter": "products_dev\\..*", // 建议与Canal-Server中配置的filter保持一致
    "SleepTime": 50, // SleepTime越短监听频率越高但也越耗CPU
    "BufferSize": 2048, // 每次监听获取的数据量大小,单位为字节
    "Output": {
      "ConnStr": "Server=192.168.16.150;Port=3306;Database=products_dev;Uid=dev;Pwd=xdp" // 要输出的日志记录表所在的数据连接字符串
    }
  }

4.3 在Startup类中注册

  在StartUp类中的Configure方法中加入以下代码行:

public void Configure(IApplicationBuilder app, IHostingEnvironment env,
            IApplicationLifetime appLifetime, ILogger<ICanalClientHandler> defaultLogger)
{
    ......
    app.RegisterCanalSharpClient(appLifetime, Configuration, defaultLogger);
}

五、效果演示

  当在指定要监听的数据库对某张表的某行数据进行Update或Delete操作后,又或者进行Insert行操作后,canal.logs表会自动记录变更的记录数据如下图:

PS:INSERT操作会记录新增的数据行数据到CurrentValue列,DELETE操作会记录删除的数据行数据到PreviousValue列,UPDATE操作则会记录修改前PreviousValue和修改后的值CurrentValue。对于INSERT和DELETE会生成JSON格式的字符串,例如“{"Id":"12312","Name":"精装主材","Description":"测试描述",....}”这种。

六、示例项目

点这里:CanalSharp.AspNetCore.Sample

Code有点乱,我还没来得及做重构和优化,先就这样吧。

参考资料

李志强,《CanalSharp-mysql数据库binlog的增量订阅&消费组件Canal的.NET客户端

CanalSharp GitHub

本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2019-04-17 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 一、关于CanalSharp
  • 二、关于CanalSharp.AspNetCore
  • 三、使用前的准备工作
    • 3.1 MySql
      • 3.2 Canal-Server
      • 四、开始使用CanalSharp.AspNetCore
        • 4.1 安装Nuget包
          • 4.2 添加配置文件项
            • 4.3 在Startup类中注册
            • 五、效果演示
            • 六、示例项目
            • 参考资料
            相关产品与服务
            云数据库 MySQL
            腾讯云数据库 MySQL(TencentDB for MySQL)为用户提供安全可靠,性能卓越、易于维护的企业级云数据库服务。其具备6大企业级特性,包括企业级定制内核、企业级高可用、企业级高可靠、企业级安全、企业级扩展以及企业级智能运维。通过使用腾讯云数据库 MySQL,可实现分钟级别的数据库部署、弹性扩展以及全自动化的运维管理,不仅经济实惠,而且稳定可靠,易于运维。
            领券
            问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档