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
  • C#TMS系統代碼-基礎頁面BaseCity學習 本人純新手,剛進公司跟領導報道,我說我是java全棧,他問我會不會C#,我說大學學過,他說這個TMS系統就給你來管了。外包已經把代碼給我了,這幾天先把增刪改查的代碼背一下,說不定後面就要趕鴨子上架了 Service頁面 //using => impo ...
  • 委托與事件 委托 委托的定義 委托是C#中的一種類型,用於存儲對方法的引用。它允許將方法作為參數傳遞給其他方法,實現回調、事件處理和動態調用等功能。通俗來講,就是委托包含方法的記憶體地址,方法匹配與委托相同的簽名,因此通過使用正確的參數類型來調用方法。 委托的特性 引用方法:委托允許存儲對方法的引用, ...
  • 前言 這幾天閑來沒事看看ABP vNext的文檔和源碼,關於關於依賴註入(屬性註入)這塊兒產生了興趣。 我們都知道。Volo.ABP 依賴註入容器使用了第三方組件Autofac實現的。有三種註入方式,構造函數註入和方法註入和屬性註入。 ABP的屬性註入原則參考如下: 這時候我就開始疑惑了,因為我知道 ...
  • C#TMS系統代碼-業務頁面ShippingNotice學習 學一個業務頁面,ok,領導開完會就被裁掉了,很突然啊,他收拾東西的時候我還以為他要旅游提前請假了,還在尋思為什麼回家連自己買的幾箱飲料都要叫跑腿帶走,怕被偷嗎?還好我在他開會之前拿了兩瓶芬達 感覺感覺前面的BaseCity差不太多,這邊的 ...
  • 概述:在C#中,通過`Expression`類、`AndAlso`和`OrElse`方法可組合兩個`Expression<Func<T, bool>>`,實現多條件動態查詢。通過創建表達式樹,可輕鬆構建複雜的查詢條件。 在C#中,可以使用AndAlso和OrElse方法組合兩個Expression< ...
  • 閑來無聊在我的Biwen.QuickApi中實現一下極簡的事件匯流排,其實代碼還是蠻簡單的,對於初學者可能有些幫助 就貼出來,有什麼不足的地方也歡迎板磚交流~ 首先定義一個事件約定的空介面 public interface IEvent{} 然後定義事件訂閱者介面 public interface I ...
  • 1. 案例 成某三甲醫預約系統, 該項目在2024年初進行上線測試,在正常運行了兩天後,業務系統報錯:The connection pool has been exhausted, either raise MaxPoolSize (currently 800) or Timeout (curren ...
  • 背景 我們有些工具在 Web 版中已經有了很好的實踐,而在 WPF 中重新開發也是一種費時費力的操作,那麼直接集成則是最省事省力的方法了。 思路解釋 為什麼要使用 WPF?莫問為什麼,老 C# 開發的堅持,另外因為 Windows 上已經裝了 Webview2/edge 整體打包比 electron ...
  • EDP是一套集組織架構,許可權框架【功能許可權,操作許可權,數據訪問許可權,WebApi許可權】,自動化日誌,動態Interface,WebApi管理等基礎功能於一體的,基於.net的企業應用開發框架。通過友好的編碼方式實現數據行、列許可權的管控。 ...
  • .Net8.0 Blazor Hybird 桌面端 (WPF/Winform) 實測可以完整運行在 win7sp1/win10/win11. 如果用其他工具打包,還可以運行在mac/linux下, 傳送門BlazorHybrid 發佈為無依賴包方式 安裝 WebView2Runtime 1.57 M ...