本文给你们分享一下,如何搭建一个最为流行的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搭建出来了,但调试过程可能都调不通。