天天看點

使用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      
使用canal實作MySQL 8 增量同步資料到 ElasticSearch 7.15.2中 linux

2. 修改資料

修改mysql的id=1的name的資料,将​

​陝西22面館(北京亦莊​

​​ 改為​

​gblfy陝西面館(北京亦莊)​

使用canal實作MySQL 8 增量同步資料到 ElasticSearch 7.15.2中 linux

3. 監控資料

監控canal.adapter控制台

使用canal實作MySQL 8 增量同步資料到 ElasticSearch 7.15.2中 linux

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"
}      

從上面可以看出,canal.adapter監控到了我的資料變化,并進行增量的資料的同步到ES7中。

5. 索引查詢

# 查詢shop索引
GET /shop/_search
{
  "query": {
    "match": {
      "name": "gblfy"
    }
  }
}      
使用canal實作MySQL 8 增量同步資料到 ElasticSearch 7.15.2中 linux

6. 預期性能評估

我們要求最大性能(理論上):當使用者修改id=1 中name的資料的值,其他索引的内容都不應該發生變化,僅僅對我對修改的id=1 中name的資料的值發生變化。

我們在配置canal.adapter的shop.xml中的sql時,是一個全量的sql。

SELECT
  a.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 
FROM
  shop a
  INNER JOIN category b ON a.category_id = b.id
  INNER JOIN seller c ON c.id =      
使用canal實作MySQL 8 增量同步資料到 ElasticSearch 7.15.2中 linux

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索引      
使用canal實作MySQL 8 增量同步資料到 ElasticSearch 7.15.2中 linux

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"}
    }
  }
}      
使用canal實作MySQL 8 增量同步資料到 ElasticSearch 7.15.2中 linux

2.3. 修改id=取得資料

把id=1的name值由​

​gblfy陝西面館(北京亦莊)​

​​改成​

​com.gblfy陝西面館(北京亦莊)​

使用canal實作MySQL 8 增量同步資料到 ElasticSearch 7.15.2中 linux

2.4. 檢視shop索引資料

# 查詢shop索引      
使用canal實作MySQL 8 增量同步資料到 ElasticSearch 7.15.2中 linux

從上面查詢結果來看符合預期,對吧!

2.4. 修改分類表資料

把category表中id=1中的name值​

​美食5​

​​修改成​

​美食8​

使用canal實作MySQL 8 增量同步資料到 ElasticSearch 7.15.2中 linux
說明:

2.6. 監控

使用canal實作MySQL 8 增量同步資料到 ElasticSearch 7.15.2中 linux

從截圖中可以看出也監控到了,對吧,别急!

2.7. 檢視shop索引資料

使用canal實作MySQL 8 增量同步資料到 ElasticSearch 7.15.2中 linux

從上面截圖中可以看到,資料canal.adapter 雖然監控到了,但是,es7中的資料沒更新。

2.8. 總結

2.9. 解決方案