ELK代表的是 elasticsearch + logstash數據採集 + kibana可視化
一、elasticsearch簡介
簡介
Elasticsearch 是一個開源的分佈式搜索分析引擎,建立在一個全文搜索引擎庫 Apache Lucene基礎之上。
Elasticsearch 不僅僅是 Lucene,並且也不僅僅只是一個全文搜索引擎:
- 一個分佈式的實時文檔存儲,每個字段 可以被索引與搜索
- 一個分佈式實時分析搜索引擎
- 能勝任上百個服務節點的擴展,並支持 PB 級別的結構化或者非結構化數據
基礎模塊
基礎模塊
- cluster:管理集羣狀態,維護集羣層面的配置信息。
- alloction:封裝了分片分配相關的功能和策略。
- discovery:發現集羣中的節點,以及選舉主節點。
- gateway:對收到master廣播下來的集羣狀態數據的持久化存儲。
- indices:管理全局級的索引設置。
- http:允許通過JSON over HTTP的方式訪問ES的API。
- transport:用於集羣內節點之間的內部通信。
- engine:封裝了對Lucene的操作及translog的調用。
應用場景
elasticsearch應用場景:
- 信息檢索
- 日誌分析
- 業務數據分析
- 數據庫加速
- 運維指標監控
軟件下載:https://elasticsearch.cn/download/
二、elasticsearch安裝與配置
實驗主機準備:
主機 | ip |
---|---|
server1 | 172.25.1.1 |
server2 | 172.25.1.2 |
server3 | 172.25.1.3 |
首先在server1部署elasticsearch。
[root@server1 ~]# ls
elasticsearch-7.6.1-x86_64.rpm
[root@server1 ~]# rpm -ivh elasticsearch-7.6.1-x86_64.rpm
編輯配置文件:
[root@server1 ~]# cd /etc/elasticsearch/
[root@server1 elasticsearch]# vim elasticsearch.yml
cluster.name: my-es #集羣名稱
node.name: server1 #主機名需要解析
path.data: /var/lib/elasticsearch #數據目錄
path.logs: /var/log/elasticsearch #日誌目錄
bootstrap.memory_lock: true #鎖定內存分配
network.host: 172.25.1.1 #主機ip
http.port: 9200 #http服務端口
cluster.initial_master_nodes: ["server1"]
修改系統限制:
[root@server1 elasticsearch]# vim /etc/security/limits.conf
elasticsearch soft memlock unlimited
elasticsearch hard memlock unlimited
elasticsearch - nofile 65535
elasticsearch - nproc 4096
# vim jvm.options
-Xms1g
-Xmx1g
Xmx設置不超過物理RAM的50%,以確保有足夠的物理RAM留給內核文件系統緩存。但不要超過32G。
修改systemd啓動文件:
[root@server1 elasticsearch]# vim /usr/lib/systemd/system/elasticsearch.service
[Service] #在service語句塊下添加
LimitMEMLOCK=infinity
啓動elasticsearch:
[root@server1 elasticsearch]# systemctl daemon-reload
[root@server1 elasticsearch]# systemctl start elasticsearch.service
注意這裏需要將swap關閉:
[root@server1 elasticsearch]# swapoff -a
[root@server1 elasticsearch]# vim /etc/fstab
[root@server1 elasticsearch]# cat /etc/fstab
#/dev/mapper/rhel-swap swap swap defaults 0 0
開啓後查看端口,可以看出9200端口已經打開:
[root@server1 ~]# netstat -antlp | grep 9200
tcp6 0 0 172.25.1.1:9200 :::* LISTEN 13502/java
這時可以在瀏覽器訪問這個端口:
可以看出elasticsearch配置成功。
三、使用圖形界面操作elasticsearch
上面的elasticsearch安裝好了之後就可以通過api來進行調用,也可以安裝一個插件來進行圖形化操作:
下載與解壓:
[root@server1 ~]# yum install wget -y
[root@server1 ~]# wget https://github.com/mobz/elasticsearch-head/archive/master.zip
[root@server1 ~]# ls
elasticsearch-7.6.1-x86_64.rpm master.zip
[root@server1 ~]# yum install unzip.x86_64 -y
[root@server1 ~]# unzip master.zip
[root@server1 ~]# ls
elasticsearch-7.6.1-x86_64.rpm elasticsearch-head-master master.zip
head插件本質上是一個nodejs的工程,因此需要安裝node:
[root@server1 ~]# wget https://mirrors.tuna.tsinghua.edu.cn/nodesource/rpm_9.x/el/7/x86_64/nodejs-9.11.2-1nodesource.x86_64.rpm
[root@server1 ~]# rpm -ivh nodejs-9.11.2-1nodesource.x86_64.rpm
[root@server1 ~]# node -v
v9.11.2
[root@server1 ~]# npm -v
5.6.0
說明nodejs安裝成功。
更換npm源安裝:
[root@server1 ~]# cd elasticsearch-head-master/
[root@server1 elasticsearch-head-master]# npm install --registry=https://registry.npm.taobao.org
在進行到這一步時比較慢,我們可以ctrl+c
取消後手動下載phantomjs-2.1.1-linux-x86_64.tar.bz2
:
[root@server1 phantomjs]# yum install -y bzip2
[root@server1 phantomjs]# tar jxf phantomjs-2.1.1-linux-x86_64.tar.bz2
[root@server1 phantomjs]# ls
phantomjs-2.1.1-linux-x86_64
phantomjs-2.1.1-linux-x86_64.tar.bz2
[root@server1 phantomjs]# cd phantomjs-2.1.1-linux-x86_64
[root@server1 phantomjs-2.1.1-linux-x86_64]# ls
bin ChangeLog examples LICENSE.BSD README.md third-party.txt
[root@server1 phantomjs-2.1.1-linux-x86_64]# cd bin/
[root@server1 bin]# ls
phantomjs
[root@server1 bin]# mv phantomjs /usr/local/bin/
[root@server1 bin]# cd
[root@server1 ~]# yum install fontconfig-2.13.0-4.3.el7.x86_64 -y
安裝好之後就可以使用phantomjs命令:
[root@server1 ~]# phantomjs
phantomjs>
再次安裝:
[root@server1 ~]# cd elasticsearch-head-master/
[root@server1 elasticsearch-head-master]# npm install --registry=https://registry.npm.taobao.org
這次的速度特別快,接下來需要修改ES主機ip和端口
[root@server1 elasticsearch-head-master]# ls
crx index.html proxy
Dockerfile LICENCE README.textile
Dockerfile-alpine node_modules _site
elasticsearch-head.sublime-project package.json src
Gruntfile.js package-lock.json test
grunt_fileSets.js plugin-descriptor.properties
[root@server1 elasticsearch-head-master]# cd _site/
[root@server1 _site]# ls
app.css background.js fonts index.html manifest.json vendor.js
app.js base i18n.js lang vendor.css
[root@server1 _site]# vim app.js
將"http://localhost:9200"改爲"http://172.25.1.1:9200"
啓動插件,使其後臺運行:
[root@server1 _site]# npm run start &
啓動後可以直接在瀏覽器訪問172.25.1.1:9100
:
表示插件安裝成功,但是點擊連接時並不能連接集羣,需要進行如下配置:
修改ES跨域主持
[root@server1 _site]# cd /etc/elasticsearch/
[root@server1 elasticsearch]# vim elasticsearch.yml
http.cors.enabled: true # 是否支持跨域
http.cors.allow-origin: "*" # *表示支持所有域名
重啓ES服務
systemctl restart elasticsearch.service
重啓後就可以進行正常連接:
複合查詢—>創建索引:
查看ES狀態:
灰色表示沒有副本
黃色代表沒有主分片丟失
四、部署elasticsearch集羣
以相同的方法再安裝兩個ES節點
在server2和server3都安裝elasticsearch,並進行配置:
這裏以server3例(server2與server3操作相同,只有nodename和ip不同)
[root@server3 ~]# vim /etc/elasticsearch/elasticsearch.yml
cluster.name: my-es
node.name: server3
path.data: /var/lib/elasticsearch
path.logs: /var/log/elasticsearch
bootstrap.memory_lock: true
network.host: 172.25.1.3
http.port: 9200
http.cors.enabled: true
http.cors.allow-origin: "*"
discovery.seed_hosts: ["server1", "server2", "server3"]
cluster.initial_master_nodes: ["server1","server2","server3"]
[root@server3 ~]# vim /usr/lib/systemd/system/elasticsearch.service
[service]
LimitMEMLOCK=infinity
[root@server3 ~]# swapoff -a
[root@server3 ~]# vim /etc/fstab
#/dev/mapper/rhel-swap swap swap defaults 0 0
[root@server3 ~]# vim /etc/security/limits.conf
elasticsearch soft memlock unlimited
elasticsearch hard memlock unlimited
elasticsearch - nofile 65535
elasticsearch - nproc 4096
[root@server3 ~]# systemctl daemon-reload
[root@server3 ~]# systemctl start elasticsearch.service
同時還需要配置server1:
[root@server1 security]# vim /etc/elasticsearch/elasticsearch.yml
更改:
discovery.seed_hosts: ["server1", "server2", "server3"]
cluster.initial_master_nodes: ["server1","server2","server3"]
此時重啓服務會報錯,需要將server1做下清理:
[root@server1 security]# cd /usr/share/elasticsearch/bin/
[root@server1 bin]# ./elasticsearch-node repurpose
再次重啓:
[root@server1 ~]# systemctl restart elasticsearch.service
在網頁段進行刷新:
集羣就配置成功。
五、elasticsearch節點優化
elasticsearch節點角色
Master(主節點):
主要負責集羣中索引的創建、刪除以及數據的Rebalance等操作。Master不負責數據的索引和檢索,所以負載較輕。當Master節點失聯或者掛掉的時候,ES集羣會自動從其他Master節點選舉出一個Leader。
Data Node(數據節點):
主要負責集羣中數據的索引和檢索,一般壓力比較大。
Coordinating Node(調度節點):
原來的Client node的,主要功能是來分發請求和合並結果的。所有節點默認就是Coordinating node,且不能關閉該屬性。
Ingest Node:
專門對索引的文檔做預處理
elasticsearch節點優化
在生產環境下,如果不修改elasticsearch節點的角色信息,在高數據量,高併發的場景下集羣容易出現腦裂等問題。
默認情況下,elasticsearch集羣中每個節點都有成爲主節點的資格,也都存儲數據,還可以提供查詢服務。
節點角色是由以下屬性控制:
node.master: false|true
node.data: true|false
node.ingest: true|false
search.remote.connect: true|false
默認情況下這些屬性的值都是true。
- node.master:這個屬性表示節點是否具有成爲主節點的資格
注意:此屬性的值爲true,並不意味着這個節點就是主節點。
因爲真正的主節點,是由多個具有主節點資格的節點進行選
舉產生的。 - node.data:這個屬性表示節點是否存儲數據。
- node.ingest: 是否對文檔進行預處理。
- search.remote.connect:是否禁用跨集羣查詢
第一種組合:(默認)
node.master: true
node.data: true
node.ingest: true
search.remote.connect: true
這種組合表示這個節點即有成爲主節點的資格,又存儲數據。
如果某個節點被選舉成爲了真正的主節點,那麼他還要存儲數據,這樣對於這個節點的壓力就比較大了。
測試環境下這樣做沒問題,但實際工作中不建議這樣設置。
第二種組合:(Data node)
node.master: false
node.data: true
node.ingest: false
search.remote.connect: false
這種組合表示這個節點沒有成爲主節點的資格,也就不參與選舉,只會存儲數據。
這個節點稱爲data(數據)節點。在集羣中需要單獨設置幾個這樣的節點負責存儲數據。後期提供存儲和查詢服務。
第三種組合:(master node)
node.master: true
node.data: false
node.ingest: false
search.remote.connect: false
這種組合表示這個節點不會存儲數據,有成爲主節點的資格,可以參與選舉,有可能成爲真正的主節點。
這個節點我們稱爲master節點。
第四種組合:(Coordinating Node)
node.master: false
node.data: false
node.ingest: false
search.remote.connect: false
這種組合表示這個節點即不會成爲主節點,也不會存儲數據,
這個節點的意義是作爲一個協調節點,主要是針對海量請求的時候可以進行負載均衡。
第五種組合:(Ingest Node)
node.master: false
node.data: false
node.ingest: true
search.remote.connect: false
這種組合表示這個節點即不會成爲主節點,也不會存儲數據,
這個節點的意義是ingest節點,對索引的文檔做預處理。
生產集羣中可以對這些節點的職責進行劃分
建議集羣中設置3臺以上的節點作爲master節點,這些節點只負責成爲主節點,維護整個集羣的狀態。
再根據數據量設置一批data節點,這些節點只負責存儲數據,後期提供建立索引和查詢索引的服務,這樣的話如果用戶請求比較頻繁,這些節點的壓力也會比較大。
所以在集羣中建議再設置一批協調節點,這些節點只負責處理用戶請求,實現請求轉發,負載均衡等功能。
如我們將server1,server2,server3設置爲master節點,將server2和server3設置爲數據節點,需要進行如下配置:
[root@server1 ~]# vim /etc/elasticsearch/elasticsearch.yml
node.master: true
node.data: false
node.ingest: false
search.remote.connect: false
[root@server1 ~]# systemctl restart elasticsearch.service
[root@server2 ~]# vim /etc/elasticsearch/elasticsearch.yml
node.master: true
node.data: true
node.ingest: false
search.remote.connect: false
[root@server2 ~]# systemctl restart elasticsearch.service
[root@server3 ~]# vim /etc/elasticsearch/elasticsearch.yml
node.master: true
node.data: true
node.ingest: false
search.remote.connect: false
[root@server3 ~]# systemctl restart elasticsearch.service
節點需求
master節點:普通服務器即可(CPU、內存 消耗一般)
data節點:主要消耗磁盤、內存。
path.data: data1,data2,data3
這樣的配置可能會導致數據寫入不均勻,建議只指定一個數據路徑,磁盤可以使用raid0陣列,而不需要成本高的ssd。
Coordinating節點:對cpu、memory要求較高。