日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 运维知识 > 数据库 >内容正文

数据库

使用canal实现MySQL 8 增量同步数据到 ElasticSearch 7.15.2中 linux

發布時間:2024/9/27 数据库 27 豆豆
生活随笔 收集整理的這篇文章主要介紹了 使用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.log

2. 修改數據

修改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。

SELECTa.id,a.NAME,a.tags,CONCAT( a.latitude, ',', a.longitude ) AS location,a.remark_score,a.price_per_man,a.category_id,b.`name` AS category_name,a.seller_id,c.remark_score AS seller_remark_score,c.disabled_flag AS seller_disabled_flag FROMshop aINNER JOIN category b ON a.category_id = b.idINNER JOIN seller c ON c.id = a.seller_id

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 /shop

2.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的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。