Elasticsearch 系列(六)- ES數據同步和ES集群

来源:https://www.cnblogs.com/xyh9039/p/18148296
-Advertisement-
Play Games

本章將和大家分享ES的數據同步方案和ES集群相關知識。廢話不多說,下麵我們直接進入主題。 一、ES數據同步 1、數據同步問題 Elasticsearch中的酒店數據來自於mysql資料庫,因此mysql數據發生改變時,Elasticsearch也必須跟著改變,這個就是Elasticsearch與my ...


本章將和大家分享ES的數據同步方案和ES集群相關知識。廢話不多說,下麵我們直接進入主題。

一、ES數據同步

1、數據同步問題

Elasticsearch中的酒店數據來自於mysql資料庫,因此mysql數據發生改變時,Elasticsearch也必須跟著改變,這個就是Elasticsearch與mysql之間的數據同步。

在微服務中,負責酒店管理(操作mysql )的業務與負責酒店搜索(操作Elasticsearch )的業務可能在兩個不同的微服務上,數據同步該如何實現呢?

2、數據同步方案一:同步調用

3、數據同步方案二:非同步通知

4、數據同步方案三:監聽binlog

5、數據同步三種方案對比總結

方案一:同步調用

  • 優點:實現簡單,粗暴
  • 缺點:業務耦合度高

方案二:非同步通知

  • 優點:低耦合,實現難度一般
  • 缺點:依賴mq的可靠性

方案三:監聽binlog

  • 優點:完全解除服務間耦合
  • 缺點:開啟binlog增加資料庫負擔、實現複雜度高

二、ES集群

1、ES集群結構 

單機的Elasticsearch做數據存儲,必然面臨兩個問題:海量數據存儲問題、單點故障問題。

  • 海量數據存儲問題:將索引庫從邏輯上拆分為N個分片(shard),存儲到多個節點。
  • 單點故障問題:將分片數據在不同節點備份(replica )。
單點 集群

2、搭建ES集群

每個索引庫的分片數量、副本數量都是在創建索引庫時指定的,並且分片數量一旦設置以後無法修改。語法如下:

PUT /itcast
{
  "settings": {
    "number_of_shards"3// 分片數量
    "number_of_replicas"1 // 副本數量
  },
  "mappings": {
    "properties": {
      // mapping映射定義 ...
    }
  }
}

具體的ES搭建此處先不做介紹。

3、ES集群的節點角色

Elasticsearch中集群節點有不同的職責劃分:

節點類型 配置參數 預設值 節點職責
master eligible node.master true 備選主節點:主節點可以管理和記錄集群狀態、決定分片在哪個節點、處理創建和刪除索引庫的請求。
data node.data true 數據節點:存儲數據、搜索、聚合、CRUD
ingest node.ingest true 數據存儲之前的預處理
coordinating 上面3個參數都為false則為coordinating節點 協調節點:路由請求到其它節點,合併其它節點處理的結果,返回給用戶

4、ES集群的分散式查詢

Elasticsearch中的每個節點角色都有自己不同的職責,因此建議集群部署時,每個節點都有獨立的角色。

5、ES集群的腦裂

預設情況下,每個節點都是master eligible節點,因此一旦master節點宕機,其它候選節點會選舉一個成為主節點。當主節點與其他節點網路故障時,可能發生腦裂問題。

為了避免腦裂,需要要求選票超過 ( eligible節點數量 + 1 )/ 2 才能當選為主,因此eligible節點數量最好是奇數。對應配置項是discovery.zen.minimum_master_nodes,在es7.0以後,已經成為預設配置,因此一般不會發生腦裂問題。

主從結構腦裂問題示意圖:

1、正常時只有一個主節點 2、網路阻塞

3、另外兩個候選節點node2和node3重新選舉主節點 4、網路恢復,此時就出現了兩個主節點,這就是腦裂問題

6、小結1

1)master eligible節點的作用是什麼?

  • 參與集群選主
  • 主節點可以管理集群狀態、管理分片信息、處理創建和刪除索引庫的請求

2)data節點的作用是什麼?

  • 數據的CRUD

3)coordinator節點的作用是什麼?

  • 路由請求到其它節點
  • 合併查詢到的結果,返回給用戶

7、ES集群的分散式存儲

當新增文檔時,應該保存到不同分片,保證數據均衡,那麼coordinating node如何確定數據該存儲到哪個分片呢?

Elasticsearch會通過hash演算法來計算文檔應該存儲到哪個分片:

shard = hash(_routing) % number_of_shards

說明:

  • _routing預設是文檔的id
  • 演算法與分片數量有關,因此索引庫一旦創建,分片數量不能修改!

新增文檔流程:

8、ES集群的分散式查詢

Elasticsearch的查詢分成兩個階段:

  • scatter phase:分散階段,coordinating node會把請求分發到每一個分片。
  • gather phase:聚集階段,coordinating node彙總data node的搜索結果,並處理為最終結果集返回給用戶。

9、小結2

1)分散式新增如何確定分片?

  • coordinating node根據id做hash運算,得到結果對shard數量取餘,餘數就是對應的分片。

2)分散式查詢的兩個階段

  • 分散階段:coordinating node將查詢請求分發給不同分片
  • 收集階段:將查詢結果彙總到coordinating node,整理並返回給用戶

10、ES集群的故障轉移

集群的master節點會監控集群中的節點狀態,如果發現有節點宕機,會立即將宕機節點的分片數據遷移到其它節點,確保數據安全,這個叫做故障轉移。

故障轉移示意圖:

 1、正常狀態  2、主節點宕機

 3、重新選舉主節點

 4.1、數據遷移  4.2、數據遷移

故障轉移:

  • master宕機後,EligibleMaster選舉為新的主節點。
  • master節點監控分片、節點狀態,將故障節點上的分片轉移到正常節點,確保數據安全。

至此本文就全部介紹完了,如果覺得對您有所啟發請記得點個贊哦!!! 


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 1. JUnit 最佳實踐指南 原文: https://howtodoinjava.com/best-practices/unit-testing-best-practices-junit-reference-guide/ 我假設您瞭解 JUnit 的基礎知識。 如果您沒有基礎知識,請首先閱讀(已針 ...
  • 正文 下午找企業的人去鎮上做貸後。 車上聽同事跟那個司機對罵,火星子都快出來了。司機跟那同事更熟一些,連我在內一共就三個人,同事那一手指桑罵槐給我都聽愣了。司機也是老社會人了,馬上聽出來了,為那個無辜的企業經辦人辯護,實際上是為自己辯護。 “這個事情你不能怪企業。”“但他們總不能讓銀行的人全權負責, ...
  • 框架 · 使用laravel框架,原因:tp的框架路由和orm沒有laravel好用 · 使用強制路由,方便介面多時,分多版本,分文件夾等操作 介面 · 介面開發註意欄位類型,欄位是int,查詢成功失敗都要返回int(對接java等強類型語言方便) · 查詢介面用GET、其他用POST 代碼 · 所 ...
  • 優秀且經驗豐富的Java開發人員的特征之一是對API的廣泛瞭解,包括JDK和第三方庫。 我花了很多時間來學習API,尤其是在閱讀了Effective Java 3rd Edition之後 ,Joshua Bloch建議在Java 3rd Edition中使用現有的API進行開發,而不是為常見的東西編 ...
  • C++ 異常處理 C++ 異常處理機制允許程式在運行時處理錯誤或意外情況。它提供了捕獲和處理錯誤的一種結構化方式,使程式更加健壯和可靠。 異常處理的基本概念: 異常: 程式在運行時發生的錯誤或意外情況。 拋出異常: 使用 throw 關鍵字將異常傳遞給調用堆棧。 捕獲異常: 使用 try-catch ...
  • 當從不同來源導入Excel數據時,可能存在重覆的記錄。為了確保數據的準確性,通常需要刪除這些重覆的行。手動查找並刪除可能會非常耗費時間,而通過編程腳本則可以實現在短時間內處理大量數據。本文將提供一個使用C# 快速查找並刪除Excel重覆項的免費解決方案。 以下是實現步驟: 1. 首先安裝免費.NET ...
  • 經過前面幾個部分學習,相信學過的同學已經能夠掌握 .NET Emit 這種中間語言,並能使得它來編寫一些應用,以提高程式的性能。隨著 IL 指令篇的結束,本系列也已經接近尾聲,在這接近結束的最後,會提供幾個可供直接使用的示例,以供大伙分析或使用在項目中。 ...
  • 引言 在我們之前的文章中介紹過使用Bogus生成模擬測試數據,今天來講解一下功能更加強大自動生成測試數據的工具的庫"AutoFixture"。 什麼是AutoFixture? AutoFixture 是一個針對 .NET 的開源庫,旨在最大程度地減少單元測試中的“安排(Arrange)”階段,以提高 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...