天天看點

ElasticSearch 叢集(搭建 分片配置 原理 ELK搭建 路由原理 腦裂 叢集擴容)

ElasticSearch 叢集

    • 叢集
      • 1.1 搭建叢集
        • 1.1.1 整體步驟
        • 1.1.2 拷貝副本
        • 1.1. 3 修改elasticsearch.yml配置檔案
        • 1.1.4 執行授權
        • 1.1.5 啟動三個節點
    • 1.2 使用Kibana配置和管理叢集
        • 1.2.1 叢集配置
        • 1.2.2 管理叢集
      • 1.1-叢集介紹
      • 1.2-ES叢集相關概念
      • 1.3-kibina管理叢集
      • 2.1 ElasticSearch叢集介紹
      • 2.2 ElasticSearch叢集原理
        • 2.2.1 叢集分布式原理
        • 2.2.2 分片處理機制
        • 2.2.3 建立索引處理流程
        • 2.2.4 讀取索引處理流程
      • 2.5 ElasticSearch叢集分片測試
    • 3. ELK部署應用與工作機制
      • 3.1 ELK日志分析平台介紹
      • 3.2 ELK部署架構模式
        • 3.2.1 簡單架構
        • 3.2.2 消息隊列架構
        • 3.2.3 BEATS架構
      • 3.3 ELK工作機制
        • 3.3.1 Filebeat工作機制
        • 3.3.2 Logstash工作機制
      • 3.4 Logstash安裝配置
      • 3.5 Filebeat安裝配置
      • 3.6 Kibana配置與檢視資料
      • 4.5-JavaAPI 通路叢集
      • 4.6-分片配置
      • 4.7-路由原理
      • 4.8-腦裂

叢集

1.1 搭建叢集

Elasticsearch如果做叢集的話Master節點至少三台伺服器或者三個Master執行個體加入相同叢集,三個Master節點最多隻能故障一台Master節點,如果故障兩個Master節點,Elasticsearch将無法組成叢集.會報錯,Kibana也無法啟動,因為Kibana無法擷取叢集中的節點資訊。

由于,我們使用隻有一台虛拟機,是以我們在虛拟機中安裝三個ES執行個體,搭建僞叢集,而ES啟動比較耗記憶體,是以先設定虛拟機的記憶體3G和CPU個數4個

ElasticSearch 叢集(搭建 分片配置 原理 ELK搭建 路由原理 腦裂 叢集擴容)

1.1.1 整體步驟

步驟如下:

  • 拷貝opt目錄下的elasticsearch-7.4.0安裝包3個,分别命名:

    elasticsearch-7.4.0-itcast1

    elasticsearch-7.4.0-itcast2

    elasticsearch-7.4.0-itcast3

  • 然後修改elasticsearch.yml檔案件。
  • 然後啟動啟動itcast1、itcast2、itcast3三個節點。
  • 打開浏覽器輸⼊:http://192.168.149.135:9200/_cat/health?v ,如果傳回的node.total是3,代表集 群搭建成功

在此,需要我們特别注意的是,像本文這樣單伺服器多節點( 3 個節點)的情況,僅供測試使用,叢集環境如下:

cluster name node name IP Addr http端口 / 通信端口
itcast-es itcast1 192.168.149.135 9201 / 9700
itcast-es itcast2 192.168.149.135 9202 / 9800
itcast-es itcast3 192.168.149.135 9203 / 9900

1.1.2 拷貝副本

拷貝opt目錄下的elasticsearch-7.4.0安裝包3個,打開虛拟機到opt目錄

執行 拷貝三份

cd /opt
cp -r  elasticsearch-7.4.0   elasticsearch-7.4.0-itcast1
cp -r  elasticsearch-7.4.0   elasticsearch-7.4.0-itcast2
cp -r  elasticsearch-7.4.0   elasticsearch-7.4.0-itcast3
           

1.1. 3 修改elasticsearch.yml配置檔案

1)、建立日志目錄

cd /opt
mkdir logs
mkdir  data
# 授權給itheima使用者
chown -R itheima:itheima ./logs
chown -R itheima:itheima ./data

chown -R itheima:itheima ./elasticsearch-7.4.0-itcast1
chown -R itheima:itheima ./elasticsearch-7.4.0-itcast2
chown -R itheima:itheima ./elasticsearch-7.4.0-itcast3
           

打開elasticsearch.yml配置,分别配置下面三個節點的配置檔案

vim /opt/elasticsearch-7.4.0-itcast1/config/elasticsearch.yml 
vim /opt/elasticsearch-7.4.0-itcast2/config/elasticsearch.yml 
vim /opt/elasticsearch-7.4.0-itcast3/config/elasticsearch.yml 
           

2)、下面是elasticsearch-7.4.0-itcast1配置檔案

cluster.name: itcast-es
node.name: itcast-1 
node.master: true
node.data: true
node.max_local_storage_nodes: 3 
network.host: 0.0.0.0
http.port: 9201
transport.tcp.port: 9700
discovery.seed_hosts: ["localhost:9700","localhost:9800","localhost:9900"]
cluster.initial_master_nodes: ["itcast-1", "itcast-2","itcast-3"]
path.data: /opt/data
path.logs: /opt/logs
           
#叢集名稱
cluster.name: itcast-es
#節點名稱
node.name: itcast-1 
#是不是有資格主節點
node.master: true
#是否存儲資料
node.data: true
#最大叢集節點數
node.max_local_storage_nodes: 3 
#ip位址
network.host: 0.0.0.0
#端口
http.port: 9201
#内部節點之間溝通端口
transport.tcp.port: 9700
#es7.x 之後新增的配置,節點發現
discovery.seed_hosts: ["localhost:9700","localhost:9800","localhost:9900"]
#es7.x 之後新增的配置,初始化一個新的叢集時需要此配置來選舉master
cluster.initial_master_nodes: ["itcast-1", "itcast-2","itcast-3"] 
#資料和存儲路徑
path.data: /opt/data
path.logs: /opt/logs
           

3)、下面是elasticsearch-7.4.0-itcast2配置檔案

cluster.name: itcast-es
node.name: itcast-2 
node.master: true
node.data: true
node.max_local_storage_nodes: 3 
network.host: 0.0.0.0
http.port: 9202
transport.tcp.port: 9800
discovery.seed_hosts: ["localhost:9700","localhost:9800","localhost:9900"]
cluster.initial_master_nodes: ["itcast-1", "itcast-2","itcast-3"]
path.data: /opt/data
path.logs: /opt/logs

           
#叢集名稱
cluster.name: itcast-es
#節點名稱
node.name: itcast-2 
#是不是有資格主節點
node.master: true
#是否存儲資料
node.data: true
#最大叢集節點數
node.max_local_storage_nodes: 3 
#ip位址
network.host: 0.0.0.0
#端口
http.port: 9202
#内部節點之間溝通端口
transport.tcp.port: 9800
#es7.x 之後新增的配置,節點發現
discovery.seed_hosts: ["localhost:9700","localhost:9800","localhost:9900"]
#es7.x 之後新增的配置,初始化一個新的叢集時需要此配置來選舉master
cluster.initial_master_nodes: ["itcast-1", "itcast-2","itcast-3"] 
#資料和存儲路徑
path.data: /opt/data
path.logs: /opt/logs
           

4)、下面是elasticsearch-7.4.0-itcast3 配置檔案

cluster.name: itcast-es
node.name: itcast-3 
node.master: true
node.data: true
node.max_local_storage_nodes: 3 
network.host: 0.0.0.0
http.port: 9203
transport.tcp.port: 9900
discovery.seed_hosts: ["localhost:9700","localhost:9800","localhost:9900"]
cluster.initial_master_nodes: ["itcast-1", "itcast-2","itcast-3"] 
path.data: /opt/data
path.logs: /opt/logs
           
#叢集名稱
cluster.name: itcast-es
#節點名稱
node.name: itcast-3 
#是不是有資格主節點
node.master: true
#是否存儲資料
node.data: true
#最大叢集節點數
node.max_local_storage_nodes: 3 
#ip位址
network.host: 0.0.0.0
#端口
http.port: 9203
#内部節點之間溝通端口
transport.tcp.port: 9900
#es7.x 之後新增的配置,節點發現
discovery.seed_hosts: ["localhost:9700","localhost:9800","localhost:9900"]
#es7.x 之後新增的配置,初始化一個新的叢集時需要此配置來選舉master
cluster.initial_master_nodes: ["itcast-1", "itcast-2","itcast-3"] 
#資料和存儲路徑
path.data: /opt/data
path.logs: /opt/logs
           

1.1.4 執行授權

在root使用者下執行
chown -R itheima:itheima /opt/elasticsearch-7.4.0-itcast1
chown -R itheima:itheima /opt/elasticsearch-7.4.0-itcast2
chown -R itheima:itheima /opt/elasticsearch-7.4.0-itcast3
如果有的日志檔案授權失敗,可使用(也是在root下執行)
cd /opt/elasticsearch-7.4.0-itcast1/logs
chown -R itheima:itheima ./* 
cd /opt/elasticsearch-7.4.0-itcast2/logs
chown -R itheima:itheima ./* 
cd /opt/elasticsearch-7.4.0-itcast3/logs
chown -R itheima:itheima ./* 
           

1.1.5 啟動三個節點

啟動之前,設定ES的JVM占用記憶體參數,防止記憶體不足錯誤

ElasticSearch 叢集(搭建 分片配置 原理 ELK搭建 路由原理 腦裂 叢集擴容)
vim /opt/elasticsearch-7.4.0-itcast1/bin/elasticsearch
           
ElasticSearch 叢集(搭建 分片配置 原理 ELK搭建 路由原理 腦裂 叢集擴容)

可以發現,ES啟動時加載/config/jvm.options檔案

vim /opt/elasticsearch-7.4.0-itcast1/config/jvm.options
           
ElasticSearch 叢集(搭建 分片配置 原理 ELK搭建 路由原理 腦裂 叢集擴容)

預設情況下,ES啟動JVM最小記憶體1G,最大記憶體1G

-xms:最小記憶體
-xmx:最大記憶體
           

修改為256m

ElasticSearch 叢集(搭建 分片配置 原理 ELK搭建 路由原理 腦裂 叢集擴容)

啟動成功通路節點一:

ElasticSearch 叢集(搭建 分片配置 原理 ELK搭建 路由原理 腦裂 叢集擴容)

可以從日志中看到:master not discovered yet。還沒有發現主節點

通路叢集狀态資訊 http://192.168.149.135:9201/_cat/health?v 不成功

ElasticSearch 叢集(搭建 分片配置 原理 ELK搭建 路由原理 腦裂 叢集擴容)

啟動成功通路節點二:

ElasticSearch 叢集(搭建 分片配置 原理 ELK搭建 路由原理 腦裂 叢集擴容)

可以從日志中看到:master not discovered yet。還沒有發現主節點master node changed.已經選舉出主節點itcast-2

通路叢集狀态資訊 http://192.168.149.135:9201/_cat/health?v 成功

ElasticSearch 叢集(搭建 分片配置 原理 ELK搭建 路由原理 腦裂 叢集擴容)
健康狀況結果解釋:

cluster 叢集名稱
status 叢集狀态 
	green代表健康;
	yellow代表配置設定了所有主分片,但至少缺少一個副本,此時叢集資料仍舊完整;
	red 代表部分主分片不可用,可能已經丢失資料。
node.total代表線上的節點總數量
node.data代表線上的資料節點的數量
shards 存活的分片數量
pri 存活的主分片數量 正常情況下 shards的數量是pri的兩倍。
relo遷移中的分片數量,正常情況為 0
init 初始化中的分片數量 正常情況為 0
unassign未配置設定的分片 正常情況為 0
pending_tasks準備中的任務,任務指遷移分片等 正常情況為 0
max_task_wait_time任務最長等待時間
active_shards_percent正常分片百分比 正常情況為 100%
           

啟動成功通路節點三

通路叢集狀态資訊 http://192.168.149.135:9201/_cat/health?v 成功

ElasticSearch 叢集(搭建 分片配置 原理 ELK搭建 路由原理 腦裂 叢集擴容)

1.2 使用Kibana配置和管理叢集

1.2.1 叢集配置

因為之前我們在單機示範的時候也使用到了Kibana,我們先複制出來一個Kibana,然後修改它的叢集配置

cd /opt/
cp -r kibana-7.4.0-linux-x86_64   kibana-7.4.0-linux-x86_64-cluster
# 由于 kibana 中檔案衆多,此處會等待大約1分鐘的時間
           

修改Kibana的叢集配置

vim  kibana-7.4.0-linux-x86_64-cluster/config/kibana.yml
加入下面的配置
elasticsearch.hosts: ["http://localhost:9201","http://localhost:9202","http://localhost:9203"]
           

啟動Kibana

sh kibana --allow-root
           
ElasticSearch 叢集(搭建 分片配置 原理 ELK搭建 路由原理 腦裂 叢集擴容)

1.2.2 管理叢集

1、打開Kibana,點開 Stack Monitoring 叢集監控

ElasticSearch 叢集(搭建 分片配置 原理 ELK搭建 路由原理 腦裂 叢集擴容)
ElasticSearch 叢集(搭建 分片配置 原理 ELK搭建 路由原理 腦裂 叢集擴容)

2、點選【Nodes】檢視節點詳細資訊

ElasticSearch 叢集(搭建 分片配置 原理 ELK搭建 路由原理 腦裂 叢集擴容)
ElasticSearch 叢集(搭建 分片配置 原理 ELK搭建 路由原理 腦裂 叢集擴容)

在上圖可以看到,第一個紅框處顯示【Green】,綠色,表示叢集處理健康狀态

第二個紅框是我們叢集的三個節點,注意,itcast-3旁邊是星星,表示是主節點

1.1-叢集介紹

  • 叢集和分布式:

​ 叢集:多個人做一樣的事。

​ 分布式:多個人做不一樣的事

  • 叢集解決的問題:

​ 讓系統高可用

​ 分擔請求壓力

  • 分布式解決的問題:

​ 分擔存儲和計算的壓力,提速

​ 解耦

  • 叢集和分布式架構往往是并存的
ElasticSearch 叢集(搭建 分片配置 原理 ELK搭建 路由原理 腦裂 叢集擴容)

1.2-ES叢集相關概念

es 叢集:

•ElasticSearch 天然支援分布式

•ElasticSearch 的設計隐藏了分布式本身的複雜性

ES叢集相關概念:

•叢集(cluster):一組擁有共同的 cluster name 的 節點。

•節點(node) :叢集中的一個 Elasticearch 執行個體

•索引(index) :es存儲資料的地方。相當于關系資料庫中的database概念

•分片(shard):索引可以被拆分為不同的部分進行存儲,稱為分片。在叢集環境下,一個索引的不同分片可以拆分到不同的節點中

•主分片(Primary shard):相對于副本分片的定義。

•副本分片(Replica shard)每個主分片可以有一個或者多個副本,資料和主分片一樣。

1.3-kibina管理叢集

vim  kibana-7.4.0-linux-x86_64-cluster/config/kibana.yml
           

kibana.yml

#支援中文
i18n.locale: "zh-CN"
#5602避免與之前的沖突
server.port: 5602
server.host: "0.0.0.0"
server.name: "kibana-itcast-cluster"
elasticsearch.hosts: ["http://localhost:9201","http://localhost:9202","http://localhost:9203"]
elasticsearch.requestTimeout: 99999

           

2.1 ElasticSearch叢集介紹

  • 主節點(或候選主節點)

主節點負責建立索引、删除索引、配置設定分片、追蹤叢集中的節點狀态等工作, 主節點負荷相對較

輕, 用戶端請求可以直接發往任何節點, 由對應節點負責分發和傳回處理結果。

一個節點啟動之後, 采用 Zen Discovery機制去尋找叢集中的其他節點, 并與之建立連接配接, 叢集

會從候選主節點中選舉出一個主節點, 并且一個叢集隻能選舉一個主節點, 在某些情況下, 由于

網絡通信丢包等問題, 一個叢集可能會出現多個主節點, 稱為“腦裂現象”, 腦裂會存在丢失資料

的可能, 因為主節點擁有最高權限, 它決定了什麼時候可以建立索引, 分片如何移動等, 如果存

在多個主節點, 就會産生沖突, 容易産生資料丢失。要盡量避免這個問題, 可以通過

discovery.zen.minimum_master_nodes 來設定最少可工作的候選主節點個數。 建議設定為(候

選主節點/2) + 1 比如三個候選主節點,該配置項為 (3/2)+1 ,來保證叢集中有半數以上的候選主

節點, 沒有足夠的master候選節點, 就不會進行master節點選舉,減少腦裂的可能。

主節點的參數設定:

node.master = true 
node.data = false 
           
  • 資料節點

資料節點負責資料的存儲和CRUD等具體操作,資料節點對機器配置要求比較高、,首先需要有足

夠的磁盤空間來存儲資料,其次資料操作對系統CPU、Memory和IO的性能消耗都很大。通常随着

叢集的擴大,需要增加更多的資料節點來提高可用性。

資料節點的參數設定:

node.master = false 
node.data = true 
           
  • 用戶端節點

用戶端節點不做候選主節點, 也不做資料節點的節點,隻負責請求的分發、彙總等等,增加用戶端

節點類型更多是為了負載均衡的處理。

node.master = false 
node.data = false 
           
  • 提取節點(預處理節點)

能執行預處理管道,有自己獨立的任務要執行, 在索引資料之前可以先對資料做預處理操作, 不負責資料存儲也不負責叢集相關的事務。

參數設定:

  • 協調節點

協調節點,是一種角色,而不是真實的Elasticsearch的節點,不能通過配置項來指定哪個節點為協調節點。叢集中的任何節點,都可以充當協調節點的角色。當一個節點A收到使用者的查詢請求後,會把查詢子句分發到其它的節點,然後合并各個節點傳回的查詢結果,最後傳回一個完整的資料集給使用者。在這個過程中,節點A扮演的就是協調節點的角色。

ES的一次請求非常類似于Map-Reduce操作。在ES中對應的也是兩個階段,稱之為scatter-gather。用戶端發出一個請求到叢集的任意一個節點,這個節點就是所謂的協調節點,它會把請求轉發給含有相關資料的節點(scatter階段),這些資料節點會在本地執行請求然後把結果傳回給協調節點。協調節點将這些結果彙總(reduce)成一個單一的全局結果集(gather階段) 。

  • 部落節點

在多個叢集之間充當聯合用戶端, 它是一個特殊的用戶端 , 可以連接配接多個叢集,在所有連接配接的叢集上執行搜尋和其他操作。 部落節點從所有連接配接的叢集中檢索叢集狀态并将其合并成全局叢集狀态。 掌握這一資訊,就可以對所有叢集中的節點執行讀寫操作,就好像它們是本地的。 請注意,部落節點需要能夠連接配接到每個配置的叢集中的每個單個節點。

2.2 ElasticSearch叢集原理

2.2.1 叢集分布式原理

ES叢集可以根據節點數, 動态調整分片與副本數, 做到整個叢集有效均衡負載。

單節點狀态下:

ElasticSearch 叢集(搭建 分片配置 原理 ELK搭建 路由原理 腦裂 叢集擴容)

兩個節點狀态下, 副本數為1:

ElasticSearch 叢集(搭建 分片配置 原理 ELK搭建 路由原理 腦裂 叢集擴容)

三個節點狀态下, 副本數為1:

ElasticSearch 叢集(搭建 分片配置 原理 ELK搭建 路由原理 腦裂 叢集擴容)

三個節點狀态下, 副本數為2:

ElasticSearch 叢集(搭建 分片配置 原理 ELK搭建 路由原理 腦裂 叢集擴容)

2.2.2 分片處理機制

設定分片大小的時候, 需預先做好容量規劃, 如果節點數過多, 分片數過小, 那麼新的節點将無法分片, 不能做到水準擴充, 并且單個分片資料量太大, 導緻資料重新配置設定耗時過大。

假設一個叢集中有一個主節點、兩個資料節點。orders索引的分片分布情況如下所示

PUT orders 
{ 
"settings":{ 
"number_of_shards":2, ## 主分片 
"number_of_replicas":2 ## 副分片 
} 
}

           
ElasticSearch 叢集(搭建 分片配置 原理 ELK搭建 路由原理 腦裂 叢集擴容)

整個叢集中存在P0和P1兩個主分片, P0對應的兩個R0副本分片, P1對應的是兩個R1副本分片。

2.2.3 建立索引處理流程

ElasticSearch 叢集(搭建 分片配置 原理 ELK搭建 路由原理 腦裂 叢集擴容)
  1. 寫入的請求會進入主節點, 如果是NODE2副本接收到寫請求, 會将它轉發至主節點。
  2. 主節點接收到請求後, 根據documentId做取模運算(外部沒有傳遞documentId,則會采用内部自增ID),

    如果取模結果為P0,則會将寫請求轉發至NODE3處理。

  3. NODE3節點寫請求處理完成之後, 采用異步方式, 将資料同步至NODE1和NODE2節點。

2.2.4 讀取索引處理流程

ElasticSearch 叢集(搭建 分片配置 原理 ELK搭建 路由原理 腦裂 叢集擴容)
  1. 讀取的請求進入MASTER節點, 會根據取模結果, 将請求轉發至不同的節點。
  2. 如果取模結果為R0,内部還會有負載均衡處理機制,如果上一次的讀取請求是在NODE1的R0, 那麼目前請求會轉發至NODE2的R0, 保障每個節點都能夠均衡的處理請求資料。
  3. 讀取的請求如果是直接落至副本節點, 副本節點會做判斷, 若有資料則傳回,沒有的話會轉發至其他節點處理。

2.5 ElasticSearch叢集分片測試

修改kibana的配置檔案,指向建立的叢集節點:

elasticsearch.hosts: 
["http://192.168.116.140:9200","http://192.168.116.140:9201","http://192.168.116.140:9202"] 
           

重新開機kibana服務, 進入控制台:

http://192.168.116.140:5601/app/home#/

再次建立索引(副本數量範圍内):

PUT orders 
{ 
"settings": { 
"index": { 
"number_of_shards": 2, 
"number_of_replicas": 2 
} 
} 
}
           

可以看到, 這次結果是正常:

ElasticSearch 叢集(搭建 分片配置 原理 ELK搭建 路由原理 腦裂 叢集擴容)

叢集并非可以随意增加副本數量, 建立索引(超出副本數量範圍):

PUT orders 
{ 
"settings": { 
"index": { 
"number_of_shards": 2, 
"number_of_replicas": 5 
} 
} 
}

           

可以看到出現了yellow警告錯誤:

ElasticSearch 叢集(搭建 分片配置 原理 ELK搭建 路由原理 腦裂 叢集擴容)

3. ELK部署應用與工作機制

3.1 ELK日志分析平台介紹

ELK是三個開源軟體的縮寫,分别表示:Elasticsearch , Logstash和Kibana。Elasticsearch和Kibana我們上面做過講解。 Logstash 主要是用來日志的搜集、分析、過濾日志的工具,适用大資料量場景,

一般采用c/s模式,client端安裝在需要收集日志的主機上,server端負責将收到的各節點日志進行過濾、修改等操作, 再一并發往Elasticsearch上做資料分析。

一個完整的集中式日志系統,需要包含以下幾個主要特點:

  • 收集-能夠采集多種來源的日志資料
  • 傳輸-能夠穩定的把日志資料傳輸到中央系統
  • 存儲-如何存儲日志資料
  • 分析-可以支援 UI 分析
  • 警告-能夠提供錯誤報告,監控機制

ELK提供了一整套解決方案,并且都是開源軟體,之間互相配合使用,完美銜接,高效的滿足了很多場合的應用,是目前主流的一種日志分析平台。

3.2 ELK部署架構模式

3.2.1 簡單架構

ElasticSearch 叢集(搭建 分片配置 原理 ELK搭建 路由原理 腦裂 叢集擴容)

這是最簡單的一種ELK部署架構方式, 由Logstash分布于各個節點上搜集相關日志、資料,并經過分析、過濾後發送給遠端伺服器上的Elasticsearch進行存儲。 優點是搭建簡單, 易于上手, 缺點是Logstash耗資源較大, 依賴性強, 沒有消息隊列緩存, 存在資料丢失隐患

3.2.2 消息隊列架構

ElasticSearch 叢集(搭建 分片配置 原理 ELK搭建 路由原理 腦裂 叢集擴容)

該隊列架構引入了KAFKA消息隊列, 解決了各采集節點上Logstash資源耗費過大, 資料丢失的問題,各終端節點上的Logstash Agent 先将資料/日志傳遞給Kafka, 消息隊列再将資料傳遞給Logstash,Logstash過濾、分析後将資料傳遞給Elasticsearch存儲, 由Kibana将日志和資料呈現給使用者。

3.2.3 BEATS架構

ElasticSearch 叢集(搭建 分片配置 原理 ELK搭建 路由原理 腦裂 叢集擴容)

該架構的終端節點采用Beats工具收集發送資料, 更靈活,消耗資源更少,擴充性更強。同時可配置Logstash 和Elasticsearch 叢集用于支援大叢集系統的運維日志資料監控和查詢, 官方也推薦采用此工具, 本章我們采用此架構模式進行配置講解(如果在生産環境中, 可以再增加kafka消息隊列, 實作了beats+消息隊列的部署架構 )。

Beats工具包含四種:

1、Packetbeat(搜集網絡流量資料)

2、Topbeat(搜集系統、程序和檔案系統級别的 CPU 和記憶體使用情況等資料)

3、Filebeat(搜集檔案資料)

4、Winlogbeat(搜集 Windows 事件日志資料)

3.3 ELK工作機制

3.3.1 Filebeat工作機制

Filebeat由兩個主要元件組成:prospectors(勘測者) 和 harvesters(收割機)。這兩個元件協同工作将檔案變動發送到指定的輸出中。

ElasticSearch 叢集(搭建 分片配置 原理 ELK搭建 路由原理 腦裂 叢集擴容)

Harvester(收割機):負責讀取單個檔案内容。每個檔案會啟動一個Harvester,每個Harvester會逐行讀取各個檔案,并将檔案内容發送到制定輸出中。Harvester負責打開和關閉檔案,意味在Harvester運作的時候,檔案描述符處于打開狀态,如果檔案在收集中被重命名或者被删除,Filebeat會繼續讀取

此檔案。是以在Harvester關閉之前,磁盤不會被釋放。預設情況filebeat會保持檔案打開的狀态,直到達到close_inactive

filebeat會在指定時間内将不再更新的檔案句柄關閉,時間從harvester讀取最後一行的時間開始計時。若檔案句柄被關閉後,檔案發生變化,則會啟動一個新的harvester。關閉檔案句柄的時間不取決于檔案的修改時間,若此參數配置不當,則可能發生日志不實時的情況,由scan_frequency參數決定,預設10s。Harvester使用内部時間戳來記錄檔案最後被收集的時間。例如:設定5m,則在Harvester讀取檔案的最後一行之後,開始倒計時5分鐘,若5分鐘内檔案無變化,則關閉檔案句柄。預設5m】。

Prospector(勘測者):負責管理Harvester并找到所有讀取源。

filebeat.prospectors: 
- input_type: log 
  paths: 
    - /apps/logs/*/info.log 
           

Prospector會找到/apps/logs/*目錄下的所有info.log檔案,并為每個檔案啟動一個Harvester。

Prospector會檢查每個檔案,看Harvester是否已經啟動,是否需要啟動,或者檔案是否可以忽略。若Harvester關閉,隻有在檔案大小發生變化的時候Prospector才會執行檢查。隻能檢測本地的檔案。

Filebeat如何記錄發送狀态:

将檔案狀态記錄在檔案中(預設在/var/lib/filebeat/registry)。此狀态可以記住Harvester收集檔案的偏移量。若連接配接不上輸出裝置,如ES等,filebeat會記錄發送前的最後一行,并再可以連接配接的時候繼續發送。

Filebeat在運作的時候,Prospector狀态會被記錄在記憶體中。Filebeat重新開機的時候,利用registry記錄的狀态來進行重建,用來還原到重新開機之前的狀态。每個Prospector會為每個找到的檔案記錄一個狀态,對于每個檔案,Filebeat存儲唯一辨別符以檢測檔案是否先前被收集。

Filebeat如何保證資料發送成功:

Filebeat之是以能保證事件至少被傳遞到配置的輸出一次,沒有資料丢失,是因為filebeat将每個事件的傳遞狀态儲存在檔案中。在未得到輸出方确認時,filebeat會嘗試一直發送,直到得到回應。若filebeat在傳輸過程中被關閉,則不會再關閉之前确認所有時事件。任何在filebeat關閉之前未确認的事件,都會在filebeat重新開機之後重新發送。這可確定至少發送一次,但有可能會重複。可通過設定shutdown_timeout 參數來設定關閉之前的等待事件回應的時間(預設禁用)。

3.3.2 Logstash工作機制

Logstash事件處理有三個階段:inputs → filters → outputs。是一個接收,處理,轉發日志的工具。支援系統日志,webserver日志,錯誤日志,應用日志等。

ElasticSearch 叢集(搭建 分片配置 原理 ELK搭建 路由原理 腦裂 叢集擴容)

Input:輸入資料到logstash。

支援的輸入類型:

file:從檔案系統的檔案中讀取,類似于tail -f指令

syslog:在514端口上監聽系統日志消息,并根據RFC3164标準進行解析

redis:從redis service中讀取

beats:從filebeat中讀取

Filters:資料中間處理,對資料進行操作。

一些常用的過濾器為:

grok:解析任意文本資料,Grok 是 Logstash 最重要的插件。它的主要作用就是将文本格式的字元串,

轉換成為具體的結構化的資料,配合正規表達式使用。内置120多個解析文法。

官方提供的grok表達式

mutate:對字段進行轉換。例如對字段進行删除、替換、修改、重命名等。

drop:丢棄一部分events不進行處理。

clone:拷貝 event,這個過程中也可以添加或移除字段。

geoip:添加地理資訊(為前台kibana圖形化展示使用)

Outputs:outputs是logstash處理管道的最末端元件。

一個event可以在處理過程中經過多重輸出,但是一旦所有的outputs都執行結束,這個event也就完成生命周期。

常見的outputs為:

elasticsearch:可以高效的儲存資料,并且能夠友善和簡單的進行查詢。

file:将event資料儲存到檔案中。

graphite:将event資料發送到圖形化元件中,一個很流行的開源存儲圖形化展示的元件。

Codecs:codecs 是基于資料流的過濾器,它可以作為input,output的一部配置設定置。

Codecs可以幫助你輕松的分割發送過來已經被序列化的資料。

常見的codecs:

json:使用json格式對資料進行編碼/解碼。

multiline:将多個事件中資料彙總為一個單一的行。比如:java異常資訊和堆棧資訊。

3.4 Logstash安裝配置

在192.168.116.141機器節點上進行安裝:

  1. 下載下傳解壓

    下載下傳:

cd /usr/local 
wget https://artifacts.elastic.co/downloads/logstash/logstash-7.10.2-linux-x86_64.tar.gz 
           

解壓:

tar -xvf logstash-7.10.2-linux-x86_64.tar.gz
           
  1. 建立資料存儲與日志記錄目錄
[[email protected] logstash-7.10.2]# mkdir -p /usr/local/logstash-7.10.2/data 
[[email protected] logstash-7.10.2]# mkdir -p /usr/local/logstash-7.10.2/logs
           
  1. 修改配置檔案:
vi /usr/local/logstash-7.10.2/config/logstash.yml
           

配置内容:

# 資料存儲路徑 
path.data: /usr/local/logstash-7.10.2/data 
# 監聽主機位址 
http.host: "192.168.116.141" 
# 日志存儲路徑 
path.logs: /usr/local/logstash-7.10.2/logs 
#啟動監控插件 
xpack.monitoring.enabled: true 
#Elastic叢集位址 
xpack.monitoring.elasticsearch.hosts: 
["http://192.168.116.140:9200","http://192.168.116.140:9201","http://192.168.116.140:9202"] 
           
  1. 建立監聽配置檔案:
vi /usr/local/logstash-7.10.2/config/logstash.conf
           

配置

input { 
  beats { 
    # 監聽端口 
    port => 5044 
  } 
}
output { 

  stdout { 
  # 輸出編碼插件 
  codec => rubydebug 
}

  elasticsearch { 
  # 叢集位址 
  hosts => 
["http://192.168.116.140:9200","http://192.168.116.140:9201","http://192.168.116.140:9202"] 
   } 
}
           
  1. 啟動服務:

    以root使用者身份執行:

## 背景啟動方式 
nohup /usr/local/logstash-7.10.2/bin/logstash -f /usr/local/logstash- 
7.10.2/config/logstash.conf & 
##
./logstash -f ../config/logstash.conf
           

成功啟動後會顯示以下日志:

[2020-10-15T06:57:40,640][INFO ][logstash.agent ] Successfully 
started Logstash API endpoint {:port=>9600}

           

通路位址: http://192.168.116.141:9600/, 可以看到傳回資訊:

ElasticSearch 叢集(搭建 分片配置 原理 ELK搭建 路由原理 腦裂 叢集擴容)

3.5 Filebeat安裝配置

在192.168.116.141機器節點上操作:

  1. 下載下傳解壓

    與ElasticSearch版本一緻, 下載下傳7.10.2版本。

cd /usr/local 
wget https://artifacts.elastic.co/downloads/beats/filebeat/filebeat-7.10.2-linux-x86_64.tar.gz 
           

解壓:

tar -xvf filebeat-7.10.2-linux-x86_64.tar.gz
           
  1. 修改配置檔案
vi /usr/local/filebeat-7.10.2/filebeat.yml 
           

修改内容:

# 需要收集發送的日志檔案 
filebeat.inputs: 
- type: log 
enabled: true 
paths: 
- /var/log/messages 
# 如果需要添加多個日志,隻需要添加 
- type: log 
enabled: true 
paths: 
- /var/log/test.log 
# filebeat 配置子產品, 可以加載多個配置 
filebeat.config.modules: 
path: ${path.config}/modules.d/*.yml 
reload.enabled: false 
# 索引分片數量設定 
setup.template.settings: 
index.number_of_shards: 2 
# kibana 資訊配置 
setup.kibana: 
host: "192.168.116.140:5601" 
# logstash 資訊配置 (注意隻能開啟一項output設定, 如果采用logstash, 将 
output.elasticsearch關閉) 
output.logstash: 
hosts: ["192.168.116.141:5044"] 
# 附加metadata中繼資料資訊 
processors: 
- add_host_metadata: ~ 
- add_cloud_metadata: ~ 
           
  1. 啟動服務
## 背景啟動 
nohup /usr/local/filebeat-7.10.2/filebeat -e -c /usr/local/filebeat- 
7.10.2/filebeat.yml & 
##
./filebeat -e -c filebeat.yml
           

啟動成功後顯示日志:

2020-12-15T07:09:33.922-0400 WARN beater/filebeat.go:367 Filebeat is 
unable to load the Ingest Node pipelines for the configured modules because 
the Elasticsearch output is not configured/enabled. If you have already 
loaded the Ingest Node pipelines or are using Logstash pipelines, you can 
ignore this warning. 
2020-12-15T07:09:33.922-0400 INFO crawler/crawler.go:72 Loading 
Inputs: 1 
2020-12-15T07:09:33.923-0400 INFO log/input.go:148 Configured 
paths: [/var/log/messages] 
2020-12-15T07:09:33.923-0400 INFO input/input.go:114 Starting 
input of type: log; ID: 14056778875720462600 
2020-12-15T07:09:33.924-0400 INFO crawler/crawler.go:106 Loading and 
starting Inputs completed. Enabled inputs: 1 
2020-12-15T07:09:33.924-0400 INFO cfgfile/reload.go:150 Config 
reloader started

           

我們監聽的是/var/log/messages系統日志資訊, 當日志發生變化後, filebeat會通過logstash上

報到Elasticsearch中。 我們可以檢視下叢集的全部索引資訊:

http://192.168.116.140:9200/_cat/indices?v

ElasticSearch 叢集(搭建 分片配置 原理 ELK搭建 路由原理 腦裂 叢集擴容)

可以看到, 已經生成了名為logstash-2021.07.20-000001索引。

3.6 Kibana配置與檢視資料

  1. 進入Kibana背景, 進行配置:

    http://192.168.116.140:5601

    ElasticSearch 叢集(搭建 分片配置 原理 ELK搭建 路由原理 腦裂 叢集擴容)
    進入【Management】–> 在Index Pattern中輸入"logstash-*" --> 點選【next step】, 選 擇"@timestamp",
    ElasticSearch 叢集(搭建 分片配置 原理 ELK搭建 路由原理 腦裂 叢集擴容)
    點選【 Create index pattern 】進行建立。
    ElasticSearch 叢集(搭建 分片配置 原理 ELK搭建 路由原理 腦裂 叢集擴容)
  2. 檢視資料

    進入【Discover】, 可以檢視到收集的資料:

    ElasticSearch 叢集(搭建 分片配置 原理 ELK搭建 路由原理 腦裂 叢集擴容)
    如果沒有顯示, 可以重新調整Time Range時間範圍。

4.5-JavaAPI 通路叢集

PUT cluster_test
{
  "mappings": {
    "properties": {
      "name":{
        "type": "text"
      }
    }
  }
}

GET cluster_test
GET cluster_test/_search

POST /cluster_test/_doc/1
{
  "name":"張三"
}
           

測試類

@Resource(name="clusterClient")
    RestHighLevelClient clusterClient;
 
 /**
     * 測試叢集
     * @throws IOException
     */
    @Test
    public void testCluster() throws IOException {


        //設定查詢的索引、文檔
        GetRequest indexRequest=new GetRequest("cluster_test","1");

        GetResponse response = clusterClient.get(indexRequest, RequestOptions.DEFAULT);
        System.out.println(response.getSourceAsString());

    }
           

ElasticSearchConfig

private String host1;

private int port1;

private String host2;

private int port2;

private String host3;

private int port3;

//get/set ...

@Bean("clusterClient")
    public RestHighLevelClient clusterClient(){
        return new RestHighLevelClient(RestClient.builder(
                new HttpHost(host1,port1,"http"),
                new HttpHost(host2,port2,"http"),
                new HttpHost(host3,port3,"http")
        ));
    }
           

application.yml

elasticsearch:
   host: 192.168.140.130
   port: 9200
   host1: 192.168.140.130
   port1: 9201
   host2: 192.168.140.130
   port2: 9202
   host3: 192.168.140.130
   port3: 9203
           

4.6-分片配置

•在建立索引時,如果不指定分片配置,則預設主分片1,副本分片1。

•在建立索引時,可以通過settings設定分片

ElasticSearch 叢集(搭建 分片配置 原理 ELK搭建 路由原理 腦裂 叢集擴容)
ElasticSearch 叢集(搭建 分片配置 原理 ELK搭建 路由原理 腦裂 叢集擴容)
ElasticSearch 叢集(搭建 分片配置 原理 ELK搭建 路由原理 腦裂 叢集擴容)

分片配置

#分片配置
#"number_of_shards": 3, 主分片數量
#"number_of_replicas": 1  主分片備份數量,每一個主分片有一個備份
# 3個主分片+3個副分片=6個分片
PUT cluster_test1
{
  "settings": {
    "number_of_shards": 3,
    "number_of_replicas": 1
  }, 
  "mappings": {
    "properties": {
      "name":{
        "type": "text"
      }
    }
  }
}
           

1.三個節點正常運作(0、1、2分片标号)

ElasticSearch 叢集(搭建 分片配置 原理 ELK搭建 路由原理 腦裂 叢集擴容)

2.itcast-3 挂掉

ElasticSearch 叢集(搭建 分片配置 原理 ELK搭建 路由原理 腦裂 叢集擴容)
ElasticSearch 叢集(搭建 分片配置 原理 ELK搭建 路由原理 腦裂 叢集擴容)

分片與自平衡

•當節點挂掉後,挂掉的節點分片會自平衡到其他節點中

注意:分片數量一旦确定好,不能修改。

索引分片推薦配置方案:

1.每個分片推薦大小10-30GB

2.分片數量推薦 = 節點數量 * 1~3倍

思考:比如有1000GB資料,應該有多少個分片?多少個節點

1.每個分片20GB 則可以分為40個分片

2.分片數量推薦 = 節點數量 * 1~3倍 --> 40/2=20 即20個節點

4.7-路由原理

路由原理

•文檔存入對應的分片,ES計算分片編号的過程,稱為路由。

•Elasticsearch 是怎麼知道一個文檔應該存放到哪個分片中呢?

•查詢時,根據文檔id查詢文檔, Elasticsearch 又該去哪個分片中查詢資料呢?

•路由算法 :shard_index = hash(id) % number_of_primary_shards

ElasticSearch 叢集(搭建 分片配置 原理 ELK搭建 路由原理 腦裂 叢集擴容)

查詢id為5的文檔:假如hash(5)=17 ,根據算法17%3=2

4.8-腦裂

ElasticSearch 叢集正常狀态:

• 一個正常es叢集中隻有一個主節點(Master),主節點負責管理整個叢集。如建立或删除索引,跟蹤哪些節點是群集的一部分,并決定哪些分片配置設定給相關的節點。

•叢集的所有節點都會選擇同一個節點作為主節點。

腦裂現象:

•腦裂問題的出現就是因為從節點在選擇主節點上出現分歧導緻一個叢集出現多個主節點進而使叢集分裂,使得叢集處于異常狀态。

ElasticSearch 叢集(搭建 分片配置 原理 ELK搭建 路由原理 腦裂 叢集擴容)

腦裂産生的原因:

1.網絡原因:網絡延遲

​ •一般es叢集會在内網部署,也可能在外網部署,比如阿裡雲。

​ •内網一般不會出現此問題,外網的網絡出現問題的可能性大些。

2.節點負載

​ •主節點的角色既為master又為data。資料通路量較大時,可能會導緻Master節點停止響應(假死狀态)。

ElasticSearch 叢集(搭建 分片配置 原理 ELK搭建 路由原理 腦裂 叢集擴容)

3. JVM記憶體回收

•當Master節點設定的JVM記憶體較小時,引發JVM的大規模記憶體回收,造成ES程序失去響應。

避免腦裂:

1.網絡原因:discovery.zen.ping.timeout 逾時時間配置大一點。預設是3S

2.節點負載:角色分離政策

​ •候選主節點配置為

​ •node.master: true

​ •node.data: false

​ •資料節點配置為

​ •node.master: false

​ •node.data: true

3.JVM記憶體回收:修改 config/jvm.options 檔案的 -Xms 和 -Xmx 為伺服器的記憶體一半。

繼續閱讀