1. 程式人生 > >Elasticsearch6.2基本概念及核心配置檔案詳解

Elasticsearch6.2基本概念及核心配置檔案詳解

以下內容,都摘自官網6.2 版本文件,有些屬性名字和以前都不一樣,如果沒有找到對應的屬性,請閱讀官方文件進行查詢:
官網:https://www.elastic.co/guide/en/elasticsearch/reference/current/_basic_concepts.html
基本概念
近實時(Near Realtime[NRT])
Elasticsearch是一個接近實時的搜尋平臺。這意味著從索引文件的時間到可搜尋的時間之間存在輕微的延遲(通常為一秒)。

叢集(Cluster)

叢集是一個或多個節點(伺服器)的集合,它們一起儲存整個資料,並提供跨所有節點的聯合索引和搜尋功能。叢集由預設名稱為“elasticsearch”的唯一名稱標識。此名稱很重要,因為如果節點設定為通過名稱加入群集,則節點只能成為群集的一部分。

確保不要在不同的環境中重複使用相同的群集名稱,否則可能會導致節點加入錯誤的群集。例如,您可以使用logging-dev,logging-stage以及logging-prod 開發,分段和生產叢集。

請注意,有一個只有一個節點的叢集是完全正確的。此外,您還可能擁有多個獨立的叢集,每個叢集都有自己的唯一叢集名稱。

節點(Node)

節點是屬於叢集一部分的單個伺服器,儲存資料並參與叢集的索引和搜尋功能。就像一個叢集一樣,一個節點由一個名稱來標識,預設情況下該名稱是在啟動時分配給節點的隨機通用唯一識別符號(UUID)。如果您不需要預設值,您可以定義任何您想要的節點名稱。此名稱對於管理目的非常重要,您需要確定網路中的哪些伺服器與Elasticsearch群集中的哪些節點相對應。

可以將節點配置為按叢集名稱加入特定叢集。預設情況下,每個節點都設定為加入一個名為的群集elasticsearch,這意味著如果啟動網路中的多個節點並假設它們可以互相發現,它們將自動形成並加入一個名為的群集elasticsearch。

在單個群集中,您可以擁有任意數量的節點。此外,如果網路上當前沒有其他Elasticsearch節點正在執行,則預設情況下啟動單個節點將形成名為的新單節點群集elasticsearch。

索引(Index)

索引是一些具有相似特徵的文件集合。例如,您可以擁有客戶資料的索引,產品目錄的索引以及訂單資料的索引。索引由名稱(必須全部為小寫)標識,並且此名稱用於在對其中的文件執行索引,搜尋,更新和刪除操作時引用索引。

在單個群集中,您可以根據需要定義多個索引。

型別(Type)
警告

在6.0.0中已棄用。

一個型別是你的索引中的一個分類或者說是一個分割槽,它可以讓你在同一索引中儲存不同型別的文件,例如,為使用者建一個型別,為部落格文章建另一個型別。現在已不可能在同一個索引中建立多個型別,並且整個型別的概念將會在未來的版本中移除,請參閱移除對映型別

文件(Document)

文件是可被索引的基本單元。例如,您可以為單個客戶提供文件,為單個產品提供一個文件,為單個訂單提供另一個文件。本文件以JSON(JavaScript Object Notation)表示,它是一種無處不在的網際網路資料交換格式。

在索引/型別中,您可以根據需要儲存任意數量的文件。請注意,儘管文件實際上駐留在索引中,但實際上文件必須被索引/分配給索引內的型別。

分片和複製(Shards&Replicas)
我們在一個索引裡儲存的資料,潛在的情況下可能會超過單節點硬體的儲存限制。例如,單個索引有上千萬個文件需要佔用1TB的硬碟儲存空間,但是一臺機器的硬碟可能沒有這麼大,或者是即便有這麼大,但是單個節點在提供搜尋服務時會響應緩慢。

為了解決這個問題,Elasticsearch提供了分片的能力,它可以將你的索引細分成多個部分。當你建立一個索引的時候,你可以簡單的定義你想要的分片的數量。每個分片本身是一個全功能的完全獨立的“索引”,它可以部署在叢集中的任何節點上。

分片很重要,主要有兩個原因:
允許你水平分割/擴充套件你的內容容量
允許你在分片(位於多個節點上)之上進行分散式的、並行的操作,進而提高效能/吞吐量 

至於一個分片怎樣分佈,它的文件怎樣聚合回搜尋請求,是完全由Elasticsearch管理的,對於作為使用者的你來說,這些都是透明的。

在一個網路/雲的環境裡,故障隨時都可能發生。在某個分片/節點因為某些原因處於離線狀態或者消失的情況下,故障轉移機制是非常有用且強烈推薦的。為此, Elasticsearch允許你建立分片的一份或多份拷貝,這些拷貝叫做複製分片,或者直接叫複製。

複製很重要,主要有兩個原因:
高可用。它提供了高可用來以防分片或節點宕機。為此,一個非常重要的注意點是絕對不要將一個分片的拷貝放在跟這個分片相同的機器上。

高併發。它允許你的分片可以提供超出自身吞吐量的搜尋服務,搜尋行為可以在分片所有的拷貝中並行執行。

總而言之,每個索引可以分成多個分片。索引也可以被複製為零(意味著沒有副本)或更多次。一旦複製,每個索引將具有主分片(從中複製的原始分片)和副本分片(主分片的副本)。在建立索引時,可以為每個索引定義分片和副本的數量。在建立索引之後,您可以隨時更改動態副本的數量,但您無法在事後更改碎片的數量。

預設情況下,Elasticsearch中的每個索引都分配了5個主分片和1個副本,這意味著如果您的叢集中至少有兩個節點,則索引將包含5個主分片和另外5個副本分片(1個完整副本),總共每個索引10個碎片。

elasticsearch.yml

################################### Cluster ################################### 
# 代表一個叢集,叢集中有多個節點,其中有一個為主節點,這個主節點是可以通過選舉產生的,主從節點是對於叢集內部來說的. 
# es的一個概念就是去中心化,字面上理解就是無中心節點,這是對於叢集外部來說的,因為從外部來看es叢集,在邏輯上是個整體,你與任何一個節點的通訊和與整個es叢集通訊是等價的。 
# cluster.name可以確定你的叢集名稱,當你的elasticsearch叢集在同一個網段中elasticsearch會自動的找到具有相同cluster.name的elasticsearch服務. 
# 所以當同一個網段具有多個elasticsearch叢集時cluster.name就成為同一個叢集的標識. 
# cluster.name: es6.2 

#################################### Node ##################################### 
# 節點名稱同理,可自動生成也可手動配置. 
# node.name: node-1

# 允許一個節點是否可以成為一個master節點,es是預設叢集中的第一臺機器為master,如果這臺機器停止就會重新選舉master. 任何主節點的節點(預設情況下所有節點)都可以被主選舉過程選為主節點。
# node.master: true 

# 允許該節點儲存資料(預設開啟) 
# node.data: true 
# 注意:主節點必須有權訪問該data/目錄(就像data節點一樣 ),因為這是叢集狀態在節點重新啟動之間持續存在的位置。

# 允許該節點為攝取節點(預設開啟) 
# node.ingest:true
# 配置為true將主節點和資料節點標記為“是有意義的”

# 開啟跨群集搜尋(預設啟用)
# search.remote.connect:true

# 配置檔案中給出了三種配置高效能叢集拓撲結構的模式,如下: 
# 1. 如果你想讓節點從不選舉為主節點,只用來儲存資料,可作為資料節點 
# node.master: true 
# node.data: false
# node.ingest: true

# 2. 如果想讓節點成為主節點,且不儲存任何資料,並保有空閒資源,可作為協調器 
# node.master:true 
# node.data:false 
# node.ingest:false 

# 3. 如果想讓節點既不稱為主節點,又不成為資料節點,那麼可將他作為攝取節點,從節點中獲取資料,生成搜尋結果等 
# node.master: false 
# node.data: false 
# node.ingest: true

# 4. 僅作為協調器 
# node.master: false 
# node.data: false
# node.ingest: false

#################################### Paths #################################### 
# 資料儲存位置(單個目錄設定) 
# path.data: /var/data/elasticsearch
#path.data應將該設定配置為在Elasticsearch主目錄之外定位資料目錄,以便在不刪除資料的情況下刪除主目錄!

# 日誌檔案的路徑 
# path.logs: /var/log/elasticsearch 

#################################### 網路設定 #################################### 
# 節點將繫結到此主機名或IP地址
# network.host: 127.0.0.1

# 繫結到傳入HTTP請求的埠
# http.port: 9200 
# 接受單個值或範圍。如果指定了範圍,則節點將繫結到範圍中的第一個可用埠。預設為9200-9300

#################################### TCP傳輸 #################################### 
# 埠繫結節點之間的通訊。
# transport.tcp.port: 9300
# 接受單個值或範圍。如果指定了範圍,則節點將繫結到範圍中的第一個可用埠。預設為9300-9400

# transport.publish_port: 9300
# 與此節點通訊時,群集中其他節點應使用的埠。當群集節點位於代理或防火牆之後並且transport.tcp.port不能從外部直接定址時很有用。預設為通過分配的實際埠 transport.tcp.port

# transport.bind_host: 127.0.0.1
# 將傳輸服務繫結到的主機地址。預設為transport.host(如果設定)或network.bind_host

# transport.publish_host: 127.0.0.1 
# 釋出叢集中要連線到的節點的主機地址。預設為transport.host(如果設定)或network.publish_host

# transport.host: 127.0.0.1 
# 用於設定transport.bind_host和transport.publish_host預設為transport.host或network.host

# transport.tcp.connect_timeout: 30s
# 套接字連線超時設定(以時間設定格式)。預設為30s

# transport.tcp.compress: false
# 設定是否壓縮tcp傳輸時的資料,預設為false,不壓縮。

# transport.ping_schedule: 5s
# 安排常規ping訊息以確保連線保持活動狀態。預設為5s在傳輸客戶端和-1(禁用)

#################################### 高階網路設定 #################################### 
#該network.host設定中的說明通常使用的網路設定 是快捷方式設定所述繫結的主機和釋出主機在同一時間。在高階用例中,例如在代理伺服器後執行時,可能需要將這些設定設定為不同的值:
# 繫結到哪個網路介面以偵聽傳入請求
# network.bind_host: 127.0.0.1
# 點可以繫結到多個介面,例如兩個網絡卡,或站點本地地址和本地地址。預設為 network.host。

# network.publish_host: 127.0.0.1
# 釋出主機是節點通告叢集中其他節點的單個介面,以便這些節點可以連線到它。目前,Elasticsearch節點可能會繫結到多個地址,但只發佈一個。如果未指定,則預設為“最佳”地址network.host,按IPv4 / IPv6堆疊首選項排序,然後按可訪問性排序。如果您將其設定為 network.host多個繫結地址,但依賴於特定地址進行節點間通訊,則應該明確設定 network.publish_host。transport.tcp.port

#################################### 高階TCP設定 #################################### 
# 任何使用TCP的元件(如HTTP和 傳輸模組)都共享以下設定:
# network.tcp.no_delay: true
# 啟用或禁用TCP無延遲 設定。預設為true。

# network.tcp.keep_alive: true
# 啟用或禁用TCP保持活動狀態。預設為true。

# network.tcp.reuse_address: true
# 地址是否應該重複使用。預設為true在非Windows機器上。

# network.tcp.send_buffer_size
# TCP傳送緩衝區的大小(以大小單位指定)。預設情況下不明確設定。

# network.tcp.receive_buffer_size
# TCP接收緩衝區的大小(以大小單位指定)。預設情況下不明確設定。

################################### Memory #################################### 
# bootstrap.memory_lock: true
# 設定為true來鎖住記憶體。因為記憶體交換到磁碟對伺服器效能來說是致命的,當jvm開始swapping時es的效率會降低,所以要保證它不swap

###################### 使用head等外掛監控叢集資訊,需要開啟以下配置項 ###########
# http.cors.enabled: true
# http.cors.allow-origin: "*"
# http.cors.allow-credentials: true

################################### Gateway ###################################
# 以下靜態設定(必須在每個主節點上設定)控制剛剛選擇的主伺服器在嘗試恢復群集狀態和群集資料之前應等待的時間,修改後需要重啟生效
# gateway.expected_nodes: 0
# 預計在叢集中的(資料或主節點)數量。只要預期的節點數加入群集,恢復本地碎片就會開始。預設為0

# gateway.expected_master_nodes: 0
# 預計將在群集中的主節點的數量。一旦預期的主節點數加入群集,就會立即開始恢復本地碎片。預設為0

# gateway.expected_data_nodes: 0
# 預計將在群集中的資料節點的數量。只要預期數量的節點加入群集,就會開始恢復本地碎片。預設為0

# gateway.recover_after_time: 5m
# 設定初始化恢復過程的超時時間,超時時間從上一個配置中配置的N個節點啟動後算起。預設為5m

################################## Discovery ##################################
#### 該配置十分重要,沒有正確配置,可能無法構成叢集
# 這是一個叢集中的主節點的初始列表,當節點(主節點或者資料節點)啟動時使用這個列表進行探測
# discovery.zen.ping.unicast.hosts: ["host1:port", "host2:port", "host3:port"]
# 預設為["127.0.0.1", "[::1]"]

# discovery.zen.ping.unicast.hosts.resolve_timeout: 5s
# 在每輪ping中等待DNS查詢的時間量。指定為 時間單位。預設為5秒

# discovery.zen.ping_timeout: 3s
# 確定節點將多久決定開始選舉或加入現有的群集之前等待,預設3s

# discovery.zen.join_timeout: 
# 一旦一個節點決定加入一個現有的已形成的叢集,它將傳送一個加入請求給主裝置,預設值是ping超時的20倍。

# discovery.zen.minimum_master_nodes: 2
# 為防止資料丟失,配置discovery.zen.minimum_master_nodes設定(預設設定1)至關重要, 以便每個符合主節點的節點都知道 為了形成群集而必須可見的主節點的最小數量。
為了解釋,假設您有一個由兩個主節點組成的叢集。網路故障會中斷這兩個節點之間的通訊。每個節點都會看到一個主節點的節點......本身。隨著minimum_master_nodes設定為預設1,這是足以形成一個叢集。每個節點將自己選為新的主人(認為另一個主人資格的節點已經死亡),結果是兩個叢集,或者是一個分裂的大腦。直到一個節點重新啟動後,這兩個節點才會重新加入。任何已寫入重新啟動節點的資料都將丟失。
現在想象一下,您有一個具有三個主節點資格的節點的叢集,並 minimum_master_nodes設定為2。如果網路拆分將一個節點與其他兩個節點分開,則具有一個節點的一側不能看到足夠的主節點,並且會意識到它不能將自己選為主節點。具有兩個節點的一側將選擇一個新的主控(如果需要)並繼續正常工作。一旦網路拆分解決,單個節點將重新加入群集並再次開始提供服務請求。
該設定應該設定為符合主資料節點的法定數量:
(master_eligible_nodes / 2)+ 1

換句話說,如果有三個符合條件的節點,則最小主節點應設定為(3 / 2) + 1或2。