Canal大做战

- 前言mysql

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

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

- 简介github

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

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

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

- 原理vim

1. mysql主备原理windows

官网的原理图:bash

从图中咱们能够看出:

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都会自动更新相应的数据,完美!

相关文章
相关标签/搜索