1. 程式人生 > 實用技巧 >ElasticSearch Logstash Kibana

ElasticSearch Logstash Kibana

叢集搭建

叢集搭建需要注意的幾個配置點。

1 修改每個程序最大同時開啟檔案數太小和使用者最大執行緒。修改/etc/security/limits.conf檔案,增加配置,使用者退出後重新登入生效。

* soft nofile 65536

* hard nofile 65536

* soft nproc 4096

* hard nproc 4096

2 修改虛擬記憶體最大值/etc/sysctl.conf 增加

vm.max_map_count=262144

3 修改ES中JVM佔用記憶體,預設的太大。ES配置檔案config/jvm.options

-Xms512m
-Xmx512m

4 修改ES配置檔案

cluster.name : es
#配置es的叢集名稱,預設是elasticsearch,es會自動發現在同一網段下的es,如果在同一網段下有多個叢集,就可以用這個屬性來區分不同的叢集。

node.name : n1
#節點名,預設隨機指定一個name列表中名字,該列表在es的jar包中config資料夾裡name.txt檔案中

node.master : true
#指定該節點是否有資格被選舉成為node,預設是true,es是預設叢集中的第一臺機器為master,如果這臺機掛了就會重新選舉master。

node.data : true
#指定該節點是否儲存索引資料,預設為true。

network.host : 0.0.0.0
#本機地址

transport.tcp.port : 9001
#設定節點間互動的tcp埠,預設是9300。

http.port : 8001
#設定對外服務的http埠,預設為9200。

transport.tcp.compress : true
#設定是否壓縮tcp傳輸時的資料,預設為false,不壓縮。

http.max_content_length : 100mb
#設定內容的最大容量,預設100mb

discovery.zen.ping.unicast.hosts : ["0.0.0.0:9001","0.0.0.0:9002","0.0.0.0:9003"]
#設定新節點被啟動時能夠發現的主節點列表(主要用於不同網段機器連線)

discovery.zen.minimum_master_nodes: 2
#master候選節點數量/2+1

#master候選節點
cluster.initial_master_nodes: ["n1","n2","n3"]


#如果使用head外掛,需要增加這個。
http.cors.enabled: true 
http.cors.allow-origin: "*"
View Code

5 安裝IK分詞器

https://github.com/medcl/elasticsearch-analysis-ik

將解壓好的目錄命名位IK放到ES的plugins下。

6 安裝head外掛

下載head需要先安裝node環境。這裡給出一篇部落格。

https://www.cnblogs.com/xiaojianfeng/p/9435507.html

7 啟動Es不能使用root使用者,需要建立一個Linux使用者。啟動指令碼再 bin 下。

bin/elasticsearch -d 其中 -d 為後臺啟動。

故障轉移

在一個ES叢集中建立一個索引指定了主分片和副本分片後。如果叢集節點掛掉後,ES會動態的做故障轉移。

將掛掉的節點上的分片,分配給其他節點上。直到該節點恢復,才會將分片重新分配。

下圖store索引,主分片數量三個,每個有一個副本分片,總共六個。

當node3節點掛掉後。經過短暫的ES檢查到節點丟失。

短暫的調整後,ES會將node3的節點分配到其他兩個節點上。

極限擴容

索引庫一旦建立,主分片數量不可更改。例如上圖的store索引庫,三個主分片,每個主分片一個副本。

但隨著業務的增加,一臺服務上放置多個分片勢必導致讀寫慢,ES寫操作只能在主分片上操作,而讀

操作可以在主分片或者副本分片操作。所以我們需要對索引庫進行擴容。就是增加伺服器。這次的目標是

在擴充套件3臺伺服器,總共6臺做到每臺伺服器上只放置一個分片。這個操作只需要對ES叢集增加節點即可。

增加副本

上邊說過,當索引建立後,主分片不可增加。那麼業務量龐大時,做到極限擴容,顯然已經

到達了閾值。像上邊那樣,已經是一臺伺服器放一個分片了。接下來我們要做的操作是增加

副本分片。下圖為使用springBoot JPA的方式建立了主分片和副本分片都是一的索引。

可以看到 n2這個節點完全沒有用到。接下來我們通過 rest 的方式,對索引的副本分片進行更改。

FieldType.Text和FieldType.Keyword

定義文件時會選擇欄位型別。如果是字串型別,我們則要考慮是否對改欄位進行分詞。

如果分詞就會建立索引。Text則會對字串進行分詞並索引。Keyword則不會對字串

分詞,但是會建立索引。以下索引Item只有title欄位是text型別。其他是keyword型別。

index

表示欄位是否索引,上邊我們說過對於字串型別,無論是Keywork還是Text都會對欄位進行

索引。index屬性為false則表示該屬性不建立索引。即使此字串是Text型別。

LogStash

從這個地址下載LogStash https://artifacts.elastic.co/downloads/logstash 注意LogStash版本要和Elasticsearch一致。

logStash主要作用從一個輸入源讀資料,然後將資料存到Elasticsearch 輸入源可以是資料庫,檔案,APP應用等。

注意事項

1 修改config/jvm.config檔案

-Xms256m
-Xmx256m

2 啟動指令碼再 bin 目錄下 bin/logstash -e'input{ stdin{} } output{ stdout{} }' 這種方式直接將配置放到啟動指令碼後,但是如果過長就不好看了,可以放到配置檔案步驟3.

3 修改啟動配置檔案

config/ 下建立一個 xx.config 即可。

LogStash配置檔案主要配置輸入源,和輸出目的地。格式如下

input{
    tcp{
        port => 1111
        codec => "json"
    }
}

output{

    elasticsearch{
        hosts => ["10.0.98.76:9200"]
        index => "testapp"
    }

}
View Code

input表示輸入,output表示輸出。可以有多個輸入源,也可以有多個輸出源。以上則是監聽服務埠,然後輸出到Elasticsearch

步驟2的 stdin{} stdout{} 為控制檯輸入輸出。如果有多個輸入源,這個語法也支援 if 判斷,根據輸入源的 type 判斷輸入到哪裡。

以下是一個常用配置。需要注意的是,如果輸入源是 file 則該檔案必須是 .log 結尾。同時要設定 start_position 屬性,該屬性規定了Logstash從檔案的什麼

位置開始讀取,如果是 beginning 則表示從檔案第一行開始讀。注意Logstash會一行一行的讀,遇到換行符則代表一行。 end 表示會從檔案尾部讀取,也就是

如果你指定的檔案裡已經有內容,Logstash只會讀取新增的日誌。但是,如果這個檔案曾經被Logstash讀取過,則Logstash會對檔案有標記,標記曾經讀到哪一行

也就是說,start_position只對第一次讀的檔案生效。

4 啟動時指定配置檔案logstash -f config/logstash-sample.conf

nohup bin/logstash -f config/logstash-sample.conf & 後臺啟動

輸入源如果是 tcp 則需要指定 codec 為json

input{

#stdin{}

file{
path => "/home/elk/logStash/logstash-7.8.0/config/test1.log"
type => "test1"
start_position => "beginning"
}

file{
path => "/home/elk/logStash/logstash-7.8.0/config/test2.log"
type => "test2"
start_position => "beginning"
}

tcp{
host => "192.168.31.77"
port => 1111
codec => json
type => "app"
}
}

output{

if [type] == "test1"{
elasticsearch{
hosts => ["192.168.31.77:8003"]
index => "log1"
}
}

if [type] == "test2"{
elasticsearch{
hosts => ["192.168.31.77:8003"]
index => "log2"
}
}

if [type] == "app"{
elasticsearch{
hosts => ["192.168.31.77:8003"]
index => "applog"
}
}

#stdout{
#codec => json 
#}
}

 
View Code

下面程式碼片段為 springboot中將日誌輸入到 tcp

1 根據使用的日誌框架匯入相應的包,我這裡用的logback

  <dependency>
            <groupId>net.logstash.logback</groupId>
            <artifactId>logstash-logback-encoder</artifactId>
            <version>4.11</version>
        </dependency>
View Code

2 配置logback,關於logback的配置規則可以參考我上一篇部落格。

  <appender name="logstashshow" class="net.logstash.logback.appender.LogstashTcpSocketAppender">
        <destination>127.0.0.1:1111</destination>
        <encoder charset="UTF-8" class="net.logstash.logback.encoder.LogstashEncoder"></encoder>
    </appender>


 <logger name="com.dfsn.cloud.consumer" level="INFO" additivity="false">
        <appender-ref ref="logstashshow"></appender-ref>
    </logger>
View Code

當應用啟動後,會額外的啟動一個埠,將日誌輸入到該埠,Logstash監聽該埠,接收日誌。最後給出一個Logback官方地址,所有的配置都可以找到。

https://www.elastic.co/guide/en/logstash/current/index.html

Kibana

Kibana是一個檢視app,對Elasticsearch中的日誌,做分析檢視。

Kibana只需要修改config配置檔案下的kibana.yml檔案即可。

server.port: 5601
server.host: "192.168.31.77"
elasticsearch.hosts: ["http://192.168.31.77:8001"]
kibana.index: ".kibana"
View Code

預設的 Kibana 也不支援 root 使用者啟動,可以設定 --allow-root 忽略檢查。

kibana --allow-root

nohup bin/kibana--allow-root &

截至目前我對Kibana運用的也十分生疏,給出一個部落格吧。

https://blog.csdn.net/qq_18769269/article/details/80843810