文章目錄
1.Elasticsearch
官網:https://www.elastic.co/cn/
1.1 Elasticsearch介紹
Elasticsearch 是一個開源的分佈式搜索分析引擎,建立在一個全文搜索引擎庫 Apache Lucene基礎之上。
Elasticsearch 不僅僅是Lucene,並且也不僅僅只是一個全文搜索引擎:
一個分佈式的實時文檔存儲,每個字段可以被索引與搜索
一個分佈式實時分析搜索引擎
能勝任上百個服務節點的擴展,並支持 PB 級別的結構化或者非結構化數據
基礎模塊:
cluster:管理集羣狀態,維護集羣層面的配置信息。
alloction:封裝了分片分配相關的功能和策略。
discovery:發現集羣中的節點,以及選舉主節點。
gateway:對收到master廣播下來的集羣狀態數據的持久化存儲。
indices:管理全局級的索引設置。
http:允許通過JSON over
HTTP的方式訪問ES的API。
transport:用於集羣內節點之間的內部通信。
、
engine:封裝了對Lucene的操作及translog的調用。
elasticsearch應用場景:
• 信息檢索
• 日誌分析
• 業務數據分析
• 數據庫加速
• 運維指標監控
1.2 Elasticsearch的安裝與配置
可參考官網:https://www.elastic.co/guide/en/elasticsearch/reference/7.6/index.html
實驗環境:給2G內存
server1:172.25.0.1
server2:172.25.0.2
server3:172.25.0.3
1.安裝軟件並修改配置文件
yum install -y elasticsearch-7.6.1.rpm
安裝軟件
vim /etc/elasticsearch/elasticsearch.yml
修改配置文件
cluster.name: my-es #集羣名稱
node.name: server7 #主機名需要解析
path.data: /var/lib/elasticsearch #數據目錄
path.logs: /var/log/elasticsearch #日誌目錄
bootstrap.memory_lock: true #鎖定內存分配
network.host: 172.25.0.1 #主機ip
http.port: 9200 #http服務端口
discovery.seed_hosts: ["server1"]
cluster.initial_master_nodes: ["server1"]
2.修改系統限制
vim /etc/security/limits.conf
elasticsearch soft memlock unlimited
elasticsearch hard memlock unlimited
elasticsearch - nofile 65536 ##要將elasticsearch用戶的最大打開文件數設置爲65535
elasticsearch - nproc 4096 ## 確保Elasticsearch用戶可以創建的線程數至少爲4096
vim /etc/elasticsearch/jvm.options
-Xms1g ###Xmx設置不超過物理RAM的50%,以確保有足夠的物理RAM留給內核文件系統緩存。但不要超過32G。
-Xmx1g
swapoff -a
禁用swap
vim /etc/fstab
#UUID=2a714265-f92d-4429-87da-9f09e32e6ff2 swap swap defaults 0 0 ##避免開機自啓
也可以:
echo 0 >/proc/sys/vm/swappiness
3.修改systemd啓動文件
vim /usr/lib/systemd/system/elasticsearch.service
[Service]
LimitMEMLOCK=infinity
systemctl daemon-reload
systemctl start elasticsearch
4.elasticsearch插件安裝
unzip elasticsearch-head-master.zip
yum install -y nodejs-9.11.2-1nodesource.x86_64.rpm
head插件本質上是一個nodejs的工程,因此需要安裝node
5.更換npm的yum源(要求虛擬機可上網)
tar jxf phantomjs-2.1.1-linux-x86_64.tar.bz2
cp phantomjs-2.1.1-linux-x86_64//bin/phantomjs /usr/local/bin
yum install -y fontconfig-2.13.0-4.3.el7.x86_64
解決依賴性
cd elasticsearch-head-master
必須在這個目錄中
npm install --registry=https://registry.npm.taobao.org
更換npm的yum源
6.修改es主機ip和端口
vim /root/elasticsearch-head-master/_site/app.js
"http://172.25.0.1:9200";
7.啓動head插件
cd /root/elasticsearch-head-master
npm run start &
在目錄中後臺啓動head插件
8.修改ES跨域主持
vim /etc/elasticsearch/elasticsearch.yml
修改ES跨域主持
http.cors.enabled: true # 是否支持跨域
http.cors.allow-origin: "*" # *表示支持所有域名
systemctl restart elasticsearch.service
重啓ES服務
9.創建索引
1.3 配置Elasticsearch集羣
將server2與server3加入集羣
vim /etc/elasticsearch/elasticsearch.yml
修改配置文件**
cluster.name: my-es
node.name: server2 ##server3寫server3
path.data: /var/lib/elasticsearch
path.logs: /var/log/elasticsearch
bootstrap.memory_lock: true
network.host: 172.25.0.2 ##server3的IP寫172.25.0.3
http.port: 9200
http.cors.enabled: true
http.cors.allow-origin: "*"
discovery.seed_hosts: ["server1", "server2", "server3"] ##server1中也需要改
cluster.initial_master_nodes: ["server1", "server2", "server3"]
vim /etc/security/limits.conf
elasticsearch soft memlock unlimited
elasticsearch hard memlock unlimited
elasticsearch - nofile 65536
elasticsearch - nproc 4096123
vim /usr/lib/systemd/system/elasticsearch.service
[Service]
LimitMEMLOCK=infinity1
systemctl daemon-reload
systemctl start elasticsearch.service
1.4 Elasticsearch中的節點角色與優化
1.Elasticsearch中的節點角色
Master : 主要負責集羣中索引的創建、刪除以及數據的Rebalance等操作。Master不負責數據的索引和檢索,所以負載較輕。當Master節點失聯或者掛掉的時候,ES集羣會自動從其他Master節點選舉出一個Leader。
Data Node: 主要負責集羣中數據的索引和檢索,一般壓力比較大。
Coordinating Node: 原來的Client node的,主要功能是來分發請求和合並結果的。所有節點默認就是Coordinating node,且不能關閉該屬性。
Ingest Node: 專門對索引的文檔做預處理
2.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節點,對索引的文檔做預處理。
vim /etc/elasticsearch/elasticsearch.yml
生產集羣中可以對這些節點的職責進行劃分,建議集羣中設置3臺以上的節點作爲master節點,這些節點只負責成爲主節點,維護整個集羣的狀態。再根據數據量設置一批data節點,這些節點只負責存儲數據,後期提供建立索引和查詢索引的服務,這樣的話如果用戶請求比較頻繁,這些節點的壓力也會比較大。所以在集羣中建議再設置一批協調節點,這些節點只負責處理用戶請求,實現請求轉發,負載均衡等功能。
節點需求:
master節點:普通服務器即可(CPU、內存 消耗一般)
data節點:主要消耗磁盤、內存。
path.data: data1,data2,data3
這樣的配置可能會導致數據寫入不均勻,建議只指定一個數據路徑,磁盤可以使用raid0陣列,而不需要成本高的ssd。
Coordinating節點:對cpu、memory要求較高。
2.logstash數據採集
2.1 logstash介紹
Logstash是一個開源的服務器端數據處理管道。
logstash擁有200多個插件,能夠同時從多個來源採集數據,轉換數據,然後將數據發送到您最喜歡的 “存儲庫” 中。(大多都是Elasticsearch。)
Logstash管道有兩個必需的元素,輸入和輸出,以及一個可選元素過濾器。
1.輸入:採集各種樣式、大小和來源的數據
Logstash 支持各種輸入選擇 ,同時從衆多常用來源捕捉事件。
能夠以連續的流式傳輸方式,輕鬆地從日誌、指標、Web 應用、數據存儲以及各種 AWS 服務採集數據。
2.過濾器:實時解析和轉換數據
數據從源傳輸到存儲庫的過程中,Logstash 過濾器能夠解析各個事件,識別已命名的字段以構建結構,並將它們轉換成通用格式,以便更輕鬆、更快速地分析和實現商業價值。
功能:
利用 Grok 從非結構化數據中派生出結構
IP 地址破譯出地理座標
將 PII 數據匿名化,完全排除敏感字段
簡化整體處理,不受數據源、格式或架構的影響
3.輸出:選擇存儲庫,導出數據
logstash 提供衆多輸出選擇,您可以將數據發送到您要指定的地方,並且能夠靈活地解鎖衆多下游用例。
2.2 logstash的安裝與配置
實驗環境:
server4:172.25.0.4
rpm -ivh jdk-8u171-linux-x64.rpm
rpm -ivh logstash-7.6.1.rpm
安裝logstash
標準輸入到標準輸出:
/usr/share/logstash/bin/logstash -e 'input { stdin { } } output { stdout {} }'
2.3 logstash的輸入/輸出
1.file輸出插件
標準輸入到文件:vim /etc/logstash/conf.d/file.conf
input {
stdin { }
}
output {
file {
path => "/tmp/logstash.txt" ##輸出的文件路徑
codec => line { format => "custom format: %{message}"} ##定製數據格式
}
}
指定配置文件運行:/usr/share/logstash/bin/logstash -f /etc/logstash/conf.d/file.conf
查看輸入:cat /tmp/logstash.txt
2.elasticsearch輸出插件
標準輸入到es主機:vim /etc/logstash/conf.d/es.conf
input {
stdin { }
}
output {
elasticsearch {
hosts => "172.25.0.1:9200" ##輸出到的ES主機與端口
index => "logstash-%{+YYYY.MM.dd}" ##定製索引名稱
}
}
指定配置文件運行:/usr/share/logstash/bin/logstash -f /etc/logstash/conf.d/es.conf
3.file輸入插件
在server4安裝並開啓httpd
yum install -y httpd
systemctl start httpd
echo www.red.com > /var/www/html/index.html
用戶訪問server4的httpd生成數據ab -c 1 -n 100 http://172.25.0.4/index.html
把文件內容輸出到es主機:vim /etc/logstash/conf.d/es.conf
input {
file {
path => "/var/log/httpd/access_log"
start_position => "beginning"
}
}
output {
stdout {} ##可以在這裏輸出
elasticsearch {
hosts => "172.25.0.1:9200"
index => "logstash-%{+YYYY.MM.dd}"
}
}
指定配置文件運行:/usr/share/logstash/bin/logstash -f /etc/logstash/conf.d/es.conf
4.logstash會把進度保存到sincedb文件中
sincedb文件內容解釋(sincedb文件一共6個字段)
1.inode編號
2.文件系統的主要設備號
3.文件系統的次要設備號
4.文件中的當前字節偏移量
5.最後一個活動時間戳(浮點數)
6.與此記錄匹配的最後一個已知路徑
注意:如果數據被在刪除,再次運行的時候將不會從頭讀取。
5.Syslog輸入插件
logstash可以僞裝成日誌服務器,直接接受遠程日誌
vim /etc/logstash/conf.d/syslog.conf
input {
syslog {
port => 514 ##日誌收集端口
}
}
output {
stdout {}
elasticsearch {
hosts => "172.25.0.1:9200"
index => "syslog-%{+YYYY.MM.dd}"
}
}
配置客戶端傳入日誌:vim /etc/rsyslog.conf
*.* @@172.25.0.4:514
systemctl restart rsyslog.service
重啓日誌服務
6.多行過濾插件
多行過濾可以把多行日誌記錄合併爲一行事件
示例一
vim /etc/logstash/conf.d/multiline.conf
input {
stdin {
codec => multiline {
pattern => "^EOF"
negate => true
what => previous
}
}
}
output {
stdout {}
}
/usr/share/logstash/bin/logstash -f /etc/logstash/conf.d/multiline.conf
示例二:解決日誌多行錄入的情況
vim /etc/logstash/conf.d/es.conf
input {
file {
path => "/var/log/my-es.log"
start_position => "beginning"
codec => multiline {
pattern => "^\[" ##已[開頭的地方換行
negate => true
what => previous
}
}
}
output {
stdout {}
elasticsearch {
hosts => ["172.25.0.1:9200"]
index => "eslog-%{+yyyy.MM.dd}"
}
}
7.grok過濾插件
vim /etc/logstash/conf.d/grok.conf
input {
stdin {}
}
filter {
grok {
match => { "message" => "%{IP:client} %{WORD:method} %{URIPATHPARAM:request} %{NUMBER:bytes} %{NUMBER:duration}" }
}
}
output {
stdout {}
}
指定配置文件運行:/usr/share/logstash/bin/logstash -f /etc/logstash/conf.d/grok.conf
grok過濾插件處理apache日誌
獲得幫助:cat /usr/share/logstash/vendor/bundle/jruby/2.5.0/gems/logstash-patterns-core-4.1.2/patterns/httpd
vim /etc/logstash/conf.d/apache.conf
input {
file {
path => "/var/log/httpd/access_log"
start_position => "beginning"
}
}
filter {
grok {
match => { "message" => "%{HTTPD_COMBINEDLOG}" }
}
}
output {
stdout {}
elasticsearch {
hosts => ["172.25.0.1:9200"]
index => "apachelog-%{+yyyy.MM.dd}"
}
}
/usr/share/logstash/bin/logstash -f /etc/logstash/conf.d/apache.conf
3.kibana數據可視化
3.1 kibana的介紹
3.2 kibana的安裝與配置
實驗環境:
server5:172.25.0.5
安裝kibana:rpm-ivh kibana-7.6.1-x86_64.rpm
kibana配置:vim /etc/kibana/kibana.yml
server.port: 5601 #服務端口
server.host: "172.25.0.17" #服務監聽地址
elasticsearch.hosts: ["http://172.25.0.13:9200"] #ES集羣地址
kibana.index: ".kibana" #kibana在ES中創建的索引
i18n.locale: "zh-CN"
3.3 kibana的自定義圖表
**
3.4 啓用xpack安全驗證
集羣模式需要先創建證書:
cd /usr/share/elasticsearch/bin/
./elasticsearch-certutil ca
./elasticsearch-certutil cert --ca elastic-stack-ca.p12
cd ..
cp elastic-certificates.p12 elastic-stack-ca.p12 /etc/elasticsearch/
cd /etc/elasticsearch/
chown elasticsearch elastic-certificates.p12 elastic-stack-ca.p12
配置所有的elasticsearch集羣節點:
vim /etc/elasticsearch/elasticsearch.yml
在這裏插入代碼片
ES集羣重啓正常後,設置用戶密碼:
/usr/share/elasticsearch/bin//elasticsearch-setup-passwords interactive
vim /etc/kibana/kibana.yml
elasticsearch.username: "kibana"
elasticsearch.password: "redhat"
systemctl restart kibana.service
head訪問:
vim /etc/elasticsearch/elasticsearch.yml
http.cors.allow-headers: Authorization,X-Requested-With,Content-Length,Content-Type
systemctl restart elasticsearch.service
http://172.25.0.1:9100/?auth_user=elastic&auth_password=redhat