CentOS下ELK的搭建

前言:

此文適合剛接觸ELK的同仁,筆者在搭建過程中跳了不少坑,在此總結出來,希望能幫到大家。

背景:

ELK由Elasticsearch、Logstash和Kibana三部分組件組成;
Logstash: logstash server端用來蒐集日誌;
Elasticsearch: 存儲各類日誌;
Kibana: web化接口用作查尋和可視化日誌;
Logstash Forwarder: logstash client端用來通過lumberjack 網絡協議發送日誌到logstash server;

1.安裝JDK


1.1下載地址

  下載完成後,在CentOS服務器上解壓縮:tar xvzf jdk-8u131-linux-x64.tar.gz -C /usr/lib/jvm/


1.2配置環境變量

第一種:
vim ~/.bashrc,再文檔最下部分添加:
JAVA_HOME=/usr/lib/jvm/jdk1.8.0_131
JRE_HOME=$JAVA_HOME/jre
PATH=$PATH:$JAVA_HOME/bin:/sbin:/usr/bin:/usr/sbin
CLASSPATH=.:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar
export JAVA_HOME
export JRE_HOME
export PATH
export CLASSPATH
執行:source ~/.bashrc,使bashrc文件生效。執行java -version和java,有相應數據則安裝成功。

第二種(筆者採用的第二種):
vim /etc/profile,再文檔最下部分添加:
JAVA_HOME=/usr/lib/jvm/jdk1.8.0_131
JRE_HOME=$JAVA_HOME/jre
PATH=$PATH:$JAVA_HOME/bin:/sbin:/usr/bin:/usr/sbin
CLASSPATH=.:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar
export JAVA_HOME
export JRE_HOME
export PATH
export CLASSPATH
執行:source /etc/profile,使profile文件生效。執行java -version和java,有相應數據則安裝成功。


2.安裝ELK


2.1下載ELK

考慮到不是所有的服務器都具備網絡環境,筆者這裏自行下載。地址https://www.elastic.co/downloads/

下載完成之後,FTP上傳到服務器上,筆者放到/elk文件夾下,依次解壓縮,如圖所示,由上到下分別爲解壓縮後的elasticsearch、kibana、logstash和3者的安裝包。。

      


2.2啓動elasticsearch


2.2.1修改elasticsearch.yml內容

進入elasticsearch/config文件夾,修改elasticsearch.yml文件,修改增加以下內容:
  path.data: /elk/elasticsearch/data
  path.logs: /elk/elasticsearch/logs
  network.host: 10.8.120.37
  http.port: 9200
  http.cors.enabled: true
  http.cors.allow-origin: "*"

2.2.2新建用戶

注意:elasticsearch不能再root用戶下啓動,應新建普通用戶如“elk”,並將總目錄elk的操作權限賦給elk用戶:
useradd elk
passwd elk 12345679
chown -R elk:12345679 /elk 


2.2.3進入普通用戶啓動elasticsearch

su elk
cd /elk/elasticsearch
./bin/elasticsearch -d

瀏覽器輸入http://ip:9200,當有以下效果時,說明elasticsearch啓動成功!


啓動過程中的一些錯誤:
1.啓動報錯access denied (javax.management.MBeanTrustPermission register)
方法:修改jre/lib/security/java.policy文件,在grant尾部加入permission javax.management.MBeanTrustPermission "register";

2.啓動報錯max virtual memory areas vm.max_map_count [65530] is too low, increase to at least [262144]
  方法1:root身份下->sudo sysctl -w vm.max_map_count=262144,sysctl -a|grep vm.max_map_count,可以臨時修改
  方法2:root身份下->vm.max_map_count=262144直接寫到/etc/sysctl.conf中,然後執行sysctl -p,達到永久修改

3.啓動報錯max file descriptors [65535] for elasticsearch process is too low, increase to at least [65536]
  方法1:root身份下->vi /etc/security/limits.conf,* soft nofile 65536,* hard nofile 131072,* soft nproc 2048,* hard nproc 4096


2.3啓動logstash

編寫配置文件(名字和位置自定義即可,啓動時需要指定),筆者放在config目錄下,取名爲screen_to_es.conf,內容如下
input {
    stdin{
  }
}
output {
  elasticsearch {
    hosts  => "10.8.120.37:9200"
    index => "logstash-%{+YYYY.MM.dd}"
}
啓動logstash,-e:意即執行,--config或-f:意即文件執行。
cd /elk/logstash
./bin/logstash -f config/screen_to_es.conf

之後在屏幕上輸入的內容將在kibana界面展示出來,具體見下文Kibana使用教程。


2.3.1 Logstash聯動Kafka

由logstash輸入,發送至kafka。建立logstash_to_kafka.conf,內容如下
input{
    stdin{}
}
output{
    kafka{
        topic_id => "test"
        bootstrap_servers => "10.8.120.25:9092" # kafka的地址
        batch_size => 5
    }
    stdout{
        codec => rubydebug
    }
}
啓動logstash
cd /elk/logstash
./bin/logstash -f config/logstash_to_kafka.conf

利用logstash從kafka讀數據。建立kafka_to_logstash.conf,內容如下
input{
    kafka {
        codec => "plain"
        group_id => "logstash"
        auto_offset_reset => "smallest"
        reset_beginning => true
        topic_id => "test"
        zk_connect => "10.8.120.25:2181" # zookeeper的地址
   }

}
output{
    elasticsearch {
    hosts  => "10.8.120.37:9200"
    index => "logstash-%{+YYYY.MM.dd}"
  }

}
啓動logstash
cd /elk/logstash
./bin/logstash -f config/kafka_to_logstash.conf

2.3.2 Logstash聯動Kafka

這裏有個坑,這裏有個坑,這裏有個坑,筆者跳的很深!

logstash從kafka讀數據時,跟 版本有很大關係,具體如下

所以當版不對應時,建議換方案實施。筆者用的是kafka_2.9.1-0.8.2.1和logstash-5.4.1,於是帶來了深深的問題,因爲kafka在生產系統,所以只能降logstash的版本,最終降爲logstash-2.3.4。不同版本從kafka取消息的配置文件是不同的,這裏筆者分別給出5.xx和兩2.xx兩個版本的配置文件內容。
logstash-5.4.1版本配置
input{
  kafka {
    bootstrap_servers => ["10.8.120.25:9092"]
    topics => ["test"]
    group_id => "logstash"
    codec => "json"
    consumer_threads =>2
    decorate_events => true
  }
}
 output {
  elasticsearch {
    hosts => ["10.8.120.37:9200"]
    index => "logstash-%{+YYYY.MM.dd}"
  }
}

logstash-2.3.4版本配置
input{
    kafka {
        codec => "plain"
        group_id => "logstash"
        auto_offset_reset => "smallest"
        reset_beginning => true
        topic_id => "test"
        zk_connect => "10.8.120.25:2181" # zookeeper的地址
   }

}
output{
    elasticsearch {
    hosts  => "10.8.120.37:9200"
    index => "logstash-%{+YYYY.MM.dd}"
  }

}

1對多:如果一個logstash同時取多個topic,運行logstash時,以config爲條件運行即可,在config目錄下寫多個.conf文件,logstash會自動將之融合成一個大的條件。
./bin/logstash -f config

多對1:如果多個logstash同時取一個topic時,需要明確的是topic的一個分區只能被一個消費者組消費,所以對topic指向不同的分區即可。

2.4啓動kibana

進入/elk/kibana/config目錄,修改kibana.yml文件
server.port: 5601
server.host: "10.8.120.37"
kibana.index: ".kibana"
elasticsearch.url: "http://10.8.120.37:9200"
啓動kibaba:
cd /elk/kibana
./bin/kibana

瀏覽器輸入http://ip:5601,當有以下效果時說明kibana啓動成功


3.在Kibana中查看日誌

1.輸入http://ip:5601進入kibana主界面。

2.進入Management管理頁,點擊Index Patterns索引模式。

3.默認索引爲“logstash-*”,如果建立了自己的索引,可以在此輸入,然後回車建立。

4.筆者這裏用的默認索引,建立後如果出現這個界面,則說明你的日誌收集成功了(如果未出現這個頁面,請自行找一下問題的出處,logstash-elasticsearch)。

5.此時,進入Discover發現頁面,即可找到自己的日誌。


總結:

本文由筆者自行編寫,如有錯誤的地方,還請諸位同仁指正。
祝大家學業進步,事業有成!
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章