Canal实现mysql主从同步
1. Canal安装
-
主库Mysql打开binlog,
-
从库要求数据库名称和表名称,表结构与主库一致
-
mysql添加用户权限,可以远程访问的用户权限
-
-
安装Canal-阿里的组件
安装在你要同步的主库的系统下
-
编辑Canal配置文件 /config/example/instance.properties 配置文件
- 打开canal /bin/startup.sh
2. SpringBoot整合Canal-客户端
-
创建一个模块canal-client
-
引入依赖
<dependency> <groupId>com.alibaba.otter</groupId> <artifactId>canal.client</artifactId> <version>1.1.5</version> </dependency> <!--jdbc,mysql,mybatis的依赖也要导入-->
-
配置application文件
-
服务端口
-
服务名
-
环境设置 spring.profiles.active=dev //dev,text,prod
-
mysql数据库连接
-
-
创建canal客户端类,在启动类执行
- canal客户端类,固定,直接复制即可
-
主启动类实现CommandLineRunner接口,实现run方法
-
注入canal客户端类
-
在实现的run方法中启动
@Autowired private CanalClient canalClient; public void run (...)...{ //启动项目,执行canal客户端监听 canalClient.run(); }
-
-
开启服务,主库新增修改数据, 查看从库是否改变
mysql同步到ES,
**同步到不是mysql的需要使用适配器canal.adapter**
—注意服务端还是要的canal.deployer
地址: https://github.com/alibaba/canal/releases,下载源码使用即可,或者下载压缩包,在linux中使用
-
准备一个数据库
-
准备一个es,创建映射
-
修改adapter的配置文件 - canal-adapter/conf/application.yml
canal.conf: mode: tcp canalServerHost: 192.168.35.254:11111 batchSize: 500 syncBatchSize: 1000 retries: 0 timeout: accessKey: secretKey: srcDataSources: defaultDS: url: jdbc:mysql://192.168.34.66:3306/canal_tsdb?useUnicode=true username: canal password: canal canalAdapters: - instance: example groups: - groupId: g1 outerAdapters: - name: logger - name: es hosts: es启动的ip地址:9300 properties: cluster.name: elasticsearch
-
修改adapter配置文件canal-adapter/conf/test1.yml
dataSourceKey: defaultDS destination: example groupId: g1 esMapping: _index: test1 _type: _doc _id: _id upsert: true sql: "select a.id as _id,a.name,a.address from canal_tets a" commitBatch: 3000
注意:
-
两个配置文件的groupid应该是一致的
-
es同步关键在于Sql语句, 他能把表上的字段映射到es中的mapping中