使用canal实现MySQL 8 增量同步数据到 ElasticSearch 7.15.2中 linux
文章目錄
- 一、清空控制臺
- 1. 清空控制臺
- 2. 修改數據
- 3. 監控數據
- 4. 數據變化
- 5. 索引查詢
- 6. 預期性能評估
- 7. 增量同步分析
- 二、驗證方案
- 2.1. 把shop索引刪除
- 2.2. 重建shop索引
- 2.3. 修改id=取得數據
- 2.4. 查看shop索引數據
- 2.4. 修改分類表數據
- 2.6. 監控
- 2.7. 查看shop索引數據
- 2.8. 總結
- 2.9. 解決方案
一、清空控制臺
1. 清空控制臺
清空canal.adapter控制臺
cd /app/canal/canal.adapter tail -f logs/adapter/adapter.log2. 修改數據
修改mysql的id=1的name的數據,將陜西22面館(北京亦莊
改為gblfy陜西面館(北京亦莊)
3. 監控數據
監控canal.adapter控制臺
4. 數據變化
{"data": [{"id": 1,"created_at": 1637308432000,"updated_at": 1640159632000,"name": "gblfy陜西面館(北京亦莊)","remark_score": 4.9,"price_per_man": 156,"latitude": 31.195341,"longitude": 120.915855,"category_id": 1,"tags": "新開業 人氣爆棚","start_time": "10:00","end_time": "22:00","address": "船廠路36號","seller_id": 1,"icon_url": "/static/image/shopcover/xchg.jpg"}],"database": "dianpingdb","destination": "example","es": 1637644424000,"groupId": "g1","isDdl": false,"old": [{"name": "陜西22面館(北京亦莊)"}],"pkNames": ["id"],"sql": "","table": "shop","ts": 1637644425043,"type": "UPDATE" } Affected indexes: shop從上面可以看出,canal.adapter監控到了我的數據變化,并進行增量的數據的同步到ES7中。
5. 索引查詢
# 查詢shop索引 GET /shop/_search {"query": {"match": {"name": "gblfy"}} }6. 預期性能評估
我們要求最大性能(理論上):當用戶修改id=1 中name的數據的值,其他索引的內容都不應該發生變化,僅僅對我對修改的id=1 中name的數據的值發生變化。
我們在配置canal.adapter的shop.xml中的sql時,是一個全量的sql。
7. 增量同步分析
sql中沒有指定具體要求的數據的id,那canal.adapter怎么監控到我數據發生變化后,只同步我修改ID=1的這條數據呢?
-
二種解釋:
-
第一種:
canal.adapter內部做了一個這樣的機制;
當我修改ID=1的數據時,canal.adapter通過全量sql就可以把id=1的數據篩選出來,然后進行增量同步到es7的索引中。 -
第二種:
canal.adapter 內部武這樣監控的機制,只要數據發生變化,就執行全量sql,做全量同步,只不過已經存在而索引讓es7做更新操作而已。
二、驗證方案
2.1. 把shop索引刪除
# 刪除shop索引 DELETE /shop2.2. 重建shop索引
PUT /shop {"settings": {"number_of_shards": 1,"number_of_replicas": 1}, "mappings": {"properties": {"id":{"type": "integer"},"name":{"type": "text","analyzer": "ik_max_word","search_analyzer": "ik_smart"},"tags":{"type": "text","analyzer": "whitespace","fielddata": true},"location":{"type": "geo_point"},"remark_score":{"type": "double"},"price_per_man":{"type": "integer"},"category_id":{"type": "integer"},"category_name":{"type": "keyword"},"seller_id":{"type": "integer"},"seller_remark_score":{"type": "double"},"seller_disabled_flag":{"type": "integer"}}} }2.3. 修改id=取得數據
把id=1的name值由gblfy陜西面館(北京亦莊)改成com.gblfy陜西面館(北京亦莊)
2.4. 查看shop索引數據
# 查詢shop索引 GET /shop/_search
從上面查詢結果來看符合預期,對吧!
2.4. 修改分類表數據
把category表中id=1中的name值美食5修改成美食8
說明:
2.6. 監控
從截圖中可以看出也監控到了,對吧,別急!
2.7. 查看shop索引數據
從上面截圖中可以看到,數據canal.adapter 雖然監控到了,但是,es7中的數據沒更新。
2.8. 總結
官網自帶的canal.adapter 組件
canal.adapter 對單表增量同步,是支持的
一對一形式:mysql的一張表對應es的一個index
canal.adapter 對聚合sql(也就是多表查詢),不支持
2.9. 解決方案
我們可以通過代碼方式,可以自定義我們對于canal.adapter 的行為的能力。使用canal.deployer建立和mysql數據binlog之間的能力,摒棄掉canal.adapter,在點評搜索的應用當中,直接接入canal.deployer,以canal.deployer消費端的身份去消費我們對應的消息。
總結
以上是生活随笔為你收集整理的使用canal实现MySQL 8 增量同步数据到 ElasticSearch 7.15.2中 linux的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 解决jodconverter 2.2.1
- 下一篇: 数组正遍历,数组倒遍历