介 紹
elasticsearch是一個基于apache lucene并由elastic開發的開源搜尋引擎。它可擴充性、彈性和性能等特性都十分優越,全球各地的公司,包括mozilla、facebook、github、netflix、ebay、紐約時報等,每天都在使用它。elasticsearch是大型資料集最受歡迎的分析平台之一,所有你能看到包含搜尋引擎的地方都幾乎有elasticsearch的存在。它在操作資料時使用基于文檔的方法,并且在使用者執行搜尋時幾乎可以實時解析它。它以json格式存儲資料,并按索引和類型組織資料。
如果我們在傳統關系資料庫的元件和elasticsearch的元件之間進行類比,它們看起來像這樣:
資料庫或表 → 索引
行/列 → 包含屬性的文檔
elasticsearch的優勢
它源自apache lucene,提供了極其強大的全文搜尋功能。
它使用基于文檔的體系結構,将複雜的現實世界實體存儲為結構化json文檔。預設情況下,它會索引所有字段,這在搜尋時提供了巨大的性能。
它不使用帶有索引的模式。文檔通過包含它們來添加新字段,進而可以自由添加、删除或更改相關字段,而無需與傳統資料庫模式更新相關的停機時間。
它對文檔執行語言搜尋,傳回與搜尋條件比對的文檔。它使用tfidf算法對結果進行評分,使更多相關文檔在結果清單中更高。
它允許模糊搜尋,即使拼寫錯誤的搜尋詞也可以幫助查找結果。
它支援實時搜尋自動完成,在使用者鍵入搜尋查詢時傳回結果。
它使用restful api,通過簡單、輕量級的界面展示其功能。
elasticsearch以極快的速度執行複雜查詢。它還緩存查詢,傳回與緩存過濾器比對的其他請求的緩存結果。
它可以水準擴充,進而可以擴充資源并平衡叢集節點之間的負載。
它将索引分解為碎片,每個碎片具有任意數量的副本。每個節點都知道叢集中每個文檔的位置,并在必要時在内部路由請求以檢索資料。
術 語
elasticsearch使用特定術語來定義其元件。
叢集:一起工作的節點集合。
節點:作為叢集一部分的單個伺服器,存儲資料,并參與叢集的索引和搜尋功能。
索引:具有類似特征的文檔集合。
文檔:可以編制索引的基本資訊單元。
shard(分片):索引分為多個部分,稱為分片,允許索引水準縮放。
副本:索引分片的副本
前期準備
要完成此次demo,我們至少需要以下之一:
已配置好的rancher部署和kubernetes叢集,或
兩個節點,在其中部署rancher和kubernetes,或
用于部署rancher的節點和在托管提供程式(如gke)中運作的kubernetes叢集。
本文使用google cloud platform,但您也可以使用任何其他提供商或基礎架構。
啟動rancher
如果您還沒有部署rancher,請先啟動一個,具體步驟可以參考此處快速上手指南:
https://rancher.com/quick-start/
啟動叢集
根據這一指南,使用rancher設定和配置最适合您的環境的叢集:
https://rancher.com/docs/rancher/v2.x/en/cluster-provisioning/
部署elasticsearch
如果您已經習慣了kubectl,可以直接使用manifest。如果您更喜歡使用rancher使用者界面,請繼續往下閱讀。
我們将elasticsearch部署為具有兩個服務的statefulset:一個是用于與pod通信的headless service,另一個則用于從kubernetes叢集外部與elasticsearch互動。
svc-cluster.yaml
svc-loadbalancer.yaml
es-sts-deployment.yaml
apiversion: v1
kind: configmap
metadata:
name: es-config
data:
elasticsearch.yml:|
cluster.name: my-elastic-cluster
network.host: "0.0.0.0"
bootstrap.memory_lock: false
discovery.zen.ping.unicast.hosts: elasticsearch-cluster
discovery.zen.minimum_master_nodes: 1
xpack.security.enabled: false
xpack.monitoring.enabled: false
es_java_opts: -xms512m -xmx512m
---
apiversion: apps/v1beta1
kind: statefulset
name: esnode
spec:
servicename: elasticsearch
replicas: 2
updatestrategy:
type: rollingupdate
template:
metadata:
labels:
app: es-cluster
spec:
securitycontext:
fsgroup: 1000
initcontainers:
- name: init-sysctl
image: busybox
imagepullpolicy: ifnotpresent
securitycontext:
privileged: true
command: ["sysctl", "-w", "vm.max_map_count=262144"]
containers:
- name: elasticsearch
resources:
requests:
memory: 1gi
privileged: true
runasuser: 1000
capabilities:
add:
- ipc_lock
- sys_resource
image: docker.elastic.co/elasticsearch/elasticsearch:6.5.0
env:
- name: es_java_opts
valuefrom:
configmapkeyref:
name: es-config
key: es_java_opts
readinessprobe:
httpget:
scheme: http
path: /_cluster/health?local=true
port: 9200
initialdelayseconds: 5
ports:
- containerport: 9200
name: es-http
- containerport: 9300
name: es-transport
volumemounts:
- name: es-data
mountpath: /usr/share/elasticsearch/data
- name: elasticsearch-config
mountpath: /usr/share/elasticsearch/config/elasticsearch.yml
subpath: elasticsearch.yml
volumes:
configmap:
name: es-config
items:
- key: elasticsearch.yml
path: elasticsearch.yml
volumeclaimtemplates:
- metadata:
name: es-data
accessmodes: [ "readwriteonce" ]
resources:
requests:
storage: 5gi
$ kubectl apply -f es-sts-deployment.yaml
configmap/es-config created
statefulset.apps/esnode created
通過rancher ui部署elasticsearch
如果您想的話,可以通過rancher ui将上述每個manifest都導入您的叢集。下面的螢幕截圖顯示了每個過程。
導入 svc-cluster.yaml
導入 svc-loadbalancer.yaml
導入 es-sts-deployment.yaml
檢索負載均衡器ip
您後期會需要我們所部署的負載均衡器的位址的。您可以通過kubectl或ui 檢索此内容。
使用cli
$ kubectl get svc elasticsearch-loadbalancer
name type cluster-ip external-ip port(s) age
elasticsearch-loadbalancer loadbalancer 10.59.246.186 35.204.239.246 80:30604/tcp 33m
使用ui

測試叢集
使用我們在上一步中檢索的位址來查詢叢集以擷取基本資訊。
查詢叢集以擷取有關其節點的資訊。master列中的星号突出顯示目前主節點。
檢查可用的指數:
因為這是一個全新的安裝,是以它沒有任何以前的索引或資料。為了繼續本教程,我們将注入一些我們稍後可以使用的示例資料。我們将使用的檔案可從elastic網站獲得:
https://www.elastic.co/guide/en/kibana/current/tutorial-load-dataset.html
下載下傳它們,然後使用以下指令加載它們:
當我們重新檢查索引時,我們将看到我們有五個新的索引資料。
$ curl 35.204.239.246/_cat/indices?v
health status index uuid pri rep docs.count docs.deleted store.size pri.store.size
green open logstash-2015.05.20 mfdwjxnstish0z9vr0at3g 5 1 4750 0 49.9mb 25.2mb
green open logstash-2015.05.18 llhv2nzvtog9mzlpkag9sg 5 1 4631 0 46.5mb 23.5mb
green open logstash-2015.05.19 pqnnvugxtyadsfmcqzwblq 5 1 4624 0 48.2mb 24.2mb
green open shakespeare rwl3xbgmqtm8b3v7gfetzq 5 1 111396 0 46mb 23.1mb
green open bank z0wvgsbrsig2cqwrxwacog 5 1 1000 0 949.2kb 474.6kb
其中每個都包含不同類型的文檔。對于shakespeare索引,我們可以搜尋遊戲的名稱。對于logstash-2015.05.19索引,我們可以根據ip位址查詢和過濾資料,對于bank索引,我們可以搜尋有關特定帳戶的資訊。
結 論
elasticsearch非常強大。它既簡單又複雜——易于部署和使用,而與資料互動的方式也很複雜。
本文向您展示了如何使用rancher和kubernetes 部署它以及如何通過restful api進行查詢的基礎知識。
如果您希望探索在日常情況下使用elasticsearch的方法,我們建議您探索elk堆棧的其他部分:kibana、logstash和beats。這些工具完善了elasticsearch部署,使其可用于存儲、檢索和可視化來自系統和應用程式的各種資料。