- 前言
之前我是通过实时的查库,然后再将数据实时地更新或者新增到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都会自动更新相应的数据,完美!