ELK學習筆記(1):安裝ElasticSearch、Logstash、Kibana

自從去年下半年調到新的部門後,ELK三個字就一直伴著我,不論是工作上或在生活上,常會看到這個名詞,對於這個系統,想找時間深入瞭解它的運作方式。趁著這段等待期,整理一下手邊的資料,從安裝 ELK 到視覺化的呈現與製作,將實作的過程,透過部落格紀錄下來,免得不常使用又忘記了。

那麼,ELK是什麼?「ELK」是三個開源軟體專案的字首縮寫:Elasticsearch,Logstash和Kibana。Elasticsearch是一個搜索和分析引擎。Logstash是一個日誌數據處理系統,可同時從多個來源獲取資料,將其轉換發送到 Elasticsearch 的「儲存」系統。Kibana讓用戶藉由Elasticsearch中的圖表進行數據可視化的呈現。

ELK 最常被用來作為日誌保存系統,運作的方式是將設備的日誌,透過檔案或Syslog傳送給Logstash 進行解析,再存入 ElasticSearch進行查詢及統計,最後由 Kibana將統計的結果使用視覺化的方式呈現出來。流程如下圖:

在學習ELK前,有幾個重要的名詞與觀念需要瞭解:

  • index: Elasticsearch的index相當於一個資料庫。
  • type: 相當於資料庫的一個表。 
  • id: 唯一值,類似資料庫的主鍵 Primary Key。 
  • node: 節點是Elasticsearch實例(Instance),可以看成叢集(Cluster)中的一個節點。一台機器可以執行多個實例,但是同一台機器上的實例在配置上要確保http和tcp Port不同。 
  • cluster: 代表一個叢集,叢集中有多個節點,其中有一個會被選爲主節點,這個主節點是可以通過選舉産生的,主從節點是對於集群內部來說的。 
  • document: 稱之爲文檔,它代表了一個能被索引的最小數據單元。在一個Index或者Type中,可以存儲很多個文檔。雖然文檔是儲存在Index中,但實際上,它必需被索引或分配到Index中的一個Type上。
  • shards: 代表索引的分片,Elasticsearch可以把一個完整的索引分成多個分片,好處是可以把一個大的索引拆分成多個,分布到不同的節點上,構成分布式搜索,加快處理速度。分片的數量只能在索引創建前指定,如果索引創建後不能更改。 
  • replicas: 代表索引副本,Elasticsearch可以設置多個索引的副本,副本的作用一是提高系統的容錯性,當個某個節點某個分片損壞或丟失時可以從副本中恢復。二是提高Elasticsearch的查詢效率,Elasticsearch會自動對搜索請求進行負載均衡。

本篇實作先從安裝 ELK 開始,使用Docker容器安裝,安裝Docker的方法可參考:Linux學習筆記(2):安裝Docker與Container ,如需參考官方網站詳細說明或在其他不同作業系統安裝的方法可參考:Install Elasticsearch with Docker

方法一:個別安裝
安裝 ElasticSearch
從Docker Hub下載安裝官方的ElasticSearch
$ sudo docker pull docker.elastic.co/elasticsearch/elasticsearch:6.2.4
啟動 ElasticSearch
$ sudo docker run -p 9200:9200 -p 9300:9300 -e "discovery.type=single-node" docker.elastic.co/elasticsearch/elasticsearch:6.2.4
安裝好 ElasticSearch之後,需先設定 vm.max_map_count值,至少需大於262144這個值,設定需在 /etc/sysctl.conf 檔案中加入以下這行:
vm.max_map_count=262144
如果要在線上系統直接啟動設定,可以執行以下這行指令:
$ sudo sysctl -w vm.max_map_count=262144
安裝 Kibana
$ docker pull docker.elastic.co/kibana/kibana:6.2.4
安裝 Logstash
$ docker pull docker.elastic.co/logstash/logstash:6.2.4

如果要安裝 ELK各版本,可直接到 Docker @ Elastic 看看要安裝哪個 ELK Docker 的版本。




方法二:套裝ELK Docker
在 Docker Hub中可以找到好幾套ELK的影像檔,其中下載排名最多的是 sebp/elk,其安裝方式很簡單,只要一行指令就安裝好了,指令如下:
$ sudo docker pull sebp/elk
啟動 ELK
$ sudo docker run -p 5601:5601 -p 9200:9200 -p 5044:5044 -it --name elk sebp/elk
第一次啟動時,出現Starting Elasticsearch Server  [fail]的錯誤,推究其原因,應該是我虛擬機的記憶體設定為1G,太小了,另一個可能是我沒有設定vm.max_map_count,這兩個修改後,就可正常啟動了。
檢查 ElasticSearch是否正常啟動,可以在瀏覽器上輸入:
http://your_ip:9200
此時會出現需要登入帳號密碼的畫面,預設帳密是 elastic / password
檢查 Kibana是否正常啟動,可以在瀏覽器上輸入:
http://your_ip:5601
如果出現以下畫面,表示正常啟動。

安裝 docker-compose
上述指令會一直佔用終端機,可以改用 docker-compose 這個工具,一次啟動多個 Docker,安裝方法如下:
$ sudo apt-get install docker-compose
docker-compose會讀取一個設定檔 docker-compose.yml,如果使用方法一安裝,設定檔內容如下:
version: '2'

services:
  elasticsearch:
    image: docker.elastic.co/elasticsearch/elasticsearch:6.2.4
    ports:
      - "9200:9200"
      - "9300:9300"
    environment:
      ES_JAVA_OPTS: "-Xms1g -Xmx1g"
    networks:
      - elk

  logstash:
    image: docker.elastic.co/logstash/logstash:6.2.4
    ports:
      - "5000:5000"
    networks:
      - elk
    depends_on:
      - elasticsearch

  kibana:
    image: docker.elastic.co/kibana/kibana:6.2.4
    ports:
      - "5601:5601"
    networks:
      - elk
    depends_on:
      - elasticsearch

networks:
  elk:
    driver: bridge
如果使用方法二安裝,設定檔內容如下:
elk:
  image: sebp/elk
  ports:
    - "5601:5601"
    - "9200:9200"
    - "5044:5044"
啟動或重新啟動定義在docker-compose.yml 的所有應用程式,可以加上 -d,改成在背景執行
$ docker-compose up -d
停用定義在docker-compose.yml 的應用程式
$ docker-compose down
重新啟動之前創建但已停止的容器,不創建新的容器。
$ docker-compose start
停止已經處於運行狀態的容器,但不删除它。
$ docker-compose stop
檢查目前 Docker 啟動的程式:
$ docker-compose ps
方法一執行的結果如下:

[參考資料]
https://www.elastic.co/guide/en/elasticsearch/reference/current/install-elasticsearch.html
https://elk-docker.readthedocs.io/#installation

[修訂紀錄]
2018.05.04 初版

1 留言

張貼留言

較新的 較舊