如何保證 Mysql 數據庫到 ES 的數據一致性

1. 業務場景介紹

1.1 需求分析

某知名的在線旅遊平臺,在即將到來的春季促銷活動之前,決定推出一項新的功能:用戶可以通過輸入目的地、酒店名稱、房型、價格範圍等屬性來搜索旅遊優惠酒店。爲了及時上線這一功能,運營團隊需要將現有的酒店數據同步到高效的搜索引擎中,以支持用戶的高頻搜索需求。

1.2 技術實現方案

假設底層使用 MySQL 數據庫存儲酒店數據,以下是實現該需求的技術方案:

通過將數據從 MySQL 實時同步到 Elasticsearch,並優化查詢性能,我們可以實現一個快速、準確的酒店搜索功能,滿足春季促銷期間的高併發搜索需求。

思考: 如何保證 Mysql 數據庫和 ES 的數據一致性?

2. 業界常用數據一致性方案分析

在確保 My 數據庫和 Elasticsearch(ES)數據一致性方面,業界有幾種常見的方案:

  1. 同步雙寫方案

在代碼中對數據庫和 ES 進行雙寫操作,確保先更新數據庫後更新 ES。如果數據庫更新成功而 ES 更新失敗,可以通過事務回滾來保證一致性。這種方案簡單易實現,但可能存在性能瓶頸和不一致的風險。 

  1. MQ 異步雙寫方案

使用消息隊列(如 RocketMQ、Kafka 等)作爲中間件,應用程序在更新數據庫後發送消息到 MQ,由 MQ 的消費者異步更新 ES。這種方案可以解耦數據庫和 ES,提高性能,但可能存在消息延遲和系統複雜度增加的問題。 

  1. 掃表定時同步方案

通過定時任務定期掃描數據庫,將變更的數據同步到 ES。這種方案的實時性較差,但可以減少對數據庫的即時壓力。 

  1. 監聽 binlog 同步方案

通過直接監聽 MySQL 的 binlog 來實現數據庫和 ES 之間的實時同步。這種方案對業務代碼沒有侵入性,可以實現數據庫和 ES 的實時同步,但需要額外的框架和可能存在一定的延遲。 

2.1 同步雙寫方案

實現思路

在數據寫入 MySQL 的同時,直接將相同的數據寫入 ES。

優缺點對比

優點

  1. 數據一致性:雙寫策略可以保證在 MySQL 和 Elasticsearch 之間數據的強一致性,因爲每次數據庫的變更都會在 Elasticsearch 中同步反映。

  2. 實時性:雙寫策略可以實現數據的實時同步,用戶在 MySQL 中進行的任何操作都會立即在 Elasticsearch 中體現。

  3. 易於實現:從技術角度來說,雙寫策略的實現相對簡單,通常只需要在應用程序代碼中添加額外的寫入邏輯。

缺點

  1. 代碼複雜性:需要在應用程序中增加額外的代碼來處理數據的雙寫,這會增加代碼的複雜性和維護難度。

  2. 性能開銷:每次數據庫操作都需要執行兩次,這會導致額外的性能開銷,尤其是在高併發的場景下。

  3. 數據不一致風險

    :在雙寫過程中,如果發生系統故障或網絡延遲,可能會出現數據不一致的情況,尤其是在寫入 MySQL 成功但寫入 ES 失敗時。

應用場景

系統特點: 舊系統年限長、單體架構且技術比較落後, 如果引入除 es 之外的其他中間件治理成本很高,可以考慮這個方案。

業務場景: 用戶量少、偏後臺管理類的系統,對數據同步的實時性要求很高, 接近實時。

2.2 MQ 異步雙寫方案

實現思路

使用消息隊列(如 RocketMQ、Kafka 等)作爲中間件,應用程序在更新數據庫後發送消息到 MQ,由 MQ 的消費者異步更新 ES。

方案核心

優缺點對比

優點

缺點

應用場景

系統特點:

業務場景:

2.3  掃表定期同步方案

實現思路

通過定時任務定期掃描數據庫,將變更的數據同步到 ES。

優缺點對比

優點

  1. 實現簡單:使用定時任務調度框架,不需要複雜的開發工作。

  2. 適合批量數據:對於大量數據的遷移,批量處理可以減少網絡傳輸次數和 ES 的寫入壓力。

  3. 對業務影響小:定時任務可以在系統負載較低的時段運行,對在線業務影響較小。

缺點

  1. 實時性差:由於是定期執行,數據同步存在延遲,不適合對實時性要求高的應用。

  2. 性能影響:同步過程中可能會對 MySQL 和 ES 的性能產生短期影響,尤其是在數據量大時。

  3. 數據一致性:如果在同步週期內數據發生變化,可能會導致 ES 中數據與 MySQL 不一致。

應用場景

系統特點: 舊系統年限長、技術框架老舊,引入其他的中間件成本很高。

業務場景: 用戶體量小、偏報表統計類業務、對數據實時性要求不高。

2.4 監聽 binlog 同步方案

實現思路

通過直接監聽 MySQL 的 binlog 來實現數據庫和 ES 之間的實時同步。

在高併發場景下,直接將 binlog 事件推送到 ES 可能會導致 ES 負載過高。Kafka 可以作爲緩衝層,暫時存儲 binlog 事件,平滑數據流,避免瞬時的高負載。

優缺點對比

優點

缺點

應用場景

系統特點: c 端系統,開放 mysql binlog 日誌監聽,引入第三方 canal 中間件成本不高。

業務場景: 互聯網公司,用戶體量大、大型多中心組織、高併發場景,業務上允許有一定的延遲 (秒級)。

本文由 Readfog 進行 AMP 轉碼,版權歸原作者所有。
來源https://mp.weixin.qq.com/s/OglpvJb2Aejf93OSrGPX0Q