1.对mysql的配置
需要一个mysql作为主库,它需要开启binlog,开启binlog需要修改配置文件my.cnf
mysql安装就不多说了,我的mysql是5.7 ,装在docker中
我的mysql配置文件在容器中/etc/my.cnf
开启binlog需要修改my.cnf
即添加
log-bin=mysql-bin # 开启 binlog
binlog-format=ROW # 选择 ROW 模式
server_id=111 # 配置 MySQL replaction 需要定义,不要和 canal 的 slaveId 重复
查看binlog是否开启成功
show variables like '%log_bin%';
ON是成功,OFF是没成功
创建了个mysql的canal用户比用root安全点,也可直接用root
CREATE USER canal IDENTIFIED BY 'canal';
GRANT SELECT, REPLICATION SLAVE, REPLICATION CLIENT ON *.* TO 'canal'@'%';
-- GRANT ALL PRIVILEGES ON *.* TO 'canal'@'%' ;
FLUSH PRIVILEGES;
2. canal的配置
canal-server 是提供服务的
// docker pull canal/canal-server:v1.1.5
# 下载脚本
wget https://raw.githubusercontent.com/alibaba/canal/master/docker/run.sh
# 构建一个destination name为test的队列
sh run.sh -e canal.auto.scan=false \
-e canal.destinations=test \
-e canal.instance.master.address=127.0.0.1:3306 \
-e canal.instance.dbUsername=canal \
-e canal.instance.dbPassword=canal \
-e canal.instance.connectionCharset=UTF-8 \
-e canal.instance.tsdb.enable=true \
-e canal.instance.gtidon=false \
canal-admin是为canal-server提供管理web界面的
//docker pull canal/canal-admin:v1.1.5
# 下载脚本
wget https://raw.githubusercontent.com/alibaba/canal/master/docker/run_admin.sh
# 以8089端口启动canal-admin
//sh run_admin.sh -e server.port=8089 \
// -e canal.adminUser=admin \
// -e canal.adminPasswd=admin
# 指定外部的mysql作为admin的库 我是用这个命令启动的需要在将sql导入自己的数据库
sql位置:canal/admin/admin-web/src/main/resources/canal_manager.sql at master · alibaba/canal · GitHub
sh run_admin.sh -e server.port=8089 \
-e spring.datasource.address=xxx \
-e spring.datasource.database=xx \
-e spring.datasource.username=xx
-e spring.datasource.password=xx
3.sprintboot的配置
pom.xml主要添加了
<dependency><groupId>top.javatool</groupId><artifactId>canal-spring-boot-starter</artifactId><version>1.2.1-RELEASE</version> </dependency>
之后就缺啥自动导入了
application.yml的配置
canal:server: 192.168.96.63:11111destination: testuser-name: canalpassword: canal
创建一个 Handler 实现 EntryHandler 当然实体类得建,mysql中建表
import cn.powertime.ps.entity.Document; import cn.powertime.ps.service.IDocumentService; import org.springframework.stereotype.Component; import top.javatool.canal.client.annotation.CanalTable; import top.javatool.canal.client.handler.EntryHandler;import javax.annotation.Resource;@CanalTable("document") @Component public class DocumentHandler implements EntryHandler<Document> {@Resourceprivate IDocumentService documentService;/*** mysql中数据有新增时自动执行* @param document 新增的数据*/public void insert(Document document) {try {documentService.addData(document);} catch (Exception e) {e.printStackTrace();}}/*** mysql中数据有修改时自动执行* @param before 修改前的数据* @param after 修改后的数据*/public void update(Document before, Document after) {documentService.updateData(after);}/*** mysql中数据有删除时自动执行* @param document 要删除的数据*/public void delete(Document document) {documentService.deleteData(document);} }
在以上方法中可以监听到mysql的增删改,同时操作一下ES,就玩事了。
做完了,简单记录下,写的有点糙。。。
可以参照
https://github.com/alibaba/canal/wiki