# ELK安裝筆記
劉銀
## 什么是ELK
ELK是Elasticsearch、 Logstash、Kibana三個開源軟件的組合而成,形成一款強大的實時日志收集、展示系統。
- **Elasticsearch(ES)**:基于Lucene的高性能搜索框架,特點:`高性能`,`分布式`,`restful`
- **Logstash**:日志收集、結構化工具,可以從本地磁盤,網絡服務消息隊列中收集各種各樣
的日志, 然后進行過濾分析, 并將日志輸出到Elasticsearch(也可以是其他應用)
- **Kibana**:可視化日志Web展示工具,對Elasticsearch中存儲的日志進行展示,還可以生成炫麗的儀表盤。其原理是大量使用了ELasticsearch的聚合功能。
現在,除了ES外,Elastic網站提出了Elastic stack的概念,相當于一個全家桶,其中重要的組件還有**X-Pack** 和 **Beat**
> Logstach是可以脫離ES單獨使用的。Kibana不行。
## ES安裝(5.2+)
一、環境
1. JDK1.8
2. Linux內核3.5及以上
> 如果不是3.5以上內核,ES啟動時會報異常,單機可以忽略。
> 如果是集群,ES啟動報異常不會通過,要在ES安裝目錄的config文件夾下的elasticsearch.yml中配置:`bootstrap.system_call_filter: false`,忽略該異常。
二、單機安裝(centos 6.8 64位)
1. 下載 elasticsearch-5.2.2.tar.gz(版本號可選)
2. 解壓 `tar zxvf elasticsearch-5.2.2.tar.gz`
3. 執行安裝目錄下的`./bin/elasticsearch` 啟動
三、啟動中的問題
1. **不能用root啟動**,ES官方直接不允許,必須新創建用戶并授予相應的權限
2. 由于ES是一個對多線程要求很高的應用,所以對一些基礎的linux系統配置要進行更改:
- 相關系統設置:
- vim /etc/sysctl.conf
- vm.max_map_count= 262144
- sysctl –p
- 系統打開文件數配置:
* vim /etc/security/limits.conf
* hard nofile 65536
* soft nofile 65536
- 修改用戶打開的線程數,因為 es 的段要經常打開文件控制索引:
* vim /etc/security/limits.d/90-nproc.conf
* soft nproc 2048
3. 在安裝目錄的config目錄中,有個jvm.options配置文件,其中有初始化jvm的大小。默認2g,官方推薦生產環境4g,我這里的虛擬機環境(單核,1G內存),改成256m:
* -Xms256m
* -Xmx256m
> 通常在啟動過程中,有異常報出來,根據異常信息去百度,都會有解決辦法。
四、配置文件
在config目錄下的`elasticsearch.yml`文件是主要的配置文件,配置參數解釋如下:
|名稱 | 說明|
|---|---|
|`cluster.name` |集群名稱,一個集群的唯一標識|
|`node.name` |節點名稱,每個節點唯一|
|`node.rack` |為節點添加自定義屬性|
|`path.data` |數據存儲路徑,可默認|
|`path.logs` |日志存儲路徑,可默認|
|`bootstrap.memory_lock` |啟動過程中是否為內存加鎖,`true`/`false`|
|`network.host` |綁定的本機ip|
|`http.port` |自定義http端口,默認9200|
|`discovery.zen.ping.unicast.hosts` |當新節點加入的時候,配置一個初始化主機列表用于節點發現|
|`discovery.zen.minimun_master_nodes` |為了避免發生腦裂的最小節點數,數值為(有主節點資格的節點數量/2 + 1)|
|`gateway.recover_after_nodes` | 如果集群發生重啟,要直到多少個節點啟動完成,才能開始進行集群初始化恢復動作|
|`action.destructive_requires_name` |刪除索引時,需要明確的索引名稱|
五、集群配置(以3臺為例,3臺都可以成主節點)
關鍵點:
- 集群名稱相同
- 節點名稱不能相同
- 計算最小主節點數
- 要鎖住內存防止異常
配置示例:
* cluster.name: wukong *集群名稱,整個集群唯一,集群中的節點要相同*
* node.name: wk-01 *節點名稱,每個節點(ES)唯一*
* bootstrap.memory_lock: true *鎖住內存,避節點拋異常造成集群不可用*
* newwork.host: 192.168.87.131 *本節點的地址*
* discovery.zen.ping.unicast.host: [“192.168.87.131”,”192.168.87.130”,”192.168.87.129”] *啟動時的集群發現*
* discovery.zen.minimum_master_nodes: 2 *最小主節點數*
注意:
在我的centos6.8 環境中,還要執行如下命令來解除鎖內存的限制(命令是當時生效,可永久配置)
> ulimit -l unlimited
==由于條件限制,下面的演示都是單節點環境。集群的特有信息,將在以后補充==
當我們啟動ES后,在命令行輸入
> curl -XGET '192.168.87.131:9200'
出現以下信息,表示啟動成功
```javascript
{
"name" : "liuyin-n1", // 節點名稱
"cluster_name" : "liuyin", // 集群名稱
"cluster_uuid" : "Wn0JKxCKRwK0aTSm8BPZTg", // 節點uuid,唯一,由ES代碼生成
"version" : {
"number" : "5.2.2", // es版本號
"build_hash" : "f9d9b74", // hash值
"build_date" : "2017-02-24T17:26:45.835Z", // 創建時間
"build_snapshot" : false, // 是否創建快照
"lucene_version" : "6.4.1" // 底層lucene版本號
},
"tagline" : "You Know, for Search" // 口號
}
```
查看集群基本信息
> curl -XGET '192.168.87.131:9200/_cluster/health?pretty'
```
{
"cluster_name" : "liuyin", // 集群名稱
"status" : "yellow", // 集群狀態,重要
"timed_out" : false,
"number_of_nodes" : 1, // 節點數,這里可以看出只有一個階段,是單機環境
"number_of_data_nodes" : 1,
"active_primary_shards" : 23,
"active_shards" : 23,
"relocating_shards" : 0,
"initializing_shards" : 0,
"unassigned_shards" : 23,
"delayed_unassigned_shards" : 0,
"number_of_pending_tasks" : 0,
"number_of_in_flight_fetch" : 0,
"task_max_waiting_in_queue_millis" : 0,
"active_shards_percent_as_number" : 50.0
}
```
關于status
顏色 | 含義
---|---
green | 所有主要分片和復制分片都可用
yellow | 所有主要分片可用,但不是所有復制分片都可用,**最小保障**
red | 不是所有主分片都可用
>關于ES的命令,不是本章內容,有興趣可以參看其他相關資料
## 插件安裝
### 一、head插件
head插件是一個網頁版的ES可視化客戶端,簡單易用、功能強大。
在ES2.X時代,head作為ES的標準插件來安裝,到了ES5.X,官方已經把head移除了(估計是太強大,提供了很多官方其他插件要收費才能使用的功能,而官方強烈推薦的使用x-pack來管理ES,也和head的管理有所沖突,所有head被放棄了),但head也做了變通,依然可以作為一個獨立的前端應用,通過node.js來安裝。
1、通過node.js來安裝head插件
> mkdir head
> cd head
> git clone git://github.com/mobz/elasticsearch-head.git
> cd elasticsearch-head
> npm install
> npm install -g grunt-cli
> grunt server
看到如下信息,表示啟動成功
- Running "connect: server" (connect) task
- Waiting forever...
- Started connect web server on http://localhost:9100
可以看到,默認綁定的是9100端口。
2、配置ES允許跨域訪問
由于head插件已經不能被ES默認支持,我們還要在ES的配置文件`elasticsearch.yml`中加入下面兩個配置后重啟,才能訪問:
> http.cors.enabled: true
> http.cors.allow-origin: "*"
根據ip地址訪問:`192.168.87.131:9100`,如下:

至此,head插件的安裝就成功了
二、X-Pack安裝
1、X-Pack簡介
X-Pack是Elastic Stack(可以理解為整個Elastic體系)中一個非常重要的組件,它集如下功能于一身:

> 依次為:安全、告警、監控、報告、圖表、機器學習(即將支持)
可以說,X-Pack是Elastic家族不可缺少的重要組件。
2、X-Pack安裝
X-Pack是一個插件,它必須依賴于主體進行安裝。比如依賴于ES、Logstash、Kibana。這里在ES下安裝如下:
先停止ES服務
然后再安裝目錄的bin目錄下執行elasticsearch-plugin
> ./bin/elasticsearch-plugin install x-pack
但一個問題是,x-pack有100m+,這種方式直接從國外網站下載插件,是很慢的,所有可以把x-pack下載下來再安裝,下載地址:
[https://artifacts.elastic.co/downloads/packs/x-pack/x-pack-5.2.2.zip](https://artifacts.elastic.co/downloads/packs/x-pack/x-pack-5.2.2.zip)
上傳到linux中,比如在/luyou/elk/x-pack-5.2.2.zip,執行命令如下:
> bin/elasticsearch-plugin install file:///luyou/elk/x-pack-5.2.2.zip
出來一下信息,最后選擇y,安裝成功
> @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
> @ WARNING: plugin requires additional permissions @
> @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
> * java.lang.RuntimePermission accessClassInPackage.com.sun.activation.registries
> * java.lang.RuntimePermission getClassLoader
> * java.lang.RuntimePermission setContextClassLoader
> * java.lang.RuntimePermission setFactory
> * java.security.SecurityPermission createPolicy.JavaPolicy
> * java.security.SecurityPermission getPolicy
> * java.security.SecurityPermission putProviderProperty.BC
> * java.security.SecurityPermission setPolicy
> * java.util.PropertyPermission * read,write
> * java.util.PropertyPermission sun.nio.ch.bugLevel write
> * javax.net.ssl.SSLPermission setHostnameVerifier
> See http://docs.oracle.com/javase/8/docs/technotes/guides/security/permissions.html
> for descriptions of what these permissions allow and the associated risks.
>
> Continue with installation? [y/N]y **這里選擇y**
同理,要在kibana、Logstach中安裝X-Pack,也類似:
> bin/kibana-plugin install file:///luyou/elk/x-pack-5.2.2.zip
> bin/logstash-plugin install file:///luyou/elk/x-pack-5.2.2.zip
刪除X-Pack
> bin/kibana-plugin remove x-pack
3、X-Pack設置
X-Pack安裝成功后,默認會啟用5個設置
|名稱 | 說明|
|---|---|
|xpack.security.enabled | 安全選項,默認true,可在elasticsearch.yml或kibana.yml配置|
|xpack.monitoring.enabled | 監控選項,默認true,可在elasticsearch.yml或kibana.yml配置|
|xpack.graph.enabled | 圖表選項,默認true,可在elasticsearch.yml或kibana.yml配置|
|xpack.watcher.enabled | 觀察選項,默認true,只能在elasticsearch.yml中配置|
|xpack.reporting.enabled | 報告選項,默認true,只能在kibana.yml中配置|
4、X-Pack用戶安全
當X-Pack安裝完成,重啟ES后,會默認開啟一個超級用戶,用戶名為elastic,密碼為changeme,下面先給用戶改密碼,如改成"123456":
> curl -XPUT -u elastic:changeme '192.168.87.131:9200/_xpack/security/user/elastic/_password' -d
> '{
> “password”:“123456”
> }'
> 在安裝了X-Pack后,所有的ES訪問操作要加參數`-u 用戶名:密碼`來執行。
注意:
> 當安裝了x-pack后,我們的head插件將不能再訪問ES,需要在ES的elasticsearch.yml文件中配置禁用安全選項如下:
> xpack.security.enabled: **false**
> 但這種方式也就弱化了X-Pack的功能,如何取舍要自己衡量。建議生產環境還是不用head。
## Kibana安裝
1、Kibana簡介
Kibana是一個為ElasticSearch服務的,強大的數據圖像化組件(還包括友好的命令行工具),先來感受一下:

> Kibana的原理其實就是利用了ES提供的強大的**聚合**操作來生成各種圖表。
2、Kibana安裝
先下載,解壓:
> wget https://artifacts.elastic.co/downloads/kibana/kibana-5.2.2-linux-x86_64.tar.gz
> tar -xzf kibana-5.2.2-linux-x86_64.tar.gz
> cd kibana/
由于前邊ES安裝了X-Pack,我們安裝Kibana后,也把X-Pack安裝上,可以通過Kibana來進行監控和權限管理等:
> bin/kibana-plugin install file:///luyou/elk/x-pack-5.2.2.zip
配置,在kibana安裝目錄,config目錄下`kibana.yml`
> server.host: "192.168.87.131" kibana主機地址,這里我ES和Kibana都在一臺虛擬機上
> elasticsearch.url: "http://192.168.87.131:9200" ES服務器地址
> elasticsearch.username: "elastic" 以什么用戶名連接ES,這里是默認超級用戶
> elasticsearch.password: "123456" 密碼,前面已經從默認的"changme"改成"123456"
Kibana的配置非常多,這里只給出最基本的4個,其他的請自行查閱相關資料
啟動:
> bin/kibana
注意有這一句,是kibana的訪問地址,默認端口就是5601
> [12:06:27.937] [info][listening] Server running at http://192.168.87.131:5601
下面可以用瀏覽器訪問了。(貌似kibana對ie內核支持不行,請用chrom或firefox)
出現以下界面,則kibana和x-pack都安裝成功了:

輸入用戶名elastic,密碼123456,進入kibana主界面 如圖:

> 如果沒有開啟X-Pack,則不需要登陸,Kibana的功能也會少一些。
## Logstash安裝
1、簡介
Logstash是一個開源的,運行與服務器端的數據(日志文件,網絡包等)提取管道,對數據進行提取、轉換、存儲。它是一個獨立的組件,不需要依賴ES,但作為Elastic Stack家族中的重要一員,通常會把提取的數據用ES進行存儲。
官方的這張圖能很好的表明Logstash的作用:

數據收集來源:
1. 日志文件
2. 系統指標
3. 網絡
4. 數據庫(數據流)
5. 傳感器
數據輸出后可用于:
1. 分析
- ES
- MongoDB、Riak之類的數據庫
2. 歸檔
- HDFS
- S3
Google Cloud Storage
3. 監控
- Nagios
- Ganglia
- Zabbix
- Graphite
- Datadog
- CloudWatch
4. 告警
- Watcher *(with Elasticsearch)*
- Email
- Pagerduty
- HipChat
- IRC
- SNS
2、Logstash工作流程
Logstash工作有3個階段:
```
graph LR
inputs-->filters
filters-->outputs
```
這里inputs、filters、outputs剛好是Logstash的3大基本插件:
1. **inputs**:負責收集數據(數據從哪里來)
2. **filters**:負責解析、匹配、過濾、完善數據(如何處理)
3. **outputs**:負責將處理好的數據發送出去(數據到哪里去)
此外,Logstash還有一個插件叫**Codec**,它是一個作用于inputs或outputs內的插件,用于對數據進行一些特定格式的轉換。如處理成json格式,如multiline將多行轉換成一行。
下面是這些插件所支持的應用(非完全統計)。
|Input Plugins | Codec plugins | Filter plugins | Output plugins|
|---|---|---|---|
|beats|avro|aggregate|csv|
|couchdb_changes| cef |anonymize| elasticsearch|
|elasticsearch| collectd| csv |email|
|file| dots| date| file|
|gelf| es_bulk |de_dot |graphite|
|generator| fluent| dissect| http|
|graphite| graphite| dns| kafka|
|heartbeat| json| drop |rabbitmq|
|http| json_lines| fingerprint| redis|
|http_poller |line| geoip| s3|
|jdbc| msgpack |grok| stdout|
|kafka |multiline| json| tcp|
|log4j| plain| kv| udp|
|rabbitmq| rubydebug| mutate ||
|redis|| ruby ||
|s3 || sleep ||
|sqs || split ||
|stdin|| throttle ||
|syslog|| syslog_pri ||
|tcp || translate ||
|twitter || urldecode ||
|udp|| useragent ||
|| | uuid ||
||| xml ||
一個基本的Logstash使用流程如下:

3、安裝Logstash
下載[:官網下載頁面](https://www.elastic.co/downloads/logstash),約90M
解壓:
> tar zxvf /luyou/elk/logstash-5.2.2.tar.gz
最簡單的執行(省去了filters):
> bin/logstash -e 'input { stdin { } } output { stdout {} }'
成功的話,會看到這樣一個信息:
- Successfully started Logstash API endpoint {:port=>9600}
上面的命令,使用了標準輸入`stdin`和標準輸出`stdout`插件,你在命令行的所有輸入,都會輸出到控制臺(再次顯示)。
這時候輸入一些字符,都會再輸出一遍,但是已經默認帶上了**時間**和**IP**信息。到這里,安裝就算成功了。
4、配置
上邊的例子只能是驗證是否安裝成功,下面來看一下如何配置
> vim config/jvm.options
這里jvm的設置,請根據自己的環境適當調整。
在安裝目錄創建一個\.conf文件,比如ly.conf,編輯如下:
```
input {
file {
path => "/luyou/elk/logs/test.log"
}
}
filter {
}
output {
elasticsearch {
hosts => ["192.168.87.131:9200"]
user => "elastic"
password => "123456"
}
}
```
執行:
> bin/logstash -f ly.conf
這只是一個簡單的例子,而Logstash里面最強大的filter插件并沒有涉及。
關于filter,我個人認為是Logstash的亮點所在(也是學習成本最高的),它對進來的數據經過篩選、格式化、重命名、分段、組合、添加,轉換成你最終想要的格式,再輸出。關于filter的介紹,至少要重新寫一個章節。
5、個人看Logstash優缺點
優點 | 缺點
:---:|:---:
不依賴于Elastic的其他組件,可獨立使用 |比較笨重,安裝包有近90M
適用范圍非常廣泛,幾乎包括了所有常見的應用場景 | 有時候,配置文件會很繁瑣
Filter功能強大,滿足你的“私人訂制” | 學習成本較高
正因為有了Logstash的這些缺點,才有了**Beat**組件的流行
## Beat組件安裝
1、Beat簡介
上邊已經說了,Logstash雖然功能強大,但過于笨重。假如我們有多臺服務器,每臺服務器都安裝Logstash顯然不是好主意。于是,有了Beat組件集,你可以把它看成一個filter已經定義成模板的,滿足于特定需求的Logstash。
Beat組件盡可能輕量,通過不同的類型來滿足不同的需求,在功能上甚至是Logstash的一種補充。官網對Beat組件所做的事情就是:**獲取特定格式的數據,然后發送給ES或Logstash(Logstash再對數據進一步處理),并在Kibana上展示出來**
2、Beat分類
官方Beat有如下幾種:
- **Filebeat**:獲取數據(日志)文件
- **Metricbeat**:獲取系統信息
- **Packetbeat**:獲取網絡包(并分析)
- **Winlogbeat**:獲取Windows事件日志
- **Heartbeat**:獲取服務器存活信息
下面這張圖可以很好理解Beat的作用:

> 注意,beat不只是能輸出到ES或Logstash,還能輸出到**kafka**、**Redis**、**文件**、**控制臺**...
下面這張圖,通過filebeat讓你更好的知道beat的功能:

更好的消息是,官方結合Beat推出了做好的Kibana **Dashboard**,可以拿來即用。
3、Beat安裝(以**Metricbeat**為例)
- 下載合適的版本,我這里是按照centos6.8 選在Linux 64位 [下載頁面](https://www.elastic.co/downloads/beats/metricbeat)
- 解壓,進入目錄
> vim metricbeat.yml
這里我們演示發送到ES的配置。在配置文件最后,提供了ES、Logstash、Logging的配置示例,默認ES是打開的,這里我們修改如下(ES沒有安裝x-pack可以不配用戶密碼):
> hosts: ["192.168.87.131:9200"]
> username: "elastic"
> password: "123456"
- 保存、退出
- ES安裝metricbeat模板:
> curl -XPUT -u elastic:123456 'http://192.168.87.131:9200/_template/metricbeat' --data-binary @/etc/luyou/metricbeat-5.2.2-linux-x86_64/metricbeat.template.json
- 安裝官方提供的Dashboard
1. 切換到Metricbeat安裝目錄
2. ~~最基本的安裝方式為(這里不適合,默認安裝ES地址為locahhost:9200,而且沒有認證)~~
> ./scripts/import_dashboards
3. 這里這樣安裝
1. 下載所有的Dashboard到當前目錄[ https://artifacts.elastic.co/downloads/beats/beats-dashboards/beats-dashboards-5.2.2.zip]( https://artifacts.elastic.co/downloads/beats/beats-dashboards/beats-dashboards-5.2.2.zip)
2. 通過文件安裝,安裝到指定的ES,使用用戶名和密碼
> ./scripts/import_dashboards -file beats-dashboards-5.2.2.zip -es http://192.168.87.131:9200 -user elastic -pass 123456
4. 這樣安裝就結束了
4、運行Beat(以**Metricbeat**為例),看效果
- 在安裝了官方提供的Dashboard后,可以在kibana中看見如下定義好的圖表模板

- 啟動Metricbeat
> ./metricbeat
- kibana添加索引

- 在這里添加,找幾個和系統性能相關的圖表,排一下版,可以保存

- 你保存的以后可以在這里打開,這里還有一些已經定義好的。

- 可以展示了,注意右上角的時間范圍和刷新頻率

先到這里,待續.....