canal学习笔记(原理与环境搭建)

canal学习笔记(原理与环境搭建)

项目简介

canal: [kə’næl]中文翻译为渠道,运河,管道
是阿里开源的使用Java开发的用于MySQL数据库增量日志数据的订阅、消费和解析

历史背景:

早期阿里在杭州和美国双机房部署,存在跨机房数据同步的业务需求,实现方式主要是基于业务trigger(触发器)获取增量变更。从2010年开始,阿里逐渐尝试采用解析数据库日志获取增量变更进行同步,由此衍生出了canal项目


Github:https://github.com/alibaba/canal,目前一直在维护更新中

一. 原理

MySQL主从复制原理

MySQL主从复制原理

  • MySQL master 将数据变更写入二进制日志( binary log, 其中记录叫做二进制日志事件binary log
    events,可以通过 show binlog events 进行查看)
  • MySQL slave 将 master 的 binary log events 拷贝到它的中继日志(relay log)
  • MySQL slave 重放 relay log 中事件,将数据变更反映它自己的数据


    以上是canal的GitHub上对MySQL主从同步做的官方说明。上图的大致流程:当Master(MySQL主库)上的数据发生改变时,Master会记录一条数据的变化到BinaryLog中。而Slave(MySQL从库)中有I/O线程和SQL线程,I/O线程会调度请求Master的BinLog,将响应写入到自己的RelayLog(中继日志)中,SQL线程会读取RelayLog中的数据,并且在从库中Replay(重放),这样就将数据在从库中也保存了一份。需要注意的是,由于slave中的I/O线程和SQL线程是调度执行的,因此MySQL主从同步时会有一点点延迟,但基本是准实时的。

canal工作原理

canal工作原理

  1. canal模拟MySQL slave的交互协议,将自己伪装成MySQL slave,向MySQL master发送dump协议;
  2. MySQL master收到dump请求,开始推送binary log给canal;
  3. canal解析binary log对象(原始数据为byte流);
  4. canal将数据交给业务程序,做相应处理(这里的canal其实相当于服务端,具体需要执行后续操作的程序可以认为是canal客户端)

二. 应用场景

关于上面canal工作原理中的第4条,canal可以有以下应用场景:

  1. 数据库实时备份
  2. 业务缓存刷新
  3. 构建搜索索引(ES索引)
  4. 业务层面(价格变化等重要业务信息)
  5. 异构数据备份(mysql=>oracle,mysql=>mongo,mysql=>redis,mysql=>es等)

关于第3点构建搜索索引,我们公司目前对于商品后台的海运商品数据,页面搜索是就是走的ES索引,而商品数据发生业务变化时,需要在业务代码中更新MySQL,然后再显式构建ES索引。这个功能点可以很好地用canal实现。
目前canal主要支持MySQL版本为5.1.x,5.5.x,5.6.x,5.7.x,8.0.x。也支持mariaDB(MySQL被Oracle收购之后,MySQL的创始人担心MySQL以后会被闭源,就拉了一个分支出来,是用他的女儿的名字命名的,和MySQL几乎是一样的,终生免费开源,详情可以谷歌一下)

三. canal环境搭建

  1. 首先需要搭建MySQL环境,并启动MySQL服务
  2. 开启MySQL的binlog写入功能,配置binlog-format为ROW模式。需要在my.cnf中添加如下配置:
[mysqld]
log-bin=mysql-bin #开启binlog
binlog-format=ROW #选择ROW模式
server_id=1 #配置MySQL replaction需要定义,不要和canal的slaveId重复
  1. 配置一个canal连接MySQL的账号,并且授予作为MySQL slave的权限
CREATE USER canal IDENIFIED BY 'canal';
GRANT SELECT,REPLICATION SLAVE,REPLICATION CLIENT ON *.* TO 'canal'@'%';
FLUSH PRIVILEGES;
  1. 安装部署canal服务端
    github下载canal压缩包。由于github下载太慢,可以直接使用以下链接下载,下载完成后tar -zxvf解压到指定目录:
wget https://github.com/alibaba/canal/releases/download/canal-1.1.4/canal.deployer-1.1.4.tar.gz

解压后目录如下图:
在这里插入图片描述

  • bin目录:运行程序:启动、重启、关闭等
  • conf目录:配置文件
  • lib目录:依赖的jar包
  • logs目录:日志
  1. 修改canal配置(主要是MySQL连接相关配置)
vim conf/example/instace.properties

主要有以下配置:

# MySQL连接地址
canal.instance.master.address=127.0.0.1:3306
# MySQL连接用户名
canal.instance.dbUsername=canal
# MySQL连接密码
canal.instance.dbPassword=canal
# 需要监听的库和表的正则匹配=*\\..*
canal.instance.filter.regex
# 队列名:canal服务拿到数据后实际上是放在消息队列中
canal.mq.topic=example
  1. 启动canal服务
在bin目录下 ./startup.sh
  1. canal server的默认端口号为11111,可以在/conf目录下canal.properties文件中修改,以下是一些常用canal命令:
# 查看canal进程
ps -ef |grep canal
# 查看canal的server日志
cat logs/canal/canal.log
# 查看canl的instace的日志
cat logs/example/example.log
# 关闭canal
在bin目录下 ./stop.sh

也可以查看一些MySQL binlog相关的的配置:

# 查看是否启用了日志
show variables like 'log_bin';
# 显示当前日志状态:日志文件名、偏移座标等
show master status;
# 查看mysql binlog模式
show variables like 'binlog_format';
# 获取binlog文件列表
show binary logs;
# 查看当前正在写入的binlog文件(\G代表格式化)
show master status\G;
# 查看指定binlog文件的内容
show binlog events in 'mysql-bin.000017';

binlog有三种模式:

  1. ROW:不仅记录sql语句,还会记录每个字段的变化情况,但是会占用较多的空间,需要使用mysqlbinlog工具进行查看;
  2. STATEMENT:只记录sql语句,不记录上下文信息,数据恢复时可能会导致数据丢失;
  3. MIX:比较灵活。例如表结构变更的情况就记录为STATEMENT,数据更新的情况就记录为ROW模式。








xshell能ping通虚拟机,但是不能连接虚拟机
关闭防火墙
1.查看防火墙是否关闭
sudo ufw status

2.关闭防火墙
sudo ufw disable

3.启动22端口
sudo ufw allow 22
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章