canal是alibaba开源的基于mysql binlog解析工具,可利用它实现mysql增量订阅/消费,典型的应用场景如下图:

利用canal,可以将mysql的数据变化,通过解析binlog,投递到kafka(或rocket mq),mq的消费方,可以把这些数据变化,应用到不同的业务场景,比如:

1. 同步到redis(即:数据库的变化自动同步到缓存)

2. 同步到es搜索引擎(即:数据库的变化自动刷新ES索引)

3. 同步到其它异构数据库(即:mysql的变化,自动同步到pg、oracle等其它类型的数据库)

下面是mac本上,搭建standalone单机模式的过程:

一、安装zookeeper

注:canal、kafka都依赖zk,所以得先安装zk

1.1  wget https://mirrors.tuna.tsinghua.edu.cn/apache/zookeeper/zookeeper-3.4.14/zookeeper-3.4.14.tar.gz

1.2 tar -zxvf zookeeper-3.4.14.tar.gz

1.3 cd zookeeper-3.4.14

1.4 cp conf/zoo_sample.cfg conf/zoo.cfg

1.5 vim conf/zoo.cfg 参考下面的内容

  1. tickTime=2000
  2. initLimit=10
  3. syncLimit=5
  4. dataDir=/Users/jimmy/soft/zookeeper-3.4.14/data
  5. dataLogDir=/Users/jimmy/soft/zookeeper-3.4.14/logs
  6. clientPort=2181

注:dataDir, dataLogDir的目录大家可自行调整,如果没有,请先创建,且zk必须有写入权限

1.6 bin/zkServer.sh start-foreground 如果看到终端有类似下面的输入:

2019-05-26 13:27:38,667 [myid:] - INFO [main:ServerCnxnFactory@117] - Using org.apache.zookeeper.server.NIOServerCnxnFactory as server connection factory
2019-05-26 13:27:38,682 [myid:] - INFO [main:NIOServerCnxnFactory@89] - binding to port 0.0.0.0/0.0.0.0:2181

就表示启动成功了。

注:start-foreground表示前台启动,如果启动过程中有任何错误,也会直接输出,首次启动时,用这种方式可以快速排错。如果启动成功后,可以ctrl+c,然后用bin/zkServer.sh start 转入后台运行模式。

二、安装kafka

2.1 wget http://mirror.bit.edu.cn/apache/kafka/2.1.1/kafka_2.11-2.1.1.tgz

2.2 tar -zxvf kafka_2.11-2.1.1.tgz

2.3 vim config/server.properties 修改下面几处

  1. ...
  2. listeners=PLAINTEXT://:9092
  3. advertised.listeners=PLAINTEXT://127.0.0.1:9092
  4. ...
  5. log.dirs=/Users/jimmy/soft/kafka_2.11-2.1.1/logs

注:主要就是指定个zk的地址,以及日志目录 

2.4 bin/kafka-server-start.sh config/server.properties 启动

如果控制台没输出错误信息,lsof -i:9092 端口都在(另开1个终端检测),说明启用成功,Ctrl+C停掉,再用 bin/kafka-server-start.sh -daemon config/server.properties 后台方式运行

三、安装mysql

3.1 brew install mysql@5.7

注:不建议安装mysql 5.8版本,因为5.8采用了新的身份验证方式,canal在连接时,低版本会遇到问题(将来canal可能会支持5.8版本)

3.2 brew services start mysql@5.7 (注:start换成stop就是停止)

3.3 随便找个mysql客户端连上去,创建canal专用连接账号

  1. CREATE USER 'canal'@'%' IDENTIFIED BY 'Canal.1.1.3.x';
  2. GRANT SELECT, REPLICATION SLAVE, REPLICATION CLIENT ON *.* TO 'canal'@'%';
  3. FLUSH PRIVILEGES;

注:上面Canal.1.1.3.x 是canal的密码,大家根据需求自行修改。

3.4 调整my.cnf参数,启用binlog功能

vim /usr/local/etc/my.cnf

  1. # Default Homebrew MySQL server config
  2. [mysqld]
  3. log-bin=mysql-bin
  4. binlog-format=ROW
  5. server_id=1
  6. # Only allow connections from localhost
  7. bind-address=127.0.0.1

调整好后,重启mysql,然后连上去,输入:

show master status;

验证一下,如果能看到类似:

就表示ok了。

四、安装canal

4.1 wget https://github.com/alibaba/canal/releases/download/canal-1.1.3/canal.deployer-1.1.3.tar.gz

4.2 tar -zxvf canal.deployer-1.1.3.tar.gz

4.3 cd canal-1.1.3 (注:如果解析后的目录名,不是这个,大家自行调整)

4.4 vim conf/example/instance.properties

  1. ....
  2. canal.instance.mysql.slaveId=1234
  3.  
  4. ....
  5. canal.instance.master.address=127.0.0.1:3306
  6. canal.instance.master.journal.name=mysql-bin.000001
  7. canal.instance.master.position=154
  8.  
  9. ...
  10. canal.instance.dbUsername=canal
  11. canal.instance.dbPassword=Canal.1.1.3.x
  12. canal.instance.connectionCharset=UTF-8
  13.  
  14. ...
  15.  
  16. # table regex(同步sample库中的employee,city这二张表)
  17. canal.instance.filter.regex=sample\\.employee,sample\\.city
  18.  
  19. # mq config(上面的二张表,数据变化,投放到sample-data中)
  20. canal.mq.topic=sample-data
  21.  
  22. ...

主要是指定:mysql地址及binlog起始位置(注:最好与上一步show master status里输出的信息一致),连接用户名/密码,以及kafka mq的topic信息(上面的配置,我们会把sample库的employee,city这二张表的变化,都投递到sample-data这个topic中)

4.5 vim conf/canal.properties

  1. ...
  2. canal.serverMode=kafka
  3.  
  4. ...
  5. canal.destinations = example
  6.  
  7. ...
  8. canal.mq.servers = 127.0.0.1:9092

注:上述关键配置,表示canal将使用kafka作为mq,同时conf/example作为desination之一。

4.6 bin/startup.sh 启动

启动完成后,是否成功要通过日志查看

cat logs/canal/canal.log 如果能看到类似下面的输出:

  1. 2019-05-26 14:43:36.468 [main] INFO com.alibaba.otter.canal.deployer.CanalStater - ## the canal server is running now ......
  2. 2019-05-26 14:43:36.468 [destination = metrics , address = null , EventParser] ERROR c.a.o.c.p.inbound.mysql.rds.RdsBinlogEventParserProxy - parse events has an error
  3. com.alibaba.otter.canal.parse.exception.CanalParseException: illegal connection is null
  4. 2019-05-26 14:43:36.482 [canal-instance-scan-0] INFO c.a.o.canal.deployer.monitor.SpringInstanceConfigMonitor - auto notify stop metrics successful.
  5. 2019-05-26 14:43:36.713 [destination = example , address = /127.0.0.1:3306 , EventParser] WARN c.a.o.c.p.inbound.mysql.rds.RdsBinlogEventParserProxy - ---> find start position successfully, EntryPosition[included=false,journalName=mysql-bin.000001,position=4435,serverId=1,gtid=,timestamp=1558841400000] cost : 409ms , the next step is binlog dump

就表示成功了。

注:如果启动不成功,可能原因有:

1、canal连接不上mysql,日志里会有相应提示,可尝试用mysql客户端,以canal里配置的用户名、密码连接测试一下

2、提示无法读取binlog,找不到binlog文件之类。如果mysql里show master status正常,多半是之前canal上次运行时记录了错误的binlog起始位置。可尝试调整/conf/example/meta.dat文件中的值

  1. {"clientDatas":[{"clientIdentity":{"clientId":1001,"destination":"example","filter":""},"cursor":{"identity":{"slaveId":-1,"sourceAddress":{"address":"localhost","port":3306}},"postion":{"gtid":"","included":false,"journalName":"mysql-bin.000004","position":2805,"serverId":1,"timestamp":1558880055000}}}],"destination":"example"}y

该文件为一个标准json,里面记录了binlog的文件名及起始位置。或者简单粗暴点,删除/conf/example下的.dat以及.db文件。

4.7 查看kafka中的消息

先在sample数据库中,随便建二个表,并修改几行数据,表结构如下:

  1. CREATE TABLE `employee` (
  2. `id` bigint(20) unsigned zerofill NOT NULL AUTO_INCREMENT COMMENT '主键id',
  3. `name` varchar(100) NOT NULL DEFAULT '' COMMENT '姓名',
  4. `update_at` datetime(3) NOT NULL DEFAULT CURRENT_TIMESTAMP(3) ON UPDATE CURRENT_TIMESTAMP(3) COMMENT '最后更新时间',
  5. PRIMARY KEY (`id`)
  6. ) ENGINE=InnoDB AUTO_INCREMENT=7 DEFAULT CHARSET=utf8mb4

  1. CREATE TABLE `city` (
  2. `id` bigint(20) NOT NULL AUTO_INCREMENT,
  3. `city_name` varchar(100) DEFAULT '' COMMENT '城市名',
  4. `create_at` datetime(3) DEFAULT CURRENT_TIMESTAMP(3),
  5. `update_at` datetime(3) DEFAULT CURRENT_TIMESTAMP(3) ON UPDATE CURRENT_TIMESTAMP(3),
  6. PRIMARY KEY (`id`)
  7. ) ENGINE=InnoDB AUTO_INCREMENT=2 DEFAULT CHARSET=utf8mb4 COMMENT='城市表'

然后回到终端界面。

4.7.1 cd kafka_2.11-2.1.1 进入kafka目录

4.7.2 bin/kafka-topics.sh --list --zookeeper 127.0.0.1:2181 查看所有topic, 如果输出信息中,有sample-data这个topic,表示topic正常

4.7.3 bin/kafka-console-consumer.sh --bootstrap-server 127.0.0.1:9092  --from-beginning --topic sample-data 查看所有sample topic的消息

看到类似下面的输出(注:为了便于阅读,已经做了json格式化处理)

  1. {
  2. "data": [{
  3. "id": "6",
  4. "name": "杨俊明",
  5. "update_at": "2019-05-26 14:51:30.094"
  6. }],
  7. "database": "sample",
  8. "es": 1558853490000,
  9. "id": 4,
  10. "isDdl": false,
  11. "mysqlType": {
  12. "id": "bigint(20) unsigned zerofill",
  13. "name": "varchar(100)",
  14. "update_at": "datetime(3)"
  15. },
  16. "old": [{
  17. "name": "新名称",
  18. "update_at": "2019-05-26 11:30:00.899"
  19. }],
  20. "pkNames": ["id"],
  21. "sql": "",
  22. "sqlType": {
  23. "id": -5,
  24. "name": 12,
  25. "update_at": 93
  26. },
  27. "table": "employee",
  28. "ts": 1558853490132,
  29. "type": "UPDATE"
  30. }

  1. {
  2. "data": [{
  3. "id": "2",
  4. "city_name": "北京",
  5. "create_at": "2019-05-26 22:14:15.508",
  6. "update_at": "2019-05-26 22:14:15.508"
  7. }],
  8. "database": "sample",
  9. "es": 1558880055000,
  10. "id": 5,
  11. "isDdl": false,
  12. "mysqlType": {
  13. "id": "bigint",
  14. "city_name": "varchar(100)",
  15. "create_at": "datetime(3)",
  16. "update_at": "datetime(3)"
  17. },
  18. "old": null,
  19. "pkNames": ["id"],
  20. "sql": "",
  21. "sqlType": {
  22. "id": -5,
  23. "city_name": 12,
  24. "create_at": 93,
  25. "update_at": 93
  26. },
  27. "table": "city",
  28. "ts": 1558880055712,
  29. "type": "INSERT"
  30. }

  

参考文章:

https://github.com/alibaba/canal/wiki/Kafka-QuickStart

https://github.com/alibaba/canal/wiki/Canal-Kafka-RocketMQ-QuickStart

https://www.jianshu.com/p/93d9018e2fa1

alibaba canal安装笔记的更多相关文章

  1. 阿里Canal安装和代码示例

    Canal的简单使用 canal可以用来监控数据库数据的变化,从而获得新增数据,或者修改的数据,用于实际工作中,比较实用,特此记录一下 Canal简介 canal是应阿里巴巴存在杭州和美国的双机房部署 ...

  2. mysql 开源~canal安装解析

    一 简介:今天咱们来聊聊canal的一些东西 二 原理: canal模拟mysql slave的交互协议,伪装自己为mysql slave,向mysql master发送dump协议 mysql ma ...

  3. canal安装与使用

    安装 alpha的版本不是稳定的版本 wget https://github.com/alibaba/canal/releases/download/canal-1.1.4/canal.deploye ...

  4. MonoDevelop 4.2.2/Mono 3.4.0 in CentOS 6.5 安装笔记

    MonoDevelop 4.2.2/Mono 3.4.0 in CentOS 6.5 安装笔记 说明 以root账户登录Linux操作系统,注意:本文中的所有命令行前面的 #> 表示命令行提示符 ...

  5. 基于Ubuntu14.04系统的nvidia tesla K40驱动和cuda 7.5安装笔记

    基于Ubuntu14.04系统的nvidia tesla K40驱动和cuda 7.5安装笔记 飞翔的蜘蛛人 注1:本人新手,文章中不准确的地方,欢迎批评指正 注2:知识储备应达到Linux入门级水平 ...

  6. sublime 安装笔记

    sublime 安装笔记 下载地址 安装package control 根据版本复制相应的代码到console,运行 按要求重启几次后再按crtl+shift+p打开命令窗口 输入pcip即可开始安装 ...

  7. docker在ubuntu14.04下的安装笔记

    本文主要是参考官网教程进行ubuntu14.04的安装. 下面是我的安装笔记. 笔记原件完整下载: 链接: https://pan.baidu.com/s/1dEPQ8mP 密码: gq2p

  8. ArchLinux 安装笔记:续 --zz

    续前话 在虚拟机里调试了几天,终于鼓起勇气往实体机安装了,到桌面环境为止的安装过程可以看我的前一篇文章<ArchLinux 安装笔记>.桌面环境我使用的是 GNOME,虽然用了很长一段时间 ...

  9. Hadoop1.x与2.x安装笔记

    Hadoop1.x与2.x安装笔记 Email: chujiaqiang229@163.com 2015-05-09 Hadoop 1.x 安装 Hadoop1.x 集群规划 No 名称 内容 备注 ...

随机推荐

  1. 牛客网 牛客小白月赛1 D.多项式乘法

    D.多项式乘法   链接:https://www.nowcoder.com/acm/contest/85/D来源:牛客网 这个题想一下就能想出来了. 代码: 1 #include<iostrea ...

  2. Codeforces Gym100735 G.LCS Revised (KTU Programming Camp (Day 1) Lithuania, Birˇstonas, August 19, 2015)

    G.LCS Revised   The longest common subsequence is a well known DP problem: given two strings A and B ...

  3. java 两个int类型的数据相除并输出百分号保留两位有效数字

    java代码: public void IntA(int a , int b){ //首先判断分母不能为0 if(b!=0){ folat num = (float) a*100/b; Decimal ...

  4. 从int 3探索Windows应用程序调试原理

    http://www.cnblogs.com/xuanyuan/p/3998408.html

  5. Python中xml、字典、json、类四种数据的转换

    最近学python,觉得python很强很大很强大,写一个学习随笔,当作留念注:xml.字典.json.类四种数据的转换,从左到右依次转换,即xml要转换为类时,先将xml转换为字典,再将字典转换为j ...

  6. php实现将人民币金额转大写的办法

    class Num2Cny{ static $basical=array(0=>'零','壹','贰','叁','肆','伍','陆','柒','捌','玖'); static $advance ...

  7. EasyMvc入门教程-基本控件说明(4)折叠面板

    折叠面板一般出现在管理后台,大家用的OutLook里就是用了折叠面板,样子大概是这样的: 把其中的内容替换成图标按钮,是不是就是我们常见的样子了?:)那么如何实现呢?请看例子: @{ var data ...

  8. C# 中的结构类型(struct type)

    ylbtech- .NET-Basic:C# 中的结构类型(struct type) C# 中的结构类型(struct type) 1.A,相关概念返回顶部   像类一样,结构(struct)是能够包 ...

  9. 经验分享 | Burpsuite抓取非HTTP流量

    使用Burp对安卓应用进行渗透测试的过程中,有时候会遇到某些流量无法拦截的情况,这些流量可能不是HTTP协议的,或者是“比较特殊”的HTTP协议(以下统称非HTTP流量).遇到这种情况,大多数人会选择 ...

  10. 关于文本处理sort-cut-wc详解

    sort sort命令对File参数指定的文件中的行排序,并将结果写到标准输出.如果 File 参数指定多个文件,那么 sort 命令将这些文件连接起来,并当作一个文件进行排序.   sort语法 [ ...