ElasticSearch+Kibana on K8s 講解與實(shí)戰(zhàn)操作(版本7.17.3)
一、概述
在 Kubernetes(K8s)上運(yùn)行 Elasticsearch 是一種在容器化環(huán)境中部署和管理 Elasticsearch 集群的常見(jiàn)方法。Elasticsearch 是一款流行的分布式搜索和分析引擎,而 Kubernetes 則提供了一個(gè)出色的平臺(tái),用于編排容器并管理 Elasticsearch 的可伸縮性和容錯(cuò)性。
以下是在 Kubernetes 上部署 Elasticsearch 的一般步驟:
- 安裝 Kubernetes 集群:確保你已經(jīng)運(yùn)行起了 Kubernetes 集群。你可以使用托管的 Kubernetes 服務(wù),如 Google Kubernetes Engine(GKE)、Amazon Elastic Kubernetes Service(EKS),或者使用工具如 Minikube、kubeadm 或 kops 自行部署一個(gè)集群。
- 存儲(chǔ):Elasticsearch 需要持久化存儲(chǔ)來(lái)存儲(chǔ)其數(shù)據(jù)。你可以使用 Kubernetes 的持久卷(PVs)和持久卷聲明(PVCs)來(lái)為 Elasticsearch 數(shù)據(jù)分配存儲(chǔ)。確保選擇適合你需求的存儲(chǔ)解決方案,如 hostPath、本地存儲(chǔ)或網(wǎng)絡(luò)附加存儲(chǔ)(NAS)。
- Elasticsearch YAML 配置:創(chuàng)建一個(gè) YAML 配置文件,用于定義你的 Elasticsearch 集群。此文件應(yīng)包括 Elasticsearch Pod、Service、ConfigMap 和任何所需的環(huán)境變量的規(guī)范。你可以使用官方的 Elasticsearch Helm 圖表或編寫(xiě)自定義的 Kubernetes YAML 文件。
- Pod 反親和性:為了確保高可用性,配置反親和性規(guī)則以防止多個(gè) Elasticsearch Pod 在同一節(jié)點(diǎn)上運(yùn)行。這有助于在不同節(jié)點(diǎn)上分布 Elasticsearch Pod 以提高容錯(cuò)性。
- 服務(wù)發(fā)現(xiàn):使用 Kubernetes Service 來(lái)在內(nèi)部或外部暴露你的 Elasticsearch 集群,具體取決于你的需求。外部訪問(wèn)通常涉及創(chuàng)建 LoadBalancer 或 NodePort 服務(wù),而內(nèi)部訪問(wèn)可能使用 ClusterIP 服務(wù)。
- 密鑰管理:使用 Kubernetes Secrets 來(lái)安全存儲(chǔ)諸如密碼和身份驗(yàn)證令牌等敏感信息。Elasticsearch 需要安全設(shè)置來(lái)控制訪問(wèn)。
- 監(jiān)控和日志記錄:實(shí)施監(jiān)控和日志記錄解決方案,如 Prometheus、Grafana 和 Elasticsearch 自身的監(jiān)控功能,以跟蹤集群的健康和性能。
- 擴(kuò)展和更新:Kubernetes 可以相對(duì)容易地通過(guò)添加或刪除節(jié)點(diǎn)來(lái)水平擴(kuò)展 Elasticsearch 集群。在更新 Elasticsearch 版本或配置時(shí),請(qǐng)確保有適當(dāng)?shù)纳?jí)策略,以最小化中斷。
- 備份和災(zāi)難恢復(fù):建立備份和災(zāi)難恢復(fù)程序,以保護(hù)數(shù)據(jù)和集群的完整性。
- 安全和訪問(wèn)控制:實(shí)施適當(dāng)?shù)陌踩胧?,包括身份?yàn)證、授權(quán)和網(wǎng)絡(luò)策略,以保護(hù)你的 Elasticsearch 集群。
- 測(cè)試:在 Kubernetes 上徹底測(cè)試你的 Elasticsearch 部署,以確保它在不同工作負(fù)載下表現(xiàn)如預(yù)期。
- 文檔:為將來(lái)的參考和你的團(tuán)隊(duì)的利益,記錄你的設(shè)置、配置和部署過(guò)程。
雖然這些步驟提供了在 Kubernetes 上部署 Elasticsearch 的高層次概述,但具體的步驟可能會(huì)根據(jù)你的用例和環(huán)境而有所不同??紤]使用 Kubernetes Operators、Helm 圖表或其他工具來(lái)簡(jiǎn)化在 Kubernetes 中部署和管理 Elasticsearch 集群的過(guò)程。此外,請(qǐng)參考 Elasticsearch 和 Kubernetes 文檔,獲取詳細(xì)的說(shuō)明和最佳實(shí)踐。

二、ElasticSearch 節(jié)點(diǎn)類(lèi)型與作用
Elasticsearch 節(jié)點(diǎn)類(lèi)型和配置在集群的設(shè)計(jì)和性能優(yōu)化中起著關(guān)鍵作用。以下是一些常見(jiàn)的 Elasticsearch 節(jié)點(diǎn)類(lèi)型以及它們的配置示例:
- 主節(jié)點(diǎn) (Master Nodes):
作用:主節(jié)點(diǎn)用于管理集群狀態(tài)、索引創(chuàng)建和分片分配。它們不負(fù)責(zé)數(shù)據(jù)存儲(chǔ)或搜索查詢(xún)。
配置示例:
node.master: true
node.data: false- 數(shù)據(jù)節(jié)點(diǎn) (Data Nodes):
作用:數(shù)據(jù)節(jié)點(diǎn)存儲(chǔ)索引數(shù)據(jù)并執(zhí)行搜索查詢(xún)。
配置示例:
node.master: false
node.data: true- 協(xié)調(diào)節(jié)點(diǎn) (Coordinator Nodes):
作用:協(xié)調(diào)節(jié)點(diǎn)用于接收客戶(hù)端請(qǐng)求,并將其路由到數(shù)據(jù)節(jié)點(diǎn)。配置示例:
node.master: false
node.data: false- 仲裁節(jié)點(diǎn) (Arbitrator Nodes):
作用:仲裁節(jié)點(diǎn)不存儲(chǔ)數(shù)據(jù),但可以參與主節(jié)點(diǎn)選舉。配置示例:
node.master: true
node.data: false- Ingest 節(jié)點(diǎn):
作用:Ingest 節(jié)點(diǎn)用于文檔的預(yù)處理和轉(zhuǎn)換。配置示例:
node.master: false
node.data: false
node.ingest: true- Machine Learning 節(jié)點(diǎn):
作用:Machine Learning 節(jié)點(diǎn)用于運(yùn)行 Elasticsearch 的機(jī)器學(xué)習(xí)任務(wù)。配置示例:
node.ml: true- Transform 節(jié)點(diǎn):
作用:Transform 節(jié)點(diǎn)用于執(zhí)行數(shù)據(jù)轉(zhuǎn)換操作,將結(jié)果存儲(chǔ)在新的索引中。配置示例:
node.transform: true- Remote 節(jié)點(diǎn):
作用:Remote 節(jié)點(diǎn)用于轉(zhuǎn)發(fā)請(qǐng)求到遠(yuǎn)程 Elasticsearch 集群。配置示例:
node.remote_cluster_client: true- Hot-Warm-Cold 節(jié)點(diǎn):
作用:Hot 節(jié)點(diǎn)用于接收實(shí)時(shí)數(shù)據(jù),Warm 節(jié)點(diǎn)用于冷熱數(shù)據(jù)分離,Cold 節(jié)點(diǎn)用于長(zhǎng)期存儲(chǔ)。配置示例:
node.attr.hot: true
node.attr.warm: true
node.attr.cold: true請(qǐng)注意,上述示例是典型的節(jié)點(diǎn)類(lèi)型和配置示例。在實(shí)際的集群配置中,可以根據(jù)需求和性能要求進(jìn)行更詳細(xì)的調(diào)整。配置文件通常是 Elasticsearch 的 elasticsearch.yml,你可以在每個(gè)節(jié)點(diǎn)上的該文件中設(shè)置節(jié)點(diǎn)類(lèi)型和其他相關(guān)配置。根據(jù)需要,你可以將不同的節(jié)點(diǎn)類(lèi)型配置在不同的節(jié)點(diǎn)上,以構(gòu)建具有適當(dāng)角色的 Elasticsearch 集群。同時(shí),還可以使用其他設(shè)置來(lái)調(diào)整內(nèi)存、存儲(chǔ)、網(wǎng)絡(luò)和性能參數(shù),以滿(mǎn)足特定的用例需求。
三、K8s 集群部署
k8s 環(huán)境安裝之前寫(xiě)過(guò)很多文檔,可以參考我以下幾篇文章:
- 【云原生】k8s 離線部署講解和實(shí)戰(zhàn)操作
- 【云原生】k8s 環(huán)境快速部署(一小時(shí)以?xún)?nèi)部署完)
四、ElasticSearch on K8s 開(kāi)始部署
1)下載安裝包
地址:https://artifacthub.io/packages/helm/elastic/elasticsearch
# 添加數(shù)據(jù)源
helm repo add elastic https://helm.elastic.co
# 下載
helm pull elastic/elasticsearch --version 7.17.3
# 解壓
tar -xf elasticsearch-7.17.3.tgz2)構(gòu)建鏡像
Elasticsearch 各版本下載地址:https://www.elastic.co/cn/downloads/past-releases#elasticsearch
這里就不重新構(gòu)建鏡像了,有不知道怎么構(gòu)建鏡像的小伙伴可以給我留言或私信,這里是將遠(yuǎn)程的鏡像推送到我們本地harbor,加速拉取鏡像。
docker pull docker.elastic.co/elasticsearch/elasticsearch:7.17.3
docker tag docker.elastic.co/elasticsearch/elasticsearch:7.17.3 registry.cn-hangzhou.aliyuncs.com/bigdata_cloudnative/elasticsearch:7.17.3
# 上傳鏡像到阿里云鏡像倉(cāng)庫(kù)
docker push registry.cn-hangzhou.aliyuncs.com/bigdata_cloudnative/elasticsearch:7.17.33)修改yaml編排
這里只顯示修改部分,在最后會(huì)提供修改后的git下載地址。
- elasticsearch/values.yaml
image: "registry.cn-hangzhou.aliyuncs.com/bigdata_cloudnative/elasticsearch"
### 去掉這幾行
volumeClaimTemplate:
accessModes: ["ReadWriteOnce"]
resources:
requests:
storage: 30Gi
persistence:
enabled: true
labels:
# Add default labels for the volumeClaimTemplate of the StatefulSet
enabled: false
annotations: {}
accessModes:
- ReadWriteOnce
size: 1Gi
storageClass: "elasticsearch-local-storage"
local:
- name: elasticsearch-0
host: "local-168-182-110"
path: "/opt/bigdata/servers/elasticsearch/data/data1"
- name: elasticsearch-1
host: "local-168-182-111"
path: "/opt/bigdata/servers/elasticsearch/data/data1"
- name: elasticsearch-2
host: "local-168-182-112"
path: "/opt/bigdata/servers/elasticsearch/data/data1"
protocol: http
httpPort: 9200
transportPort: 9300
service:
enabled: true
type: NodePort
nodePort: 30920
httpPortName: http- elasticsearch/templates/storage-class.yaml
kind: StorageClass
apiVersion: storage.k8s.io/v1
metadata:
name: {{ .Values.persistence.storageClass }}
provisioner: kubernetes.io/no-provisioner- elasticsearch/templates/pv.yaml
{{- range .Values.persistence.local }}
---
apiVersion: v1
kind: PersistentVolume
metadata:
name: {{ .name }}
labels:
name: {{ .name }}
spec:
storageClassName: {{ $.Values.persistence.storageClass }}
capacity:
storage: {{ $.Values.persistence.size }}
accessModes:
{{- range $.Values.persistence.accessModes }}
- {{ . | quote }}
{{- end }}
local:
path: {{ .path }}
nodeAffinity:
required:
nodeSelectorTerms:
- matchExpressions:
- key: kubernetes.io/hostname
operator: In
values:
- {{ .host }}
---
{{- end }}- elasticsearch/templates/statefulset.yaml
spec:
volumeClaimTemplates:
spec:
# 去掉這行
{{ toYaml .Values.volumeClaimTemplate | indent 6 }}
# 新增以下內(nèi)容:
accessModes:
{{- range .Values.persistence.accessModes }}
- {{ . | quote }}
{{- end }}
resources:
requests:
storage: {{ .Values.persistence.size | quote }}
{{- if .Values.persistence.storageClass }}
{{- if (eq "-" .Values.persistence.storageClass) }}
storageClassName: ""
{{- else }}
storageClassName: "{{ .Values.persistence.storageClass }}"
{{- end }}
{{- end }}4)開(kāi)始部署
# 如果沒(méi)有掛載目錄,則需要提前創(chuàng)建,也可自己更換掛載目錄
# 先創(chuàng)建本地存儲(chǔ)目錄
mkdir -p /opt/bigdata/servers/elasticsearch/data/data1
chmod -R 777 /opt/bigdata/servers/elasticsearch/data/data1
helm install my-elasticsearch ./elasticsearch -n elasticsearch --create-namespace
# 查看
helm get notes my-elasticsearch -n elasticsearch
kubectl get pods,svc -n elasticsearch -owide
# 查看日志
kubectl logs -f elasticsearch-master-0 -n elasticsearchnotes,可以獲取用戶(hù)密碼
NAME: my-elasticsearch
LAST DEPLOYED: Sat Sep 9 22:01:15 2023
NAMESPACE: elasticsearch
STATUS: deployed
REVISION: 1
NOTES:
1. Watch all cluster members come up.
$ kubectl get pods --namespace=elasticsearch -l app=elasticsearch-master -w
2. Retrieve elastic user's password.
$ kubectl get secrets --namespace=elasticsearch elasticsearch-master-credentials -ojsnotallow='{.data.password}' | base64 -d
3. Test cluster health using Helm test.
$ helm --namespace=elasticsearch test my-elasticsearch5)測(cè)試
賬號(hào):elastic密碼獲?。?/p>
kubectl get secrets --namespace=elasticsearch elasticsearch-master-credentials -ojsnotallow='{.data.password}' | base64 -dcurl 訪問(wèn):
curl http://192.168.182.110:30920/
curl http://192.168.182.110:30920/_cat/nodes
curl http://192.168.182.110:30920/_cat/health?pretty
圖片
6)elasticsearch-head
elasticsearch-head GitHub下載地址:https://github.com/mobz/elasticsearch-headGoogle 瀏覽器 elasticsearch-head 插件:
鏈接:https://pan.baidu.com/s/1kYcTjBDPmSWVzsku2hEW7w?pwd=67v4提取碼:67v4
7)卸載
helm uninstall my-elasticsearch -n elasticsearch
# 刪除數(shù)據(jù)
rm -fr /opt/bigdata/servers/elasticsearch/data/data1/*五、Kibana 編排部署
地址:https://artifacthub.io/packages/helm/bitnami/kibana?modal=install
1)下載安裝包
helm repo add bitnami https://charts.bitnami.com/bitnami
helm pull bitnami/kibana --version 10.2.6
tar -xf kibana-10.2.6.tgz2)構(gòu)建鏡像
這里也不重新構(gòu)建鏡像了,只是將鏡像推送到本地harbor加速,對(duì)構(gòu)建鏡像不清楚的可以留言或私信。Kibana 和 Elasticsearch 需保證所用版本互相兼容,版本兼容性:https://www.elastic.co/cn/support/matrix#matrix_compatibility
圖片
docker pull docker.io/bitnami/kibana:7.17.3
docker tag docker.io/bitnami/kibana:7.17.3 registry.cn-hangzhou.aliyuncs.com/bigdata_cloudnative/kibana:7.17.3
# 上傳鏡像
docker push registry.cn-hangzhou.aliyuncs.com/bigdata_cloudnative/kibana:7.17.33)修改yaml編排
- kibana/values.yaml
image:
registry: registry.cn-hangzhou.aliyuncs.com/bigdata_cloudnative
repository: kibana
tag: 7.17.3
replicaCount: 1
persistence:
enabled: true
accessModes:
- ReadWriteOnce
size: 10Gi
storageClass: "kibana-local-storage"
local:
- name: kibana-0
host: "local-168-182-111"
path: "/opt/bigdata/servers/kibana/data/data1"
service:
ports:
http: 5601
type: NodePort
nodePorts:
http: "30601"
elasticsearch:
hosts:
- elasticsearch-master.elasticsearch
port: "9200"- kibana/templates/values.yaml
{{- range .Values.persistence.local }}
---
apiVersion: v1
kind: PersistentVolume
metadata:
name: {{ .name }}
labels:
name: {{ .name }}
spec:
storageClassName: {{ $.Values.persistence.storageClass }}
capacity:
storage: {{ $.Values.persistence.size }}
accessModes:
{{- range $.Values.persistence.accessModes }}
- {{ . | quote }}
{{- end }}
local:
path: {{ .path }}
nodeAffinity:
required:
nodeSelectorTerms:
- matchExpressions:
- key: kubernetes.io/hostname
operator: In
values:
- {{ .host }}
---
{{- end }}- kibana/templates/storage-class.yaml
kind: StorageClass
apiVersion: storage.k8s.io/v1
metadata:
name: {{ .Values.persistence.storageClass }}
provisioner: kubernetes.io/no-provisioner4)開(kāi)始部署
# 先創(chuàng)建本地存儲(chǔ)目錄
mkdir -p /opt/bigdata/servers/kibana/data/data1
chmod -R 777 /opt/bigdata/servers/kibana/data/data1
helm install my-kibana ./kibana -n kibana --create-namespace
# 查看
helm get notes my-kibana -n kibana
kubectl get pods,svc -n kibana -owide5)測(cè)試驗(yàn)證
kibana web 地址:http://192.168.182.110:30601/
圖片
6)卸載
helm uninstall my-kibana -n kibana
kubectl delete ns kibana --force
ssh local-168-182-111 rm -fr /opt/bigdata/servers/kibana/data/data1/*六、Elasticsearch7 常見(jiàn)API示例講解
1)ES7 集群狀態(tài)信息 API
要查看 Elasticsearch 7 集群的狀態(tài)和信息,您可以使用以下 API 操作:
1、獲取集群健康狀態(tài)
使用 GET 請(qǐng)求來(lái)獲取集群的健康狀態(tài)。以下是一個(gè)示例:
GET /_cluster/health這個(gè)請(qǐng)求將返回有關(guān)集群健康狀態(tài)的信息,包括集群名稱(chēng)、狀態(tài)(例如:green、yellow、red)、節(jié)點(diǎn)數(shù)量、分片數(shù)量、副本數(shù)量等。
2、獲取節(jié)點(diǎn)信息
使用 GET 請(qǐng)求來(lái)獲取有關(guān)集群中節(jié)點(diǎn)的信息。以下是一個(gè)示例:
GET /_cat/nodes?v這個(gè)請(qǐng)求將返回節(jié)點(diǎn)的詳細(xì)信息,包括節(jié)點(diǎn)的名稱(chēng)、IP 地址、節(jié)點(diǎn)角色(主節(jié)點(diǎn)、數(shù)據(jù)節(jié)點(diǎn)、協(xié)調(diào)節(jié)點(diǎn)等)等。
3、獲取索引信息
使用 GET 請(qǐng)求來(lái)獲取有關(guān)集群中索引的信息。以下是一個(gè)示例:
GET /_cat/indices?v這個(gè)請(qǐng)求將返回索引的詳細(xì)信息,包括索引的名稱(chēng)、狀態(tài)、文檔數(shù)量、分片數(shù)量、副本數(shù)量等。
4、獲取集群設(shè)置信息
使用 GET 請(qǐng)求來(lái)獲取集群的設(shè)置信息。以下是一個(gè)示例:
GET /_cluster/settings這個(gè)請(qǐng)求將返回有關(guān)集群設(shè)置的信息,包括索引的分片和副本配置、分配策略等。
5、獲取節(jié)點(diǎn)統(tǒng)計(jì)信息
使用 GET 請(qǐng)求來(lái)獲取集群中節(jié)點(diǎn)的統(tǒng)計(jì)信息。以下是一個(gè)示例:
GET /_nodes/stats這個(gè)請(qǐng)求將返回有關(guān)節(jié)點(diǎn)的各種統(tǒng)計(jì)信息,包括內(nèi)存使用、CPU 使用、磁盤(pán)使用等。
2)POST 與 PUT 請(qǐng)求方式的區(qū)別
在 Elasticsearch 7 中,POST 和 PUT 請(qǐng)求的區(qū)別涉及到文檔的創(chuàng)建和更新。以下是它們之間的主要區(qū)別:
1、POST 請(qǐng)求
- POST 請(qǐng)求用于創(chuàng)建新文檔或?qū)⑿挛臋n添加到索引中。
- 當(dāng)使用 POST 請(qǐng)求創(chuàng)建文檔時(shí),Elasticsearch 會(huì)自動(dòng)生成文檔的唯一 ID。
- 如果在索引中已經(jīng)存在具有指定 ID 的文檔,POST 請(qǐng)求會(huì)失敗,不會(huì)覆蓋已存在的文檔。
- POST 請(qǐng)求的常見(jiàn)用途包括將新文檔添加到索引中,而不必指定文檔的 ID。
示例使用 POST 請(qǐng)求創(chuàng)建文檔:
POST /my_index/_doc
{
"name": "John Doe",
"age": 30
}2、PUT 請(qǐng)求
- PUT 請(qǐng)求用于創(chuàng)建新文檔或更新現(xiàn)有文檔。
- 當(dāng)使用 PUT 請(qǐng)求創(chuàng)建文檔時(shí),需要明確指定文檔的唯一 ID。如果具有相同 ID 的文檔已存在,則 PUT 請(qǐng)求將覆蓋該文檔。
- PUT 請(qǐng)求的常見(jiàn)用途包括顯式地創(chuàng)建文檔并指定其 ID,以及更新現(xiàn)有文檔的內(nèi)容。
示例使用 PUT 請(qǐng)求創(chuàng)建或更新文檔:
PUT /my_index/_doc/1
{
"name": "Jane Smith",
"age": 35
}總結(jié):
- 使用 POST 請(qǐng)求時(shí),Elasticsearch 將為您生成文檔的 ID(如果未指定)并將文檔添加到索引中。
- 使用 PUT 請(qǐng)求時(shí),您需要明確指定文檔的 ID,并且可以用它來(lái)創(chuàng)建新文檔或覆蓋現(xiàn)有文檔。
- 在某些情況下,根據(jù)需要選擇 POST 或 PUT 請(qǐng)求來(lái)執(zhí)行創(chuàng)建和更新操作。
3)ES7 增刪改查 API
在 Elasticsearch 7 中,您可以使用 RESTful API 執(zhí)行索引數(shù)據(jù)(文檔)的增刪改查操作。以下是一些常見(jiàn)的 Elasticsearch 操作示例及其講解:
1、添加文檔(Indexing)
要將文檔添加到 Elasticsearch 索引中,可以使用 POST 或 PUT 請(qǐng)求。以下是一個(gè)示例:
POST /my_index/_doc/1
{
"name": "John Doe",
"age": 30
}這個(gè)示例使用 POST 請(qǐng)求將一個(gè)文檔添加到名為 my_index 的索引中。文檔的 ID 設(shè)置為 1。如果您使用 PUT 請(qǐng)求,也可以指定文檔的 ID。
2、獲取文檔(Retrieving)
要按 ID 獲取文檔,可以使用 GET 請(qǐng)求。以下是一個(gè)示例:
GET /my_index/_doc/1這個(gè)示例使用 GET 請(qǐng)求按文檔 ID 1 從索引 my_index 中獲取文檔。
3、更新文檔(Updating)
要更新現(xiàn)有文檔,可以使用 POST 或 PUT 請(qǐng)求。以下是一個(gè)示例:
POST /my_index/_doc/1/_update
{
"doc": {
"age": 31
}
}這個(gè)示例使用 POST 請(qǐng)求來(lái)更新文檔 ID 1 中的 age 字段的值為 31。
4、刪除文檔(Deleting)
要?jiǎng)h除文檔,可以使用 DELETE 請(qǐng)求。以下是一個(gè)示例:
DELETE /my_index/_doc/14)ES7 模板 API
Elasticsearch 7 中引入了索引模板(Index Templates) API,允許您定義模板來(lái)自動(dòng)應(yīng)用于新索引的設(shè)置、映射和別名。這對(duì)于確保索引的一致性和管理大規(guī)模的數(shù)據(jù)非常有用。以下是 Elasticsearch 7 中索引模板 API 的一些示例和解釋?zhuān)?/p>
1、創(chuàng)建索引模板(Put Index Template)
使用 PUT 請(qǐng)求創(chuàng)建索引模板,指定模板的名稱(chēng)和設(shè)置。以下是一個(gè)示例:
PUT /_index_template/my_template
{
"index_patterns": ["logs-*"],
"template": {
"settings": {
"number_of_shards": 3,
"number_of_replicas": 2
},
"mappings": {
"properties": {
"timestamp": {
"type": "date"
},
"message": {
"type": "text"
}
}
}
}
}- 上述示例創(chuàng)建了一個(gè)名為 my_template 的索引模板,該模板將自動(dòng)應(yīng)用于匹配 logs-* 模式的所有索引。
- 模板定義了索引的設(shè)置(分片數(shù)量和副本數(shù)量)和映射(字段類(lèi)型和屬性)。
2、獲取索引模板(Get Index Template)
使用 GET 請(qǐng)求獲取特定索引模板的信息。以下是一個(gè)示例:
GET /_index_template/my_template這個(gè)請(qǐng)求將返回名為 my_template 的索引模板的詳細(xì)信息。
3、列出所有索引模板(List All Index Templates)
使用 GET 請(qǐng)求列出所有已定義的索引模板。以下是一個(gè)示例:
GET /_index_template4、刪除索引模板(Delete Index Template)
使用 DELETE 請(qǐng)求刪除特定索引模板。以下是一個(gè)示例:
DELETE /_index_template/my_template5)ES7 冷熱數(shù)據(jù)設(shè)置
Elasticsearch 提供了數(shù)據(jù)熱(hot)和冷(cold)階段的設(shè)置,以幫助優(yōu)化數(shù)據(jù)存儲(chǔ)和查詢(xún)性能,特別是對(duì)于大規(guī)模的時(shí)間序列數(shù)據(jù)(如日志、度量和事件數(shù)據(jù))非常有用。以下是設(shè)置冷熱數(shù)據(jù)的一般步驟和一些配置選項(xiàng):
1、創(chuàng)建索引模板(Index Template)
首先,您可以創(chuàng)建一個(gè)索引模板,以定義新索引的設(shè)置和分配策略,以及索引在不同階段之間的遷移策略。在模板中,您可以指定哪些條件應(yīng)將索引劃分為熱、溫和冷(或其他階段),并定義相應(yīng)的設(shè)置。
以下是一個(gè)示例索引模板,定義了熱、溫和冷階段的索引分配策略:
PUT /_index_template/logs_template
{
"index_patterns": ["logs-*"],
"template": {
"settings": {
"number_of_shards": 3,
"number_of_replicas": 1,
"index.lifecycle.name": "logs_policy",
"index.lifecycle.rollover_alias": "logs-alias",
"index.routing.allocation.require.box_type": "hot"
},
"mappings": {
"properties": {
"timestamp": {
"type": "date"
},
"message": {
"type": "text"
}
}
}
}
}- 上述示例創(chuàng)建了一個(gè)名為 logs_template 的索引模板,該模板將自動(dòng)應(yīng)用于匹配 logs-* 模式的所有索引。
- 模板定義了索引的設(shè)置,包括分片數(shù)量、副本數(shù)量、生命周期策略、別名以及索引的映射。
2、創(chuàng)建生命周期策略(Lifecycle Policy)
接下來(lái),創(chuàng)建一個(gè)生命周期策略,以定義索引在不同階段之間的遷移條件和操作。
PUT /_ilm/policy/logs_policy
{
"policy": {
"phases": {
"hot": {
"min_age": "0ms",
"actions": {
"rollover": {
"max_size": "50GB",
"max_age": "30d"
}
}
},
"warm": {
"min_age": "30d",
"actions": {
"forcemerge": {
"max_num_segments": 1
}
}
},
"cold": {
"min_age": "90d",
"actions": {
"freeze": {},
"read_only": {}
}
},
"delete": {
"min_age": "365d",
"actions": {
"delete": {}
}
}
}
}
}- 上述示例創(chuàng)建了一個(gè)名為 logs_policy 的生命周期策略,定義了四個(gè)不同的生命周期階段:熱、溫、冷和刪除。
- 每個(gè)階段都有不同的遷移條件和操作,例如,熱階段在索引大小達(dá)到50GB或存在30天后執(zhí)行滾動(dòng)操作。
3、創(chuàng)建索引并將其分配到不同的節(jié)點(diǎn):
現(xiàn)在,當(dāng)您創(chuàng)建新的日志索引時(shí),它將自動(dòng)應(yīng)用索引模板和生命周期策略,以及分配到熱節(jié)點(diǎn)。
4、自動(dòng)數(shù)據(jù)遷移:
一旦索引和生命周期策略配置完成,Elasticsearch 將自動(dòng)執(zhí)行索引的遷移操作。數(shù)據(jù)將根據(jù)生命周期策略從一個(gè)階段遷移到另一個(gè)階段,以?xún)?yōu)化性能和降低存儲(chǔ)成本。
這個(gè)設(shè)置允許您根據(jù)數(shù)據(jù)的訪問(wèn)模式和重要性來(lái)優(yōu)化 Elasticsearch 集群的性能和成本效益。新的日志數(shù)據(jù)將從熱存儲(chǔ)階段自動(dòng)遷移到溫存儲(chǔ)和冷存儲(chǔ)階段,從而使熱節(jié)點(diǎn)保持高性能,同時(shí)降低了冷數(shù)據(jù)的存儲(chǔ)成本。
6)ES7 數(shù)據(jù)平衡 API
雖然不推薦手動(dòng)分片遷移,但您可以使用以下 API 將分片從一個(gè)節(jié)點(diǎn)遷移到另一個(gè)節(jié)點(diǎn):
POST /_cluster/reroute
{
"commands": [
{
"move": {
"index": "your_index",
"shard": 0,
"from_node": "source_node",
"to_node": "destination_node"
}
}
]
}這個(gè)操作需要非常小心,因?yàn)殄e(cuò)誤的分片移動(dòng)可能會(huì)導(dǎo)致數(shù)據(jù)丟失或集群不穩(wěn)定。因此,只有在非常特殊的情況下才應(yīng)該手動(dòng)干預(yù)分片分配。
7)ES7 禁用數(shù)據(jù)平衡 API
在 Elasticsearch 7 中,默認(rèn)情況下,數(shù)據(jù)平衡是自動(dòng)啟用的,它確保數(shù)據(jù)均勻分布在集群的各個(gè)節(jié)點(diǎn)和分片之間。然而,有時(shí)您可能需要禁用數(shù)據(jù)平衡,尤其是在特定情況下,例如集群維護(hù)期間或者出現(xiàn)異常情況時(shí)。以下是禁用數(shù)據(jù)平衡的方法:
1、設(shè)置節(jié)點(diǎn)屬性
Elasticsearch 允許您為節(jié)點(diǎn)設(shè)置屬性(node attributes)。您可以通過(guò)設(shè)置節(jié)點(diǎn)的屬性來(lái)控制數(shù)據(jù)平衡的行為。例如,您可以為節(jié)點(diǎn)設(shè)置一個(gè)自定義屬性,然后在進(jìn)行集群維護(hù)期間,通過(guò)將節(jié)點(diǎn)標(biāo)記為不可分配(disable allocation)來(lái)禁用數(shù)據(jù)平衡。
PUT /_cluster/settings
{
"transient": {
"cluster.routing.allocation.exclude._name": "node_name"
}
}在上面的示例中,將 node_name 替換為您要禁用數(shù)據(jù)平衡的節(jié)點(diǎn)名稱(chēng)。
2、暫時(shí)禁用數(shù)據(jù)平衡
您可以使用以下 API 暫時(shí)禁用數(shù)據(jù)平衡,直到您重新啟用它。這可以在進(jìn)行特定維護(hù)操作時(shí)使用。
PUT /_cluster/settings
{
"transient": {
"cluster.routing.allocation.enable": "none"
}
}這將暫時(shí)禁用數(shù)據(jù)平衡,直到您通過(guò)以下方式重新啟用它:
PUT /_cluster/settings
{
"transient": {
"cluster.routing.allocation.enable": "all"
}
}3、集群維護(hù)模式
Elasticsearch 7 引入了集群維護(hù)模式(cluster maintenance mode),允許您更方便地執(zhí)行維護(hù)操作而不影響數(shù)據(jù)平衡。您可以將集群設(shè)置為維護(hù)模式,然后執(zhí)行維護(hù)操作,最后再將集群恢復(fù)到正常狀態(tài)。
啟用維護(hù)模式:
PUT /_cluster/settings
{
"transient": {
"cluster.routing.allocation.cluster_maintenance_mode": "enable"
}
}執(zhí)行維護(hù)操作后,禁用維護(hù)模式:
PUT /_cluster/settings
{
"transient": {
"cluster.routing.allocation.cluster_maintenance_mode": "disable"
}
}請(qǐng)注意,在維護(hù)模式下,Elasticsearch 會(huì)暫時(shí)禁用自動(dòng)分片分配和數(shù)據(jù)平衡,以便您可以執(zhí)行維護(hù)操作。
無(wú)論您使用哪種方法,都應(yīng)小心使用禁用數(shù)據(jù)平衡的功能,并確保在維護(hù)操作完成后重新啟用它,以保持集群的健康狀態(tài)。






































