ELK最流行架構的搭建filebeat+kafka+zookeeper+ELK

本文給你們分享一下,如何搭建一個最爲流行的ELK架構,上一篇博文中已經給你們分享過ELK架構的演變之路,html

也給出了當下最爲流行的ELK日誌架構,那就是filebeat+kafka(zookeeper)+logstash+elasticsearch+kibana。java


ELK的版本比較多,5.X版本和6.X版本之間差距較大,若是是打算新上系統的同仁,建議使用6.X版本,新版本的確功能node

提高較大,並且可視化功能也作的比早期的版本都要美觀及強大。固然使用新版須要投入更多的時間及精力深刻研究,linux

畢竟新版技術文檔不全,會有不少的不明之處等待着自行趟坑,但對於考慮ELK往後的可運維性以及勇於挑戰自我學力nginx

能力的同仁,仍是推薦使用新版的。web


官方提供的安裝方式有兩種,一種是基於二進制包展開的安裝方式,另外一種是直接使用rpm包進行安裝。考慮到安裝的便捷性正則表達式

及可維護性,咱們選擇rpm安裝方式。kafka和zookeeper官方是沒有發行rpm包的,因此只能使用二進制方式安裝。apache


環境展現:bootstrap

OS:CentOS 7.4.1708vim

filebeat:6.4.0

zookeeper:kafka 內置版本

kafka:2.12-2

logstash:6.4.0

elasticsearch:6.4.0

kibana:6.4.0


本次演示(固然筆者的生產環境已經正式使用這套ELK了),全部節點均採用單節點方式

爲了節約資源,咱們將對所需節點進行壓縮

壓縮後資源分佈以下:

kibana+elasticsearch:192.168.10.101

logstash+kafka+zookeeper:192.168.10.102

filebeat+nginx:192.168.10.150


全部節點基礎工具安裝及設定,保持統一(iptables禁用、SELinux禁用)

yum install -y net-tools lrzsz telnet vim dos2unix bash-completion\

ntpdate sysstat tcpdump traceroute nc wget

echo -e "\nset nu\nset ai\nset nohlsearch\nset ts=4" >> /etc/vimrc && source /etc/vimrc

echo 'HISTTIMEFORMAT="+%F %T "' >> /etc/profile && source /etc/profile

sed -i s/'#ListenAddress 0/ListenAddress 0/' /etc/ssh/sshd_config && systemctl restart sshd

systemctl disabled postfix

systemctl disable postfix

sed -i s/^SELINUX=enforcing/SELINUX=disabled/ /etc/selinux/config

setenforce 0

systemctl disable firewalld

systemctl stop firewalld

iptables -F


kibana elasticsearch logstash kafka zookeeper

以上軟件均是java語言基礎,因此有以上服務的節點都須要jdk環境,

因爲咱們使用ELK stack的是官方較新版本6.4.0,查詢官方推薦後決定使用升級穩定版java-1.8

爲了保持安裝的便捷性咱們同樣使用yum安裝方式進行安裝


yum install -y java-1.8.0-openjdk-devel


kibana+elasticsearch:192.168.10.101

此節點的安裝過程


安裝jdk環境

yum install -y java-1.8.0-openjdk-devel


安裝elasticsearch

wget https://artifacts.elastic.co/downloads/elasticsearch/elasticsearch-6.4.0.rpm

yum install -y elasticsearch-6.4.0.rpm

cp /etc/elasticsearch/elasticsearch.yml{,.bak}

vim /etc/elasticsearch/elasticsearch.yml


elasticsearch顯式配置內容

grep ^[[[:alnum:]] /etc/elasticsearch/elasticsearch.yml

cluster.name: my-es

node.name: node-1

path.data: /data/elasticsearch

path.logs: /data/log/elasticsearch

network.host: 0.0.0.0


建立數據目錄及日誌目錄

mkdir -pv /data/{elasticsearch,log/elasticsearch}

chown elasticsearch /data/{elasticsearch,log/elasticsearch}


設定開機自啓及啓動服務

systemctl enable elasticsearch

systemctl start elasticsearch


elasticsearch默認監聽9200和9300端口

9200用於對用戶提供服務

9300用於集羣事務通訊


安裝kibana

因爲和elasticsearch安裝在同一個節點上了,因此不須要再次安裝jdk環境了

wget https://artifacts.elastic.co/downloads/kibana/kibana-6.4.0-x86_64.rpm


vim /etc/kibana/kibana.yml


kibana顯示配置

grep ^[[:alnum:]] /etc/kibana/kibana.yml

server.host: "0.0.0.0"


設定開機自啓及啓動服務

systemctl enable kibana

systemctl start kibana


kibana默認監聽5601端口(自身就是一個web服務器)



logstash+kafka+zookeeper:192.168.10.102

此節點的安裝過程


zookeeper+kafka安裝配置


安裝jdk環境

yum install -y java-1.8.0-openjdk-devel


cd /opt && wget https://www.apache.org/dyn/closer.cgi?path=/kafka/2.0.0/kafka_2.12-2.0.0.tgz

tar xf kafka_2.12-2.0.0.tgz


配置kafka內置的zookeeper

cp /opt/kafka_2.12-2.0.0/config/zookeeper.properties{,bak}

vim /opt/kafka_2.12-2.0.0/config/zookeeper.properties


zookeeper顯式配置以下

rep ^[[:alnum:]] /opt/kafka_2.12-2.0.0/config/zookeeper.properties

dataDir=/data/zookeeper

clientPort=2181

maxClientCnxns=0



配置kafka

cp /opt/kafka_2.12-2.0.0/config/server.properties{,bak}

vim /opt/kafka_2.12-2.0.0/config/server.properties


kafka的顯示配置以下

grep ^[[:alnum:]] /opt/kafka_2.12-2.0.0/config/server.properties

broker.id=0

listeners=PLAINTEXT://192.168.10.102:9092

num.network.threads=3

num.io.threads=8

socket.send.buffer.bytes=102400

socket.receive.buffer.bytes=102400

socket.request.max.bytes=104857600

log.dirs=/data/kafka

num.partitions=1

num.recovery.threads.per.data.dir=1

offsets.topic.replication.factor=1

transaction.state.log.replication.factor=1

transaction.state.log.min.isr=1

log.retention.hours=168

log.segment.bytes=1073741824

log.retention.check.interval.ms=300000

zookeeper.connect=localhost:2181

zookeeper.connection.timeout.ms=6000

group.initial.rebalance.delay.ms=0


注意:

listeners須要明確指定kafka通訊須要監聽的IP地址,不能使用0.0.0.0,不然沒法啓動


爲了系統安全和配置的標準化

咱們須要給zookeeper和kafka建立一個系統用戶,使用這個系統用戶來管理zookeeper和kafka進程

useradd -M -d /opt/kafka_2.12-2.0.0 -r -s /sbin/nologin kafka


建立zookeeper和kafka的數據目錄

mkdir -pv /data/{zookeeper,kafka}

chown kafka /data/{zookeeper,kafka}


爲了使用方便,咱們給zookeeper和kafka各寫了一個服務管理腳本

以避免每次啓動腳本寫很長的命令,以及忘記使用kafka系統用戶啓動服務

zookeeper服務腳本

cat zk.sh

#!/usr/bin/env bash


#@Author: Lucker

#@Company: BS

#@Email: 183530300@qq.com

#@Date: 2018-08-22 14:12:17

#@Last Modified by: Lucker

#@Last Modified time: 2018-08-22 18:00:48

#@Description: zookeeper service management script


kafka_home=/opt/kafka_2.12-2.0.0


case $1 in

start)

sudo -u kafka $kafka_home/bin/zookeeper-server-start.sh \

-daemon $kafka_home/config/zookeeper.properties

;;

stop)

sudo -u kafka $kafka_home/bin/zookeeper-server-stop.sh

;;

*)

echo -e "\033[32mUsage: $0 [start|stop]\033[0m"

exit 1

;;

esac


kafka服務腳本

cat kafka.sh

#!/usr/bin/env bash


#@Author: Lucker

#@Company: BS

#@Email: 183530300@qq.com

#@Date: 2018-08-22 14:12:17

#@Last Modified by: Lucker

#@Last Modified time: 2018-08-22 14:12:17

#@Description: kafka service management script


kafka_home=/opt/kafka_2.12-2.0.0


case $1 in

start)

sudo -u kafka $kafka_home/bin/kafka-server-start.sh \

-daemon $kafka_home/config/server.properties

;;

stop)

sudo -u kafka $kafka_home/bin/kafka-server-stop.sh

;;

*)

echo -e "\033[32mUsage: $0 [start|stop]\033[0m"

exit 1

;;

esac



logstash安裝配置

因爲和kafka安裝在同一個節點上了,因此不須要再次安裝jdk環境了


wget https://artifacts.elastic.co/downloads/logstash/logstash-6.4.0.rpm

yum install -y logstash-6.4.0.rpm


配置logstash的jvm

grep -v ^# /etc/logstash/jvm.options | tr -s [[:space:]]

-Xms1g

-Xmx1g

-XX:+UseParNewGC

-XX:+UseConcMarkSweepGC

-XX:CMSInitiatingOccupancyFraction=75

-XX:+UseCMSInitiatingOccupancyOnly

-Djava.awt.headless=true

-Dfile.encoding=UTF-8

-Djruby.compile.invokedynamic=true

-Djruby.jit.threshold=0

-XX:+HeapDumpOnOutOfMemoryError

-Djava.security.egd=file:/dev/urandom


-Xms -Xmx 若是logstash是專機專用的,建議調大此處的內存數值以提高logstash的性能


logstash官方預設配置文件

cat /etc/default/logstash

LS_HOME="/usr/share/logstash"

LS_SETTINGS_DIR="/etc/logstash"

LS_PIDFILE="/var/run/logstash.pid"

LS_USER="logstash"

LS_GROUP="logstash"

LS_GC_LOG_FILE="/data/log/logstash/gc.log"

LS_OPEN_FILES="16384"

LS_NICE="19"

SERVICE_NAME="logstash"

SERVICE_DESCRIPTION="logstash"


LS_GC_LOG_FILE 建議修改成標準化的日誌存放目錄



grep ^[[:alnum:]] /etc/logstash/startup.options

LS_HOME=/usr/share/logstash

LS_SETTINGS_DIR=/etc/logstash

LS_OPTS="--path.settings ${LS_SETTINGS_DIR}"

LS_JAVA_OPTS=""

LS_PIDFILE=/var/run/logstash.pid

LS_USER=logstash

LS_GROUP=logstash

LS_GC_LOG_FILE=/data/log/logstash/gc.log

LS_OPEN_FILES=16384

LS_NICE=19

SERVICE_NAME="logstash"

SERVICE_DESCRIPTION="logstash"


變動/etc/logstash/startup.options內容以後須要使用$LS_HOME/bin/system-install

推送變動到啓動腳本環境預配置文件/etc/default/logstash中


/usr/share/logstash/bin/system-install /etc/logstash/startup.options systemd 6.4.0


使用效果以下所示

/usr/share/logstash/bin/system-install /etc/logstash/startup.options systemd 6.4.0

Using provided startup.options file: /etc/logstash/startup.options

Manually creating startup for specified platform: systemd

Manually creating startup for specified platform (systemd) version: 6.4.0

Successfully created system startup script for Logstash


以上的動做和直接修改/etc/default/logstash效果等同


logstash主配文件顯示配置以下

grep ^[[:alnum:]] /etc/logstash/logstash.yml

node.name: logstash-test

path.data: /data/logstash

path.logs: /data/log/logstash



cat /etc/logstash/conf.d/logstash-es.conf

input {

    kafka {

      bootstrap_servers => "192.168.10.102:9092"

      topics=> ["elk"]

      consumer_threads => 5

      decorate_events => true

    }

}


output {

  elasticsearch {

    hosts => ["192.168.10.101:9200"]

    index => "elk-%{+YYYY.MM.dd}"

  }

}


這裏配置的logstash只是作了一個轉發的工做,從kafka隊列中獲取消息並轉發給elasticsearch進行索引並存儲,

沒有對日誌作任何的格式處理,要想擁有較理想的效果,的確須要在此啓用filter插件,使用grok正則表達式進行

數據字段的拆分後再送往elasticsearch


建立logstash的數據及日誌目錄

mkdir -pv /data/{logstash,log/logstash}

chown logstash /data/{logstash,log/logstash}


設定開機自啓及啓動服務

systemctl enable logstash

systemctl start logstash


logstash默認監聽9600端口



filebeat+nginx:192.168.10.150

此節點的安裝過程


因爲此節點模擬業務服務器,只須要安裝日誌收集工具filebeat便可,所以無需安裝jdk環境

下載並安裝filebeat

wget https://artifacts.elastic.co/downloads/beats/filebeat/filebeat-6.4.0-x86_64.rpm

yum install -y filebeat-6.4.0-x86_64.rpm

cp /etc/filebeat/filebeat.yml{,.bak}


filebeat顯式配置以下

grep -v ^[[:space:]]*# /etc/filebeat/filebeat.yml | tr -s [[:space:]]


filebeat.inputs:

- type: log

 enabled: true

 paths:

 - /var/log/*.log

- type: log

 enabled: true

 paths:

 - /var/log/nginx/*.log

filebeat.config.modules:

 path: ${path.config}/modules.d/*.yml

 reload.enabled: false

output.kafka:

 enabled: true

 hosts: ["192.168.10.102:9092"]

 topic: elk


filebeat從本機抓取日誌後輸出到kafka列隊中


vim /etc/init.d/filebeat

args="-c /etc/filebeat/filebeat.yml -path.home /usr/share/filebeat -path.config

 /etc/filebeat -path.data /var/lib/filebeat -path.logs /var/log/filebeat"


若是要想修改filebeat的自身日誌的保存路徑,須要在在此啓動腳本中進行修改


因爲nginx只是爲了測試效果,徹底採用默認安裝,爲了方便測試效果,使用腳本批量生成了一些測試頁面,腳本內容以下


cat index.sh 

for i in {0..9}

do

  echo "test page 100$i" > /usr/share/nginx/html/index${i}.html

done


爲了方便產生日誌,使用如腳本批量訪問測試

cat curl.sh 

for i in {0..9}

do

  curl 127.0.0.1/index${i}.html

done


至此爲止,初步配置完成了,剩下的就是全面的聯調了。

爲了可以節省調試時間,建議你們從數據源頭開始作調試,

第一步:查看使用curl.sh批量訪問後nginx的access日誌收集是否正常

第二步:查看filebeat的日誌文件有沒有自身配置錯誤信息以及轉發數據到kafka隊列是否正常

       此步驟能夠在kafka服務器端使用命令行方式消費kafka中的消息進行雙邊確認

       具體操做見下文

第三步:確認kafka服務自己正常的狀況下,查看logstash日誌,若是logstash和其它服務共用節點時

       須要注意該節點的內存資源是否充足,不然logstash會由於內存不足直接啓動失敗,筆者這次

       安裝就再現過此問題

第四步:若是前面三步驗證都沒問題的狀況下,elasticsearch裏面如今生產了少許的日誌數據,但只要有

       數據存入elasticsearch,就會產生logstash out插件中預約義好的index,此時可能經過elasticsearch

       提供的查詢API驗證elasticsearch是否正常接收了來自logstash轉發過來的日誌數據

       具體操做見下文

第五步:確認elasticsearch裏面有數據之後,就可使用瀏覽器打開es_server_ip:5601頁面進行建立index模式

       注意:IE瀏覽器作此步的測試有問題,建議使用Chrome

             若是elasticsearch中沒有數據時,是沒法在kibana頁面中建立index模式



elasticsearch配置正確性驗證命令


以易讀方式查詢es中的可查詢的接口列表

[root@es-kibana ~]# curl 127.0.0.1:9200/_cat

=^.^=

/_cat/allocation

/_cat/shards

/_cat/shards/{index}

/_cat/master

/_cat/nodes

/_cat/tasks

/_cat/indices

/_cat/indices/{index}

/_cat/segments

/_cat/segments/{index}

/_cat/count

/_cat/count/{index}

/_cat/recovery

/_cat/recovery/{index}

/_cat/health

/_cat/pending_tasks

/_cat/aliases

/_cat/aliases/{alias}

/_cat/thread_pool

/_cat/thread_pool/{thread_pools}

/_cat/plugins

/_cat/fielddata

/_cat/fielddata/{fields}

/_cat/nodeattrs

/_cat/repositories

/_cat/snapshots/{repository}

/_cat/templates

[root@es-kibana ~]#


以易讀方式查詢es中的有效索引

[root@es-kibana ~]# curl 127.0.0.1:9200/_cat/indices

green  open .kibana        r6Vr3NxEQSC_jJizl3dNXg 1 0  2 0 10.2kb 10.2kb

yellow open elk-2018.08.22 7Oou4ODYSD27QYsZgxMOig 5 1 10 0 25.2kb 25.2kb

[root@es-kibana ~]# 


以易讀方式查詢es中健康狀態

[root@es-kibana ~]# curl 127.0.0.1:9200/_cat/health

1534912178 12:29:38 my-es yellow 1 1 6 6 0 0 5 0 - 54.5%

[root@es-kibana ~]# 


kafka配置正確性驗證命令


命令行方式生產kafka消息

/opt/kafka/bin/kafka-console-producer.sh --broker-list 192.168.10.102:9092 --topic elk


命令行方式消費kafka中的消息

/opt/kafka_2.12-2.0.0/bin/kafka-console-consumer.sh --bootstrap-server 192.168.10.102:9092 \

--topic elk --from-beginning


總體ELK系統搭建過程並不複雜,但前提條件是你在打算使用這套系統時得首先理解清楚ELK系統的工做原理,

不然根本無從下手,或是你參照本文把demo搭建出來了,但調試過程可能都調不通。

相關文章
相關標籤/搜索