2

通过Canal将云上MySQL数据同步到华为云ES(CSS)中 - 洛丹伦的雪

 1 year ago
source link: https://www.cnblogs.com/castlevania/p/17060161.html
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.
neoserver,ios ssh client

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   // 查看日志

 454732-20230118163404808-863863557.png

 出现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


About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK