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