一、关于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开源版本支持8.0及以下的版本,针对阿里云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": , // Canal-Server所在的服务器Port
"Destination": "products", // 建议与Canal-Server中配置的destination保持一致
"Filter": "products_dev\\..*", // 建议与Canal-Server中配置的filter保持一致
"SleepTime": , // SleepTime越短监听频率越高但也越耗CPU
"BufferSize": , // 每次监听获取的数据量大小,单位为字节
"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

作者:周旭龙

出处:http://edisonchou.cnblogs.com

本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文链接。

一个实时收集MySql变更记录的组件CanalSharp.AspNetCore的更多相关文章

  1. Vue父组件向子组件传递一个动态的值,子组件如何保持实时更新实时更新?

    原文:https://blog.csdn.net/zhouweixue_vivi/article/details/78550738 2017年11月16日 14:22:50 zhouweixue_vi ...

  2. 企业级中带你ELK如何实时收集分析Mysql慢查询日志

    什么是Mysql慢查询日志? 当SQL语句执行时间超过设定的阈值时,便于记录到指定的日志文件中或者表中,所有记录称之为慢查询日志 为什么要收集Mysql慢查询日志? 数据库在运行期间,可能会存在这很多 ...

  3. flume实时采集mysql数据到kafka中并输出

    环境说明 centos7(运行于vbox虚拟机) flume1.9.0(flume-ng-sql-source插件版本1.5.3) jdk1.8 kafka(版本忘了后续更新) zookeeper(版 ...

  4. 蛙蛙推荐:如何实时监控MySql状态

    大多网站的性能瓶颈都会出在数据库上,所以想把Mysql监控起来,就搜索了下相关资料. 后来和同事讨论了下cacti和nagios有些老套和过时,graphite比较时尚,然后就搜了下相关的资料,最后搞 ...

  5. 实时监控MySql状态

    大多网站的性能瓶颈都会出在数据库上,所以想把Mysql监控起来,就搜索了下相关资料. 后来和同事讨论了下cacti和nagios有些老套和过时,graphite比较时尚,然后就搜了下相关的资料,最后搞 ...

  6. Btrace是一个实时监控工具

    http://blog.csdn.net/gzh0222/article/details/9731031 Btrace是一个实时监控工具,可以无需修改应用代码(事实上它修改了字节码),来达到不可告人的 ...

  7. 利用DTrace实时检测MySQl

    与我们大多数人想象的不同,DTrace用于MySQL时不需对MySQL做任何更改.DTrace最强大的“提供器”(provider,是一组可观测的探测器)是FBT(Functional Boundar ...

  8. maxwell实时同步mysql中binlog

    概述 Maxwell是一个能实时读取MySQL二进制日志binlog,并生成 JSON 格式的消息,作为生产者发送给 Kafka,Kinesis.RabbitMQ.Redis.Google Cloud ...

  9. 一个小时学会MySQL数据库

    随着移动互联网的结束与人工智能的到来大数据变成越来越重要,下一个成功者应该是拥有海量数据的,数据与数据库你应该知道. 一.数据库概要 数据库(Database)是存储与管理数据的软件系统,就像一个存入 ...

随机推荐

  1. 分布式任务调度平台XXL-JOB

    <分布式任务调度平台XXL-JOB>       一.简介 1.1 概述 XXL-JOB是一个轻量级分布式任务调度框架,其核心设计目标是开发迅速.学习简单.轻量级.易扩展.现已开放源代码并 ...

  2. 运算符优先级--C

    优先口决 括号成员第一; //括号运算符[]() 成员运算符. -> 全体单目第二; //所有的单目运算符比如++ -- +(正) -(负) 指针运算*& 乘除余三,加减四; //这个& ...

  3. 高性能网络通信框架 HP-Socket

      HP-Socket 详细介绍 HP-Socket 是一套通用的高性能 TCP/UDP/HTTP 通信框架,包含服务端组件.客户端组件和Agent组件,广泛适用于各种不同应用场景的 TCP/UDP/ ...

  4. maven安装和配置及创建maven项目

    (1)下载maven,下载成功后,解压到本地磁盘 里面包含这几项 (2)配置maven环境变量MAVEN_HOME.path (3)最后检验配置是否成功:用win键+R,来打开命令行提示符窗口,即Do ...

  5. Java中判断是否为空的方法

    1.判断字符串或者对象是否为空 首先来看一下工具StringUtils的判断方法: 一种是org.apache.commons.lang3包下的: 另一种是org.springframework.ut ...

  6. 利用vue-router和compoment重构代码--踩坑(一)

    业务主要功能 获取所有的数据库列表 点击某一个数据库列表的时候,右侧分页展示数据 点击右侧某一条数据的时候,现实数据详情 以下是之前的页面,存在以下问题: 前段开发没有工程化(webpack) 主要功 ...

  7. div布局之面向对象

    栗子之导航条(navbar) http://www.runoob.com/try/try2.php?filename=bootstrap-using-glyphicons-navbar <!DO ...

  8. CSS实现Tab布局

    一.布局方式 1.内容与tab分离 <div class="container"> <div class="tab-content"> ...

  9. Mysql 30条军规

    一.基础规范 (1)必须使用InnoDB存储引擎 解读:支持事务.行级锁.并发性能更好.CPU及内存缓存页优化使得资源利用率更高 (2)必须使用UTF8字符集 解读:万国码,无需转码,无乱码风险,节省 ...

  10. 推荐《用Python进行自然语言处理》中文翻译-NLTK配套书

    NLTK配套书<用Python进行自然语言处理>(Natural Language Processing with Python)已经出版好几年了,但是国内一直没有翻译的中文版,虽然读英文 ...