通过Canal将云上MySQL数据同步到华为云ES(CSS)中

时间:2023-01-18 18:09:45

背景:

A部门想将mysql中多张表join成一个sql查询语句,然后将结果同步到es*搜索使用

环境信息:

源端mysql在阿里云上,有公网ip

目标端es在华为云上,三节点

操作步骤与目的:

配置MySQL供canal访问

1.由于阿里云的rds一般都配置了白名单,因此需要将后续canal所在的ecs的公网ip填入rds的白名单之中

注意外网对应阿里云的经典网络.在专有网络中设置并没有效果

2.确认已开启binlog并是row格式,一般不需要再做修改

 

安装canal-server端,用于获取mysql的binlog日志

1.在华为云上开通一台ecs,注意要与阿里云的公网ip相通,且与华为云es相通

2.ecs开启后,进行canal-server的安装.其原理是模拟成为mysql的slave备机,从而拿到binlog日志,可供后续使用

2.1.先安装java环境 

yum install java-1.8.0-openjdk

2.2.安装canal-server,建议使用官方镜像,这里使用的是1,1.5版本,注意并不是最新版本

docker pull canal/canal-server:v1.1.5
docker run --name canal115 -p 11111:11111  --link mysql5736:mysql5736 -id canal/canal-server:v1.1.5

如果docker服务异常,则建议初始化docker服务

/bin/systemctl start docker.service
systemctl status docker.service
cp /lib/systemd/system/docker.service    /etc/systemd/system/docker.service
systemctl daemon-reload
systemctl start docker

如果docker拉取速度感人,可以修改其配置源

1 mkdir -p /etc/docker
2 vi /etc/docker/daemon.json
3 {
4   "registry-mirrors": ["https://yxzrazem.mirror.aliyuncs.com"]
5 }
6 sudo systemctl daemon-reload
7 sudo systemctl restart docker

2.3.进入docker并配置canal-server

 1 docker exec -it canal115 /bin/bash
 2 cd canal-server/conf/example/
 3 vi instance.properties  // 修改涉及到的配置 xx调整为对应数据
 4 
 5 # 修改成mysql对应的账号密码,需要保证网络连通,账号密码正确
 6 canal.instance.master.address=10.208.xx.xx:3306
 7 canal.instance.dbUsername=xx
 8 canal.instance.dbPassword=xx
 9 # 需要同步的表名称,一般是schema名.*
10 canal.instance.filter.regex=xx.*
11 # 不需要同步的表名称,不需改动
12 canal.instance.filter.black.regex=mysql\\.slave_.*

2.4 开启canal-server服务

1 docker restart  canal115
2  
3 docker exec -it canal115 /bin/bash
4 tail -100f /home/admin/canal-server/logs/example/example.log   // 查看日志

 通过Canal将云上MySQL数据同步到华为云ES(CSS)中

 

 

 出现the next step is binlog dump说明配置正常.

 

安装canal-adapter,用于数据同步到es

1.下载canal-adapter

wget https://github.com/alibaba/canal/releases/download/canal-1.1.5/canal.adapter-1.1.5.tar.gz

2.解压安装

mkdir adapter-1.1.5
mv canal.adapter-1.1.5.tar.gz adapter-1.1.5
cd adapter-1.1.5
tar zxvf canal.adapter-1.1.5.tar.gz

3.配置application.yml 用于保存源端与目标端基本信息

adapter-1.1.5/conf/application.yml  // 修改涉及到的配置 xx调整为对应数据

    # canal tcp consumer 这里配置canal-server所在的docker的ip
    canal.tcp.server.host: 172.30.x.x:11111

#配置源端信息
srcDataSources: 
    defaultDS:
      url: jdbc:mysql://10.208.xx.xx:3306/xx?useUnicode=true
      username: xx
      password: xx


#配置目标端信息
  canalAdapters:
  - instance: example  #无需改动
    groups:
    - groupId: g1 #无需改动
      outerAdapters:
      - name: logger
      - name: es7  #按目标端es版本设置,有es6和es7
        hosts: http://10.208.128.3:9200 #源端的内网访问地址,任一即可
        properties:
          mode: rest #无需改动
          cluster.name: xx #集群名称
          security.auth: xx:xx  #集群用户名密码

4.设置yml文件,用于保存需要同步的sql语句,注意sql语句有限制

详见:https://github.com/alibaba/canal/wiki/Sync-ES

觉得太长的话,概括如下:

1.只能用左连接left join

2.总表数不能超过3个,也就是可以left join 2张表

3.on条件的字段,必须至少有一个出现在select语句中 

如果是全量.则可以在源端生成视图进行同步

但是增量不支持视图,因为关联不上.只能用left join语句

vi /soft/adapter-1.1.5/conf/es7/xx.yml 
dataSourceKey: defaultDS destination: example groupId: g1 esMapping: _index: index_xx #对应es的索引名称 _id: _id sql:
"select _id,col2,col3 from xx" #sql语句 commitBatch: 3000

5.在es生成好索引

#删除索引
delete /index_xx
#建索引语句,对col3进行分词处理
PUT /index_xx
 {
       "settings": {
        "analysis": {
            "filter": {
                "my_synonym": {
                    "type": "dynamic_synonym"
                }
            },
            "analyzer": {
                "ik_synonym": { 
                    "filter": [
                        "my_synonym"
                    ],
                    "type": "custom",
                    "tokenizer": "ik_smart" 
                }
            }
        }
    },
    "mappings" : {
      "properties" : {
        "col2" : {
          "type" : "text"
        },
        "col3" : {
          "type": "text",
          "analyzer": "ik_smart",
          "search_analyzer": "ik_synonym"
        }
      }
    }
  }
}

6.启动服务开始同步

启动adapter
/soft/adapter-1.1.5/bin/startup.sh 
查看日志
tail -100f  /soft/adapter-1.1.5/logs/adapter/adapter.log
停止进程
/soft/adapter-1.1.5/bin/stop.sh 
查看adapter配置情况
more /soft/adapter-1.1.5/conf/application.yml 
查看同步表(视图)配置情况
more /soft/adapter-1.1.5/conf/es7/xx.yml 
全量同步
curl  http://10.208.128.229:8081/etl/es7/xx.yml  -X POST

 

会遇到的一些报错

1.日志提示

java.lang.ClassCastException: com.alibaba.druid.pool.DruidDataSource cannot be cast to com.alibaba.druid.pool.DruidDataSource

替换jar包

下载v1.1.5-alpha-2 版本下的client-adapter.es7x-1.1.5-SNAPSHOT-jar-with-dependencies.jar 替换原client-adapter.es7x-1.1.5-jar-with-dependencies.jar