A部門想將mysql中多張表join成一個sql查詢語句,然後將結果同步到es中供搜尋使用
源端mysql在阿里雲上,有公網ip
目標端es在華為雲上,三節點
1.由於阿里雲的rds一般都設定了白名單,因此需要將後續canal所在的ecs的公網ip填入rds的白名單之中
注意外網對應阿里雲的經典網路.在專有網路中設定並沒有效果
2.確認已開啟binlog並是row格式,一般不需要再做修改
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說明設定正常.
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