Canal大作战

- 前言

之前我是通过实时的查库,然后再将数据实时地更新或者新增到ES中。虽然现在能稳定运行,但是占用了数据库的资源,同时不容易扩展。一旦分库分表,或者修改字段等,则需要开发升级。

因此利用成熟的中间件,可以解决上诉问题。接下去我就会介绍我使用的canal以及canal-adapter组件。

- 简介

canal是阿里巴巴开源的一个组件,他主要是通过mysql的binlog日志来同步数据库的数据。

canal-adapter是阿里巴巴针对canal的适配器,他能从canal server取得数据直接适配到其他数据源。例如hbase,es,db等。

gitlub地址:https://github.com/alibaba/canal/releases

- 原理

1. mysql主备原理

官网的原理图:

从图中我们可以看出:

1.master主库会将数据改变的动作记录到binlog中
2.slave从库会到主库拉取binlog拷贝到自己的中继日志(relay log)
3.slave从库读取中继日志(relay log)然后更新自己的数据

2. canal工作原理

官网的原理图:

由图可知,canal伪装成mysql的从库,模拟maser和slave的交互协议来拉取binlog,然后解析binlog获取数据流。

官网地址:https://github.com/alibaba/canal

- 疯狂操作

上文说到要拉取数据库的binlog日志,因此要对数据库修改一些配置。由于canal目前仅支持Mysql,那么我们就从mysql开始下手!首先我们肯定要保证我们的mysql要打开binlog。

1. binlog

    show binary logs;

或者

show variables like 'log_%';

从客户端上我们发现未打开binlog!接下去就配置打开binlog!

linux: my.cnf
windows: my.ini

默认是linux的配置文件路径是/etc/my.cnf,windows是mysql server包路径下的my.ini文件

将下面的配置加到配置文件[mysqld]中即可!

# 这样默认就会打开binlog 
log_bin=mysql-bin
# 必须选择row模式 
binlog_format=ROW
# 配置mysql replaction需要定义,不能和canal的slaveId重复
server_id=1

打开binlog,并且必须设置row模式,这样才能拿到每一条记录的更新数据!注意service_id若在集群中有多个节点的时候,不能相同!

如果是docker的话,则要按下面的步骤来找到映射到容器里面的配置文件。先进入容器

docker exec -it mysql bash

进入容器之后可以用find指令找一下配置的位置,找到后直接将上面配置加进去就好了

find / -name mysql

接下去直接重启mysql就可以啦,docker部署的话可以继续往下操作,列举所有应用

docker ps -a

找到mysql应用id直接重启就Ok啦!

docker restart id

接下去再按第一步查找一波就发现binlog都已经打开啦!

但是千万不要忘了, canal的原理是模拟自己为mysql slave,所以这里一定需要做为mysql slave的相关权限

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

当前用户来通过grants查询权限:

show grants for 'canal' ;

官方文档:https://github.com/alibaba/canal/wiki/AdminGuide

2. canal-server

binlog打开之后,接下去就部署canal的server服务啦!

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

目前位置最新的稳定版本是1.1.2,但是奈何这个版本有jar包冲突。

后来看到canal的开发者说让我们用新的版本,因此我用1.1.3这个版本的包。

将jar包下载下来之后,解压

mkdir canal
mkdir server
tar zxvf canal.deployer-1.1.3-SNAPSHOT.tar.gz -C /usr/local/canal/server/

可以看到解压的路径

如果进入bin目录,可进行重启,关闭,开启

cd bin
sh restart.sh  /   sh startup.sh  /  sh  stop.sh

如果要进行修改配置则要进入conf目录

cd conf/example/
vim instance.properties

1.canal伪装成mysql的slave从库节点的id
2.监听的数据库的地址
3.监听的数据库的一些配置

以上3点是必要配置。配置完直接启动

此时canal的server端已经启动完毕!

server官方文档:https://github.com/alibaba/canal/wiki/QuickStart

3. canal-adapter

先下载和canal-server同样版本的包,然后解压

wget https://github.com/alibaba/canal/releases/download/canal-1.1.3-alpha-2/canal.adapter-1.1.3-SNAPSHOT.tar.gz
mkdir adapter
tar zxvf canal.adapter-1.1.3-SNAPSHOT.tar.gz -C /usr/local/canal/adapter/

可以看到解压的路径

如果进入bin目录,可进行重启,关闭,开启

cd bin
sh restart.sh  /   sh startup.sh  /  sh  stop.sh

如果要进行修改配置则要进入conf目录

首先

vim application.yml

1.注意端口默认是8081,小心端口冲突
2.配置canal的server的地址
3.配置源数据源mysql的相关配置
4.配置目标数据源的相关配置,可配置db,hbase,es

以上3点是必要配置。

目标数据源用es为例,则接下去配置es的相关配置

cd es
vim mytest_user.yml

最基本的话就是修改sql,这个sql是针对元数据源的,意思就是从这个数据库查出来的哪些数据需要同步到es。

这两个配置完直接启动

此时canal的adapter端已经启动完毕!

adapter官网文档:https://github.com/dienh880426/canal/tree/master/client-adapter

adapter-es官方文档:https://github.com/alibaba/canal/wiki/Sync-ES

4. 结果

最后验证一波,发现只要数据库有任何的增删改,adapter适配器都会拉到binlog信息,然后ES都会自动更新相应的数据,完美!

转载于:https://my.oschina.net/u/3095034/blog/3018150

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值