ES為了處理大型資料集,實現容錯和高可用性,ES可執行多伺服器組成分散式環境下也稱為叢集;叢集內的節點的cluster.name相同,形成叢集的每個伺服器稱為節點。ES 為分配不同的任務,定義了以下幾個節點角色:Master,Data Node,Coordinating Node,Ingest Node:
主節點(Master Node):主要職責是負責叢集層面的相關操作,管理叢集變更,如建立或刪除索引,跟蹤哪些節點是群集的一部分,並決定哪些分片分配給相關的節點。
# 設定如下,後續所有節點設定可以通過這三個切換設定
node.master: true
node.data: false
node.ingest: false
資料節點(Data Node):主要是儲存索引資料的節點,執行資料相關操作:CRUD、搜尋,聚合操作等。
預處理節點(Ingest Node):預處理操作執行在索引檔案之前,即寫入資料之前,通過事先定義好的一系列processors(處理器)和pipeline(管道),對資料進行某種轉換。
協調節點(Coordinating Node):作為處理使用者端請求的節點,只作為接收請求、轉發請求到其他節點、彙總各個節點返回資料等功能的節點;使用者端請求可以傳送到叢集的任何節點(每個節點都知道任意檔案的位置),節點轉發請求並收集資料返回給使用者端。
一個節點可以充當一個或多個角色,預設三個角色都有。
所謂腦裂問題,就是同一個叢集中的不同節點,對於叢集的狀態有了不一樣的理解,比如叢集中存在兩個master,正常情況下我們叢集中只能有一個master節點。如果因為網路的故障,導致一個叢集被劃分成了兩片,每片都有多個node,以及一個master,那麼叢集中就出現了兩個master了。但是因為master是叢集中非常重要的一個角色,主宰了叢集狀態的維護,以及shard的分配,因此如果有兩個master,可能會導致資料異常
分片數指定後不可變,除非重索引,分片對應的儲存實體是索引,分片並不是越多越好,分片多浪費儲存空間、佔用資源、影響效能。
副本數是可以隨時調整的,副本的作用是備份資料保證高可用資料不丟失,高並行的時候參與資料查詢。
這裡我們部署一個3個節點組成的ES叢集,因此也不單獨分節點型別部署,三臺伺服器分別為192.168.5.52 es-node-01、192.168.5.53 es-node-02、192.168.12.27 es-node-03,作業系統版本為CentOS 7.8。
官網支援二進位制部署,也支援使用Docker和K8S部署方式,這裡我們使用二進位制部署方式,使用最新版本8.2.3
# 官方下載
wget https://artifacts.elastic.co/downloads/elasticsearch/elasticsearch-8.2.3-linux-x86_64.tar.gz
# 三臺伺服器都準備好安裝包,進行解壓
tar -xvf elasticsearch-8.2.3-linux-x86_64.tar.gz
# 進入ES目錄,ES安裝包已自帶的JDK17,無需單獨下載安裝JDK
在每一臺伺服器上先做下面環境設定
# 建立es使用者
useradd es
# 授權es使用者
chown -R es:es elasticsearch-8.2.3
vim /etc/security/limits.conf
# 直接末尾新增限制
es soft nofile 65536
es hard nofile 65536
echo vm.max_map_count=262144>> /etc/sysctl.conf
sysctl -p
systemctl stop firewalld
systemctl disable firewalld
cat > /etc/hosts << EOF
192.168.5.52 es-node-01
192.168.5.53 es-node-02
192.168.12.27 es-node-03
EOF
先建立logs和data目錄;ES的叢集名稱設定一樣es-cluster,三臺ES節點的node.name分別為 es-node-01、es-node-02、es-node-03,network.host設定為各自本機的IP地址。修改組態檔資訊為如下vi config/elasticsearch.yml
cluster.name: es-cluster
node.name: es-node-01
node.attr.rack: r1
path.data: /home/commons/elasticsearch-8.2.3/data
path.logs: /home/commons/elasticsearch-8.2.3/logs
network.host: 192.168.5.52
discovery.seed_hosts: ["192.168.5.52", "192.168.5.53", "192.168.12.27"]
cluster.initial_master_nodes: ["192.168.5.52", "192.168.5.53","192.168.12.27"]
xpack.security.enabled: false
xpack.security.transport.ssl.enabled: false
http.cors.enabled: true
http.cors.allow-origin: "*"
http.cors.allow-headers: Authorization,X-Requested-With,Content-Type,Content-Length
# 依次啟動三臺伺服器的ES服務
./bin/elasticsearch -d
存取3臺伺服器9200埠,http://192.168.5.52:9200/ ,如果都看到如下資訊則代表ES啟動成功
再次檢視叢集的健康狀態,http://192.168.5.52:9200/_cat/health
Kibana的版本與ES版本保持一致,也是使用最新的8.2.3。我們在192.168.5.52上部署
# Kibana下載
wget https://artifacts.elastic.co/downloads/kibana/kibana-8.2.3-linux-x86_64.tar.gz
# 解壓檔案
tar -xvf kibana-8.2.3-linux-x86_64.tar.gz
# 授權
chown -R es:es kibana-8.2.3
# 進入Kibana的目錄
cd kibana-8.2.3
vim config/kibana.yml
# 直接再末尾新增以下設定
# 伺服器地址
server.host: "0.0.0.0"
# ES服務IP
elasticsearch.hosts: ["http://192.168.5.52:9200/"]
# 設定中文
i18n.locale: "zh-CN"
# 後臺啟動kibana
nohup ./bin/kibana > logs/kibana.log 2>&1 &
存取Kibana控制檯頁面,http://192.168.5.52:5601/
預設分詞器是不支援中文分詞,我們可以安裝IK分詞器實現中文的分詞
# IK分詞器在GitHub上,下載最新版本8.2.0
wget https://github.com/medcl/elasticsearch-analysis-ik/releases/download/v8.2.0/elasticsearch-analysis-ik-8.2.0.zip
./bin/elasticsearch-plugin install https://github.com/medcl/elasticsearch-analysis-ik/releases/download/v8.2.0/elasticsearch-analysis-ik-8.2.0.zip
# 解壓到elasticsearch目錄下的plugins/ik目錄
unzip elasticsearch-analysis-ik-8.2.0.zip -d ./plugins/ik
由於ik的版本與ES版本不一致,修改解壓目錄到ik下的 plugin-descriptor.properties 檔案中的
elasticsearch.version=8.2.3
如果版本一致也可以直接線上安裝
./bin/elasticsearch-plugin install https://github.com/medcl/elasticsearch-analysis-ik/releases/download/v8.2.0/elasticsearch-analysis-ik-8.2.0.zip
轉化行為(Action)
。下面我們看下幾個常用的Action:
別名
控制寫入的索引是誰。它可用於Hot
階段。Warm
階段。需要注意的是當shink完成後索引名會由原來的<origin-index-name>
變為shrink-<origin-index-name>
.Warm
階段。warm, cold
階段。設定索引生命週期策略和索引模板即可以通過Kibana視覺化介面設定也可以通過ES提供的Rest API介面進行設定,我們先通過Kibaba頁面來設定,首先通過點選左側選單的Management-Stack Management,然後左側選單再點選索引生命週期策略
點選索引生命週期策略頁面的右上角建立策略
這裡如果是測試可以將存在時間設定為分鐘級別,便於觀察,建立完畢後檢視剛建立的demo-log-policy
也可以通過ES提供的Rest API介面進行設定,通過Kibana點選左側選單的Management-開發工具進入控制檯tab頁,然後輸入如下生命週期設定策略,返回結果
PUT _ilm/policy/demo-log-policy
{
"policy": {
"phases": {
"hot": {
"min_age": "0ms",
"actions": {
"rollover": {
"max_size": "200gb",
"max_primary_shard_size": "50gb",
"max_age": "7d"
},
"set_priority": {
"priority": 100
}
}
},
"warm": {
"min_age": "15d",
"actions": {
"set_priority": {
"priority": 50
}
}
},
"cold": {
"min_age": "30d",
"actions": {
"set_priority": {
"priority": 0
}
}
},
"delete": {
"min_age": "60d",
"actions": {
"delete": {
"delete_searchable_snapshot": true
}
}
}
}
}
}
點選索引管理-索引模板,建立模板
驗證模板後提交檢視已建立的模板,建立完成後可以通過在索引宣告週期系結模板,也可以直接在模板裡增加繫結語句設定
當然也可以通過ES提供的Rest API介面進行設定
PUT _index_template/demo-log-template
{
"version": 1,
"priority": 10,
"template": {
"settings": {
"index": {
"lifecycle": {
"name": "demo-log-policy",
"rollover_alias": "demo-log"
},
"number_of_shards": "2",
"number_of_replicas": "1"
}
},
"mappings": {
"_source": {
"excludes": [],
"includes": [],
"enabled": true
},
"_routing": {
"required": false
},
"dynamic": true,
"numeric_detection": false,
"date_detection": true,
"dynamic_date_formats": [
"strict_date_optional_time",
"yyyy/MM/dd HH:mm:ss Z||yyyy/MM/dd Z"
],
"dynamic_templates": []
}
},
"index_patterns": [
"demo-log-*"
],
"_meta": {
"description": "測試索引模板"
}
}
先建立初始索引
PUT demo-log-000001
{
"aliases": {
"demo-log": {
"is_write_index": true
}
}
}
如果前面索引生命週期模板的各個週期保留時間設定較短如為分鐘,手動提交紀錄檔到索引和檢視,需要實時檢視其效果則可以增加如下設定和演示操作
PUT /_cluster/settings
{
"transient": {
"indices.lifecycle.poll_interval": "10s"
}
}
POST /demo-log/_doc
{
"message":"world2"
}
GET /demo-log/_search
{
"query": {
"match_all": {}
}
}
修改設定和啟動,vi config/logstash.conf
input {
beats {
port => 5044
}
}
output {
elasticsearch {
hosts => ["http://192.168.5.52:9200","http://192.168.5.53:9200","http://192.168.12.27:9200"]
index => "%{app_id}"
}
}
FileBeat和Logstash部署和設定可以詳細檢視前面的文章《數倉選型必列入考慮的OLAP列式資料庫ClickHouse(中)》,修改設定和啟動, parsers.multiline實現多行合併一行設定,比如Java異常堆疊紀錄檔列印合並在一行。
vi filebeat.yml
filebeat.inputs:
- type: filestream
id: demo-log
enabled: true
paths:
# Filebeat處理檔案的絕對路徑
- /home/itxs/demo/logs/*.log
# 使用 fields 模組新增欄位
fields:
app_id: demo-log
# 將新增的欄位放在頂級
fields_under_root: true
parsers:
- multiline:
type: pattern
pattern: '^\[[0-9]{4}-[0-9]{2}-[0-9]{2}'
negate: true
match: after
processors:
- drop_fields:
fields: ["log","input","agent","ecs"]
output.logstash:
hosts: ["192.168.12.28:5044"]
採集/home/itxs/demo/logs/目錄的資料,由App產生紀錄檔,然後通過Kibana的資料檢視-建立資料檢視,匹配我們前面建立的索引和別名
最後通過Kibana左側選單的Analytics-Discover選擇demo檢視然後可以搜尋紀錄檔,最後紀錄檔查詢結果如下
**本人部落格網站 **IT小神 www.itxiaoshen.com