canal初探

4/8/2020 Canal

摘要

System:Centos7.X
JDK Version:1.8
Es Version:6.5.4
Canal Version:

# 一:概述

# Canal 介绍

Canal是一个基于MySQL二进制日志的高性能数据同步系统。Canal广泛用于阿里巴巴集团,以提供可靠的低延迟增量数据管道 Canal server能够解析MySQL binlog并订阅数据更改,而Canal Client可以实现将更改广播到任何地方,例如数据库和Apache Kafka。 它具有以下功能:

  1. 支持所有平台
  2. 支持由Prometheus
  3. 支持通过不同方式解析和订阅MySQL binlog
  4. 支持高性能,实时数据同步
  5. Canal Server和Canal Client 都支持HA/Scalability,由Apache Zookeeper提供支持
  6. Docker支持 缺点: 不支持全量更新,只支持增量更新。

# 运行原理

  1. Canal模拟MySQL的slave的交互协议,伪装成MySQL slave,并将转发协议发送到MySQL Master服务器。
  2. MySQL Master接收到存储请求并开始将二进制日志推送到slave(即canal)
  3. Canal将二进制日志对象解析为自己的数据类型(原始字节流)

# 二:概述

# 创建mysql表

# 在alitest库中创建ccjjltx表
DROP TABLE IF EXISTS `ccjjltx`;
CREATE TABLE `ccjjltx` (
  `id` int(11) NOT NULL,
  `name` varchar(200) NOT NULL,
  `address` varchar(1000) DEFAULT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
1
2
3
4
5
6
7
8

# 创建es索引

PUT ccjjltx
{
  "mappings": {
    "ccjjltxdoc": {
      "properties": {
        "name": {
          "type": "text"
        },
        "address": {
          "type": "text"
        }
      }
    }
  }
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15

# 三:名词解释

# Mysql Binlog 日志

主要用于数据库的主从复制与数据恢复。Binlog中记录了数据的增删改查操作,主从复制过程中,主库向从库同步binlog日志,从库对Binlog日志中的事件进行重放,从而实现主从同步。

模式 说明
ROW 记录每一行数据被修改的情况,但是日志量太大
STATEMENT 记录每一条修改数据的SQL语句,减少了日志量,但是SQL语句使用函数或触发器时容易出现主从不一致
MIXED 结合了ROW和STATEMENT的优点,根据具体执行数据操作的SQL语句选择使用ROW或者STATEMENT记录日志

要通过Mysql Binlog将数据同步到ES集群,只能使用ROW模式,因为只有ROW模式才能知道mysql中的数据的修改内容.

# 四:安装部署

# deployer

# 下载

# 本人放在/root/canal/deployer
wget https://github.com/alibaba/canal/releases/download/canal-1.1.4/canal.deployer-1.1.4.tar.gz
1
2

# 解压文件

tar -zxvf canal.deployer-1.1.4.tar.gz
1

# 修改配置

vim conf/example/instance.properties
1
修改如下内容
#position info
canal.instance.master.address=127.0.0.1:3306
#username/password
canal.instance.dbUsername=root
canal.instance.dbPassword=Chencj1212
1
2
3
4
5

完整instance.properties内容如下

# 启动deployer

./bin/startup.sh
1

# 查看日志

tail -f logs/canal/canal.log
1

# 关闭deployer

./bin/stop.sh
1

# adapter

# 下载

# 本人放在/root/canal/adapter
wget https://github.com/alibaba/canal/releases/download/canal-1.1.4/canal.adapter-1.1.4.tar.gz
1
2

# 解压

tar -zvxf canal.adapter-1.1.4.tar.gz
1

# 修改配置

vim conf/application.yml
1
修改如下内容
server.port:canal-adapter端口号
canal.conf.canalServerHost:canal-server的ip地址
canal.conf.srcDataSources.defaultDS.url:数据库地址和同步的库
canal.conf.srcDataSources.defaultDS.username:数据库用户名
canal.conf.srcDataSources.defaultDS.password:数据库密码
canal.conf.canalAdapters.groups.outerAdapters.hosts:es主机地址,tcp端口
1
2
3
4
5
6

完整application.yml内容如下

# 新增配置

在conf/es下,新增一个es.yml(名字可随意)

内容如下
destination: example
groupId:
esMapping:
  _index: ccjjltx
  _type: ccjjltxdoc
  _id: _id
  upsert: true
  sql: "select a.id as _id,a.name,a.address from ccjjltx a"
1
2
3
4
5
6
7
8

# 启动adapter

./bin/startup.sh
1

# 查看日志

tail -f logs/adapter/adapter.log
1

# 启动adapter

./bin/startup.sh
1

# 查看日志

tail -f logs/adapter/adapter.log
1

# 关闭adapter

./bin/stop.sh
1

# 验证

验证数据
# mysql【仅限于公司内网访问】
ip: 192.168.23.179
port:3306
userName:root
password:Chencj1212
database:alitest
tables:ccjjltx

# kibana【仅限于公司内网访问】
url:192.168.23.177:5601
query:GET ccjjltx/ccjjltxdoc/_search?pretty
1
2
3
4
5
6
7
8
9
10
11

验证

# admin-server

# 下载

本人放在/root/canal/admin

wget  https://github.com/alibaba/canal/releases/download/canal-1.1.4/canal.adapter-1.1.4.tar.gz
1

# 解压

tar -zvxf canal.adapter-1.1.4.tar.gz
1

# 修改配置

vim conf/application.yml
1

完整内容如下

# 启动admin-server

./bin/startup.sh
1

# 查看日志

tail -f logs/admin.log
1

# 关闭admin-server

./bin/stop.sh
1

# 默认账号密码

账号:admin 密码:123456

# 登录报错

提示字符位数提示,需要修改部分前端代码,定位问题代码

cd /root/canal/admin/conf/public/static/js
grep -r -l "The password can not be less than" ./
1
2
修改内容如下示
# 将下面的6替换成1
t.length<6?s(new Error("The password can not be less than 6 digits"))
1
2

# 验证

# admin-server【仅限于公司内网访问】
url: 192.168.23.179:8089
userName:admin
password:123456
1
2
3
4

验证

最后更新: 11/10/2021, 9:07:47 PM