通過Canal將雲上MySQL資料同步到華為雲ES(CSS)中

2023-01-18 18:00:21

背景:

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   // 檢視紀錄檔

 

 

 

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