搭建ELK日志系統

一、環境準備

最近學習了下ELK系統,這里把自己搭建ELK的流程步驟記錄下,以方便后面進行回顧。


搭建拓撲

因為本地資源原因,我在ES1上搭建部署Kibana展示ES集群所收集到的日志索引,資源充足的童鞋可以把Kibana部署為一個獨立的服務器。 此拓撲架構,使用filebeat作為日志采集器(因為logstash的資源消耗高的原因,目前很多ELK架構中均是使用filebeat作為日志采集器),中間部署一Logstash服務器用作日志轉發和過濾,最后Logstash將處理過的日志傳輸到ES集群并有kibana進行展示。另外對于日志量很高的環境,還可以在Logstash和filebeat之間部署redis服務器作為緩存手段,以保障Logstash能夠正常處理轉發相關的日志信息。

系統環境:Centos 6.9
軟件版本:Elasticsearch 6.3.1、Logstash 6.3.1、Filebeat 6.3.1、kibana 6.3.1、jdk1.8
相關軟件包下載地址:
JDK:http://www.oracle.com/technetwork/java/javase/downloads/jdk8-downloads-2133151.html
ELK:https://www.elastic.co/downloads

二、搭建Elasticsearch集群

1、安裝jdk

每一個ES服務器均需要安裝jdk,我習慣使用tar包安裝jdk,這樣可以方便未來對jdk包進行更新。
首先下載相應的jdk包,并放置到指定的目錄:

[root@ES1 ~]# cd /usr/local/src/
[root@ES1 src]# ll
total 181296
-rw-r--r--. 1 root root 185646832 Jul 22 15:30 jdk-8u181-linux-x64.tar.gz
[root@ES1 src]# tar zxf jdk-8u181-linux-x64.tar.gz
[root@ES1 src]# ln -sv /usr/local/src/jdk1.8.0_181/ /usr/local/jdk    #創建jdk鏈接目錄,后續jdk更新只需要替換鏈接文件即可
`/usr/local/jdk' -> `/usr/local/src/jdk1.8.0_181/'
[root@ES1 src]# vim /etc/profile.d/jdk.sh
JAVA_HOME=/usr/local/jdk
JRE_HOME=$JAVA_HOME/jre
PATH=$PATH:$JAVA_HOME/bin:$JRE_HOME/bin
CLASSPATH=:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar:$JRE_HOME/lib/dt.jar
export JAVA_HOME JRE_HOME PATH CLASSPATH
[root@ES1 src]# source /etc/profile.d/jdk.sh
[root@ES1 src]# java -version      #此命令執行成功意味著jdk安裝成功
java version "1.8.0_181"
Java(TM) SE Runtime Environment (build 1.8.0_181-b13)
Java HotSpot(TM) 64-Bit Server VM (build 25.181-b13, mixed mode)

重復上述步驟,在ES服務器上都安裝jdk。

2、安裝Elasticsearch

下載Elasticsearch 的rpm包,并放置在指定的目錄下,此處我繼續放置在/usr/local/src下:

[root@ES1 src]# wget https://artifacts.elastic.co/downloads/elasticsearch/elasticsearch-6.3.1.rpm
[root@ES1 src]# rpm -ivh elasticsearch-6.3.1.rpm 
warning: elasticsearch-6.3.1.rpm: Header V4 RSA/SHA512 Signature, key ID d88e42b4: NOKEY
Preparing...                ########################################### [100%]
Creating elasticsearch group... OK
Creating elasticsearch user... OK
   1:elasticsearch          ########################################### [100%]
### NOT starting on installation, please execute the following statements to configure elasticsearch service to start automatically using chkconfig
 sudo chkconfig --add elasticsearch
### You can start elasticsearch service by executing
 sudo service elasticsearch start
Created elasticsearch keystore in /etc/elasticsearch

#按照安裝提示,添加開機自啟動Elasticsearch服務
[root@ES1 src]# chkconfig --add elasticsearch
[root@ES1 src]# chkconfig elasticsearch on

按照上述步驟,在三臺ES上均安裝Elasticsearch服務。

3、配置啟動Elasticsearch服務

在對應的ES服務器上修改其相應的Elasticsearch配置文件/etc/elasticsearch/elasticsearch.yml:

[root@ES1 src]# grep ^[a-Z] /etc/elasticsearch/elasticsearch.yml
cluster.name: elk-cluster       #集群名字,用于識別網絡中的ES是否為同一個集群
node.name: ES1      #集群節點的唯一標識
path.data: /elk/data     #數據目錄,注意其屬主和屬組需為Elasticsearch用戶
path.logs: /elk/logs    #日志目錄
bootstrap.memory_lock: false
network.host: 192.168.0.91    #Elasticsearch監控的本機Ip
http.port: 9200    #Elasticsearch監控的端口
discovery.zen.ping.unicast.hosts: ["192.168.0.91", "192.168.0.92","192.168.0.93"]    #自動單播發現的主機列表
discovery.zen.minimum_master_nodes: 2    #設置集群中的節點至少知道多少個可以成為master的節點,通常建議設置為集群總節點數量/2+1

#創建相應的數據目錄和日志目錄并更改其屬主和屬組
[root@ES1 src]# mkdir -pv /elk/{data,logs}
mkdir: created directory `/elk'
mkdir: created directory `/elk/data'
mkdir: created directory `/elk/logs'
[root@ES1 src]# chown -R elasticsearch.elasticsearch /elk

配置完成后即可嘗試啟動Elasticsearch服務,不過有可能會出現類似如下的報錯:

  • 錯誤1:缺少相應的java程序
[root@ES1 src]# service elasticsearch start
which: no java in (/sbin:/usr/sbin:/bin:/usr/bin)
Could not find any executable java binary. Please install java in your PATH or set JAVA_HOME

解決辦法:將相應的java程序鏈接到指定目錄

[root@ES1 src]# ln -sv /usr/local/jdk/bin/java /usr/sbin/java
`/usr/sbin/java' -> `/usr/local/jdk/bin/java'
[root@ES1 src]# ln -sv /usr/local/jdk/bin/java /usr/bin/java
`/usr/bin/java' -> `/usr/local/jdk/bin/java'
  • 錯誤2:最大線程數不足
[1]: max number of threads [1024] for user [elasticsearch] is too low, increase to at least [4096]

解決辦法:

#修改指定用戶的最大線程數或者所有用戶的最大線程數
[root@ES1 src]# vim /etc/security/limits.d/90-nproc.conf
elasticsearch   soft    nproc   4096
elasticsearch   hard   nproc   4096
*          soft    nproc     1024
root       soft    nproc     unlimited

#修改完成后重新登錄
  • 錯誤3:禁用bootstrap.system_call_filter
[2]: system call filters failed to install; check the logs and fix your configuration or disable system call filters at your own risk

解決辦法:修改/etc/elasticsearch/elasticsearch.yml配置文件,添加下述參數:

[root@ES1 src]# vim /etc/elasticsearch/elasticsearch.yml
bootstrap.system_call_filter: false

最后成功啟動Elasticsearch服務,即可查看到已經監控的9200、9300端口:

[root@ES1 ~]# service elasticsearch start

[root@ES1 ~]# ss -tnl
State       Recv-Q Send-Q                                 Local Address:Port                                   Peer Address:Port 
LISTEN      0      128                              ::ffff:192.168.0.91:9200                                             :::*     
LISTEN      0      128                              ::ffff:192.168.0.91:9300                                             :::*     
LISTEN      0      128                                               :::22                                               :::*     
LISTEN      0      128                                                *:22                                                *:*     
LISTEN      0      100                                              ::1:25                                               :::*     
LISTEN      0      100                                        127.0.0.1:25                                                *:*     

curl能查看到下述類似輸出即說明Elasticsearch服務運行正常:

[root@ES1 ~]# curl http://192.168.0.91:9200
{
  "name" : "ES1",
  "cluster_name" : "elk-cluster",
  "cluster_uuid" : "_na_",
  "version" : {
    "number" : "6.3.1",
    "build_flavor" : "default",
    "build_type" : "rpm",
    "build_hash" : "eb782d0",
    "build_date" : "2018-06-29T21:59:26.107521Z",
    "build_snapshot" : false,
    "lucene_version" : "7.3.1",
    "minimum_wire_compatibility_version" : "5.6.0",
    "minimum_index_compatibility_version" : "5.0.0"
  },
  "tagline" : "You Know, for Search"
}

最后在各ES服務器上配置啟動完成Elasticsearch服務后,即可用curl查看相應ES集群的情況:

[root@ES1 ~]# curl -XGET  http://192.168.0.91:9200/_cat/nodes?v
ip           heap.percent ram.percent cpu load_1m load_5m load_15m node.role master name
192.168.0.92           14          93   3    0.34    0.19     0.10 mdi       -      ES2
192.168.0.91           13          93   2    0.14    0.05     0.08 mdi       *      ES1
192.168.0.93           12          93  13    0.43    0.41     0.19 mdi       -      ES3

如能查看到上述信息,說明ES集群運行正常。

4、安裝Elasticsearch head界面

Elasticsearch head的github頁面為:https://github.com/mobz/elasticsearch-head

這里我在ES1上安裝Elasticsearch head組件,事先git,然后復制下載相應的倉庫進行安裝啟動:

[root@ES1 src]# git clone https://github.com/mobz/elasticsearch-head.git
[root@ES1 src]# cd elasticsearch-head
[root@ES1 elasticsearch-head]# npm config set strict-ssl false    #強制使用http連接
[root@ES1 elasticsearch-head]# npm install      #npm命令來源于epel倉庫
[root@ES1 elasticsearch-head]# nohup npm rum start &    #在后臺運行npm腳本

啟動完成后,訪問http://192.168.0.91:9100應能查看到下述界面:


elasticsearch head 界面

此界面可用于查看集群的索引、分片等狀態及進行一系列的查詢操作。
另外為了能讓elasticsearch head插件能夠正常連接上elasticsearch,需要在elasticsearch的配置文件中添加下述配置:

[root@ES1 elasticsearch-head]# vim /etc/elasticsearch/elasticsearch.yml
http.cors.enabled: true
http.cors.allow-origin: "*"

最后重啟elasticsearch服務器即可。

連接查看elastic狀態

二、搭建Logstash服務

1、安裝logstash服務

#事先下載好相應的logstash安裝包和jdk包
[root@logstash ~]# cd /usr/local/src/
[root@logstash src]# ll 
total 322800
-rw-r--r--. 1 root root 185646832 Jul 22 20:25 jdk-8u181-linux-x64.tar.gz
-rw-r--r--. 1 root root 144898446 Jul 22 20:25 logstash-6.3.1.rpm

#按照此前描述的方式安裝jdk服務,確保能夠正常運行java -version命令
#然后安裝logstash 的rpm包
[root@logstash src]# rpm -ivh logstash-6.3.1.rpm 
warning: logstash-6.3.1.rpm: Header V4 RSA/SHA512 Signature, key ID d88e42b4: NOKEY
Preparing...                ########################################### [100%]
   1:logstash               ########################################### [100%]
Using provided startup.options file: /etc/logstash/startup.options
Successfully created system startup script for Logstash

2、配置啟動logstash

為了使用logstash,需要創建logstash的配置文件,配置文件中會指定使用的插件及每個插件的位置。logstash的配置文件主要分為三部分:input、output及filter。創建完成logstash的配置文件后就可以啟動logstash了。

#修改用戶logstash的shell為/bin/bash,以便切換登錄
[root@logstash src]# usermod logstash -s /bin/bash

#在/etc/logstash/conf.d/ 目錄下創建配置文件logstashtest.conf
[root@logstash src]# vim /etc/logstash/conf.d/logstashtest.conf
input {        #配置兩個輸入源,一個位filebeat,一個位標準輸入
        beats {          
                host => '0.0.0.0'
                port => 5044
        }
        stdin {    
                type => "stdandardinput"
        }

}

output {        #配置兩個輸出源,一個是elasticsearch集群、一個是標準輸出
        elasticsearch {
                hosts => ["192.168.0.91:9200","192.168.0.92:9200","192.168.0.93:9200"]
                index => ["logstash-nginxaccesslog"]
        }
        stdout {
                codec => "rubydebug"
        }
}

#切換到logstash用戶
[root@logstash src]# su - logstash
#檢查logstash配置文件
-bash-4.1$ /usr/share/logstash/bin/logstash --path.settings /etc/logstash/ -t -f /etc/logstash/conf.d/logstashtest.conf
....
Configuration OK        #如果出現Configuration OK 信息,則說明配置沒問題,可嘗試啟動logstash

#啟動logstash服務
-bash-4.1$ /usr/share/logstash/bin/logstash --path.settings /etc/logstash/ -f /etc/logstash/conf.d/logstashtest.conf       #此方式啟動logstash,logstash會運行在前臺,可通過添加nohup...&的方式來使其運行為后臺進程
hello logstash        #通過在標準輸入輸入此消息,若能獲取下述類似消息,說明logstash運行正常。
{
    "@timestamp" => 2018-07-22T13:01:02.381Z,
          "host" => "0.0.0.0",
          "type" => "stdandardinput",
      "@version" => "1",
       "message" => "hello logstash"
}

本文使用的安裝方法在安裝完logstash后,不會自動創建生成logstash的init文件,但是logstash提供了一個程序來讓管理員手動創建init文件:

#確保在/usr/bin/java 鏈接到相應的java目錄下的java程序
[root@logstash src]# ln -sv /usr/local/jdk/bin/java /usr/bin/java

#調用logstash提供的system-install 和 startup.options文件來創建logstash的init文件,其中Centos 7使用參數systemd,Centos6 使用sysv
[root@logstash src]# /usr/share/logstash/bin/system-install /etc/logstash/startup.options sysv
#創建完成后即可使用service 或systemctl命令來管理啟動logstash

在logstash的配置文件中還可以配置filter進行日志過濾,本文暫不介紹。

三、搭建filebeat服務

1、在指定的nginx服務器上安裝filebeat服務

[root@web ~]# cd /usr/local/src/
[root@web src]# ll
total 12500
-rw-r--r--. 1 root root 12799471 Jul 22 21:13 filebeat-6.3.1-x86_64.rpm

2、配置filebeat配置文件抓取nginx的訪問日志


[root@web src]# vim /etc/filebeat/filebeat.yml
filebeat.inputs:
- type: log
  enabled: true
  paths:
     - /var/log/nginx/*.log      #抓取nginx日志
filebeat.config.modules:
  path: ${path.config}/modules.d/*.yml
  reload.enabled: false
setup.template.settings:
  index.number_of_shards: 3
output.logstash:
  hosts: ["192.168.0.94:5044"]    #將抓取的日志發送的logstash指定的IP和接口

最后啟動filebeat服務即可

[root@web src]# service filebeat start

四、搭建kibana

在ES1服務器上安裝kibana服務,展示elasticsearch收集到的日志索引。

[root@ES1 ~]# cd /usr/local/src/
[root@ES1 src]# rpm -ivh kibana-6.3.1-x86_64.rpm 

#修改kiban配置文件
[root@ES1 src]# vim /etc/kibana/kibana.yml
server.port: 5601
server.host: "192.168.0.91"
server.name: "elk1"
elasticsearch.url: "http://192.168.0.91:9200"

#啟動kibana
[root@ES1 src]# service kibana start

啟動完成后訪問http://192.168.0.91:5601端口即可訪問相應的kibana界面。


Kibana界面

從上述可看到,kibana已經識別到我們此前配置的索引了。

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容