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搭建出来了,但调试过程可能都调不通。

相关文章
相关标签/搜索