【ELK】部署-企业级应用架构

1.应用架构

在这里插入图片描述
5层架构:

  • 数据采集层:filebeat做日志收集
  • 消息队列层:Kafka+zookeeper集群
  • 数据分析层:Logstash获取到的原始日志根据规则进行分析、清洗、过滤
  • 数据持久化存储: Elasticsearch集群在接收到logstash发送过来的数据后,执行写磁盘,建索引库等操作,最后将结构化的数据存储到Elasticsearch集群上。
  • 数据查询、展示层:Kibana是一个可视化的数据展示平台,当有数据检索请求时,它从Elasticsearch集群上读取数据,然后进行可视化出图和多维度分析。

2.环境与角色说明

(1).服务器环境与角色

操作系统统一采用Centos7.5版本,各个服务器角色如下表所示
在这里插入图片描述

(2).软件环境与版本

下表详细说明了本节安装软件对应的名称和版本号,其中,ELK三款软件推荐选择一样的版本。

软件名称版本说明
filebeatfilebeat-8.4.3-linux-x86_64前端日志收集
logstashlogstash-8.4.3-linux-x86_64日志收集、过滤、转发
zookeeperapache-zookeeper-3.8.0-bin资源调度、协作
kafkakafka_2.13-3.3.1消息通信中间件
elasticsearchelasticsearch-8.4.3日志存储
kibanakibana-8.4.3-linux-x86_64日志展示、分析

3.安装JDK以及设置环境变量

(1).手动安装
1).选择合适版本并下载JDK
Zookeeper 、elasticsearch和Logstash都依赖于Java环境,并且elasticsearch和Logstash要求JDK版本至少在JDK1.7或者以上,因此,在安装zookeeper、Elasticsearch和Logstash的机器上,必须要安装JDK,一般推荐使用最新版本的JDK,这里我们使用JDK1.8版本,可以选择使用Oracle JDK1.8 或者Open JDK1.8。这里我们使用Oracle JDK1.8。

从oracle官网下载linux-64版本的JDK,下载时,选择适合自己机器运行环境的版本,oracle官网提供的JDK都是二进制版本的,因此,JDK的安装非常简单,只需将下载下来的程序包解压到相应的目录即可。安装过程如下:

[root@localhost ~]# mkdir /usr/java
[root@localhost ~]# tar -zxvf jdk-8u152-linux-x64.tar.gz -C /usr/java/
2).设置JDK的环境变量

要让程序能够识别JDK路径,需要设置环境变量,这里我们将JDK环境变量设置到/etc/profile文件中。

1.添加如下内容到/etc/profile文件最后:
	export JAVA_HOME=/usr/java/jdk1.8.0_152
	export PATH=$PATH:$JAVA_HOME/bin
	exportCLASSPATH=.:$JAVA_HOME/lib/tools.jar:$JAVA_HOME/lib/dt.jar:$CLASSPATH
2.然后执行如下命令让设置生效:
	[root@localhost ~]# source /etc/profile
(2).yum安装
yum -y install java-1.8.0-openjdk java-1.8.0-openjdk-devel

4.安装并配置elasticsearch集群

(1).elasticsearch集群的架构与角色

在ElasticSearch的架构中,有三类角色,分别是Client Node、Data Node和Master Node,搜索查询的请求一般是经过Client Node来向Data Node获取数据,而索引查询首先请求Master Node节点,然后Master Node将请求分配到多个Data Node节点完成一次索引查询。
在这里插入图片描述
集群中每个角色的含义介绍如下:
master node:
可以理解为主节点,主要用于元数据(metadata)的处理,比如索引的新增、删除、分片分配等,以及管理集群各个节点的状态。elasticsearch集群中可以定义多个主节点,但是,在同一时刻,只有一个主节点起作用,其它定义的主节点,是作为主节点的候选节点存在。当一个主节点故障后,集群会从候选主节点中选举出新的主节点。

data node:
数据节点,这些节点上保存了数据分片。它负责数据相关操作,比如分片的CRUD、搜索和整合等操作。数据节点上面执行的操作都比较消耗 CPU、内存和I/O资源,因此数据节点服务器要选择较好的硬件配置,才能获取高效的存储和分析性能。

client node:
客户端节点,属于可选节点,是作为任务分发用的,它里面也会存元数据,但是它不会对元数据做任何修改。client node存在的好处是可以分担data node的一部分压力,因为elasticsearch的查询是两层汇聚的结果,第一层是在data node上做查询结果汇聚,然后把结果发给client node,client node接收到data node发来的结果后再做第二次的汇聚,然后把最终的查询结果返回给用户。这样,client node就替data node分担了部分压力

(2).安装elasticsearch与授权

elasticsearch的安装非常简单,首先从官网https://www.elastic.co/下载页面找到适合的版本,可选择zip、tar、rpm等格式的安装包下载,这里我们下载的软件包为elasticsearch-6.3.2.tar.gz。安装过程如下:

[root@localhost ~]# tar -zxvf elasticsearch-6.3.2.tar.gz -C /usr/local
[root@localhost ~]# mv /usr/local/elasticsearch-6.3.2  /usr/local/elasticsearch

这里我们将elasticsearch安装到了/usr/local目录下。

由于elasticSearch可以接收用户输入的脚本并且执行,为了系统安全考虑,需要创建一个单独的用户用来运行elasticSearch,这里创建的普通用户是elasticsearch,操作如下:

[root@localhost ~]# useradd elasticsearch

然后将elasticsearch的安装目录都授权给elasticsearch用户,操作如下:

[root@localhost ~]# chown -R elasticsearch:elasticsearch /usr/local/elasticsearch
(3).操作系统调优

操作系统以及JVM调优主要是针对安装elasticsearch的机器。对于操作系统,需要调整几个内核参数,将下面内容添加到/etc/sysctl.conf文件中:
fs.file-max=655360
vm.max_map_count = 262144
fs.file-max主要是配置系统最大打开文件描述符数,建议修改为655360或者更高,vm.max_map_count影响Java线程数量,用于限制一个进程可以拥有的VMA(虚拟内存区域)的大小,系统默认是65530,建议修改成262144或者更高。
另外,还需要调整进程最大打开文件描述符(nofile)、最大用户进程数(nproc)和最大锁定内存地址空间(memlock),添加如下内容到/etc/security/limits.conf文件中:

*        soft    nproc           20480
*        hard    nproc           20480
*        soft    nofile          65536
*        hard    nofile          65536
*        soft    memlock         unlimited
*        hard    memlock         unlimited

退出当前用户即可刷新,执行 ulimit -a 查看

最后,还需要修改/etc/security/limits.d/20-nproc.conf文件(centos7.x系统),将:

*          soft    nproc     4096
修改为:
*          soft    nproc     20480
改完后执行如下指令刷新:sysctl -p

或者直接删除/etc/security/limits.d/20-nproc.conf文件也行。
(4).JVM调优

JVM调优主要是针对elasticsearch的JVM内存资源进行优化,elasticsearch的内存资源配置文件为jvm.options,此文件位于/usr/local/elasticsearch/config目录下,打开此文件,修改如下内容:

-Xms2g
-Xmx2g

可以看到,默认JVM内存为2g,可根据服务器内存大小,修改为合适的值。一般设置为服务器物理内存的一半最佳。

(5).配置elasticsearch

elasticsearch的配置文件均在elasticsearch根目录下的config文件夹,这里是/usr/local/elasticsearch/config目录,主要有jvm.options、elasticsearch.yml和log4j2.properties三个主要配置文件。这里重点介绍elasticsearch.yml一些重要的配置项及其含义。这里配置的elasticsearch.yml文件内容如下:

cluster.name: elkbigdata
node.name: server1
path.data: /usr/local/elasticsearch/data
path.logs: /usr/local/elasticsearch/logs
bootstrap.memory_lock: false
network.host: 3.3.3.3
http.port: 9200
discovery.seed_hosts: ["1.1.1.1:9300", "2.2.2.2:9300","3.3.3.3:9300"]
discovery.request_peers_timeout: 30s
cluster.initial_master_nodes: ["server1", "server2","server3"]
xpack.security.enabled: false

(1)cluster.name: elkbigdata
配置elasticsearch集群名称,默认是elasticsearch。这里修改为elkbigdata,elasticsearch会自动发现在同一网段下的集群名为elkbigdata的主机。
(2)node.name: server1
节点名,任意指定一个即可,这里是server1,我们这个集群环境中有三个节点,分别是server1、server2和server3,记得根据主机的不同,要修改相应的节点名称。
(3)path.data:/data1/elasticsearch,/data2/elasticsearch
设置索引数据的存储路径,默认是elasticsearch根目录下的data文件夹,这里自定义了两个路径,可以设置多个存储路径,用逗号隔开。
(4)path.logs: /usr/local/elasticsearch/logs
设置日志文件的存储路径,默认是elasticsearch根目录下的logs文件夹
(5)bootstrap.memory_lock: true
此配置项一般设置为true用来锁住物理内存。 linux下可以通过“ulimit -l” 命令查看最大锁定内存地址空间(memlock)是不是unlimited
(6)network.host: 0.0.0.0
此配置项用来设置elasticsearch提供服务的IP地址,默认值为0.0.0.0,此参数是在elasticsearch新版本中增加的,此值设置为服务器的内网IP地址即可。
(7)http.port: 9200
设置elasticsearch对外提供服务的http端口,默认为9200。其实,还有一个端口配置选项transport.tcp.port,此配置项用来设置节点间交互通信的TCP端口,默认是9300。
(8)discovery.seed_hosts
集群节点
(9)discovery.request_peers_timeout
集群健康检查超时时间
(10).cluster.initial_master_nodes
初始化主节点
(11).xpack.security.enabled
安全检查

(6).启动elasticsearch

启动elasticsearch服务需要在一个普通用户下完成,如果通过root用户启动elasticsearch的话,可能会收到如下错误:
java.lang.RuntimeException: can not run elasticsearch as root
这是出于系统安全考虑,elasticsearch服务必须通过普通用户来启动,这里直接切换到elasticsearch用户下启动elasticsearch集群即可。分别登录到server1、server2和server3三台主机上,执行如下操作:

[root@localhost ~]# su - elasticsearch
[elasticsearch@localhost ~]$ cd /usr/local/elasticsearch/
[elasticsearch@localhost elasticsearch]$ bin/elasticsearch -d
其中,“-d”参数的意思是将elasticsearch放到后台运行。	
(7).验证elasticsearch集群的正确性

将所有elasticsearch节点的服务启动后,在任意一个节点执行如下命令:
[root@localhost ~]# curl http://172.16.213.77:9200
在这里插入图片描述

(8).elasticsearch常用指令
1.查看索引
http://10.110.116.28:9200/_cat/indices?v

2.查看索引信息
http://127.0.0.1:9200/indexName(索引名)?pretty

3.查询索引内信息
GET _search
{
  "query": {
    "match_all": {}
  }
}
//指定索引
GET {index}/_search
{
  "query": {
    "match_all": {}
  }
}

5.安装并配置ZooKeeper集群

对于集群模式下的ZooKeeper部署,官方建议至少要三台服务器,关于服务器的数量,推荐是奇数个(3、5、7、9等等),以实现ZooKeeper集群的高可用,这里使用三台服务器进行部署

(1).下载与安装zookeeper

ZooKeeper是用Java编写的,需要安装Java运行环境,可以从zookeeper官网https://zookeeper.apache.org/releases.html获取zookeeper安装包,注意使用-bin.tar.gz的包。将下载下来的安装包直接解压到一个路径下即可完成zookeeper的安装

[root@localhost ~]# tar -zxvf zookeeper-3.4.11.tar.gz -C /usr/local
[root@localhost ~]# mv /usr/local/zookeeper-3.4.11  /usr/local/zookeeper
(2).配置zookeeper

zookeeper安装到了/usr/local目录下,因此,zookeeper的配置模板文件为/usr/local/zookeeper/conf/zoo_sample.cfg,拷贝zoo_sample.cfg并重命名为zoo.cfg,重点配置如下内容:

tickTime=2000
initLimit=10
syncLimit=5
dataDir=/data/zookeeper
clientPort=2181
server.1=172.16.213.51:2888:3888
server.2=172.16.213.109:2888:3888
server.3=172.16.213.75:2888:3888

每个配置项含义如下:
(1).tickTime:zookeeper使用的基本时间度量单位,以毫秒为单位,它用来控制心跳和超时。2000表示2 tickTime。更低的tickTime值可以更快地发现超时问题。
(2).initLimit:这个配置项是用来配置Zookeeper集群中Follower服务器初始化连接到Leader时,最长能忍受多少个心跳时间间隔数(也就是tickTime)
(3).syncLimit:这个配置项标识Leader与Follower之间发送消息,请求和应答时间长度最长不能超过多少个tickTime的时间长度
(4).dataDir:必须配置项,用于配置存储快照文件的目录。需要事先创建好这个目录,如果没有配置dataLogDir,那么事务日志也会存储在此目录。
(5).clientPort:zookeeper服务进程监听的TCP端口,默认情况下,服务端会监听2181端口。
(6).server.A=B:C:D:其中A是一个数字,表示这是第几个服务器;B是这个服务器的IP地址;C表示的是这个服务器与集群中的Leader服务器通信的端口;D 表示如果集群中的Leader服务器宕机了,需要一个端口来重新进行选举,选出一个新的 Leader,而这个端口就是用来执行选举时服务器相互通信的端口。

除了修改zoo.cfg配置文件外,集群模式下还要配置一个文件myid(需要手动创建),这个文件需要放在dataDir配置项指定的目录下,这个文件里面只有一个数字,如果要写入1,表示第一个服务器,与zoo.cfg文本中的server.1中的1对应,以此类推,在集群的第二个服务器zoo.cfg配置文件中dataDir配置项指定的目录下创建myid文件,写入2,这个2与zoo.cfg文本中的server.2中的2对应。Zookeeper在启动时会读取这个文件,得到里面的数据与zoo.cfg里面的配置信息比较,从而判断每个zookeeper server的对应关系。

为了保证zookeeper集群配置的规范性,建议将zookeeper集群中每台服务器的安装和配置文件路径都保存一致。

(3).启动zookeeper集群

在三个节点依次执行如下命令,启动Zookeeper服务:

[root@localhost ~]# cd /usr/local/zookeeper/bin
[root@localhost bin]# ./zkServer.sh  start
	在/usr/local/zookeeper/bin会生成zookeeper.out日志文件
[root@localhost kafka]# jps
	23097 QuorumPeerMain

zookeeper其他指令

#启动命令:
zkServer.sh start
#停止命令:
zkServer.sh stop
#重启命令:
zkServer.sh restart
#查看集群节点状态:
zkServer.sh status

有时候为了启动Zookeeper方面,也可以添加zookeeper环境变量到系统的/etc/profile中,这样,在任意路径都可以执行“zkServer.sh start”命令了,添加环境变量的内容为:

export ZOOKEEPER_HOME=/usr/local/zookeeper
export PATH=$PATH:$ZOOKEEPER_HOME/bin

6.安装并配置Kafka Broker集群

这里将kafka和zookeeper部署在一起了。另外,由于是部署集群模式的kafka,因此下面的操作需要在每个集群节点都执行一遍。

(1).下载与安装Kafka

可以从kafka官网https://kafka.apache.org/downloads获取kafka安装包,安装包版本filebeat有限制需要注意,将下载下来的安装包直接解压到一个路径下即可完成kafka的安装,这里统一将kafka安装到/usr/local目录下,基本操作过程如下:

[root@localhost ~]# tar -zxvf kafka_2.10-0.10.0.1.tgz -C /usr/local
[root@localhost ~]# mv /usr/local/kafka_2.10-0.10.0.1  /usr/local/kafka
(2).配置kafka集群

这里将kafka安装到/usr/local目录下,因此,kafka的主配置文件为/usr/local/kafka/config/server.properties,这里以节点kafkazk1为例,重点介绍一些常用配置项的含义:

broker.id=1
listeners=PLAINTEXT://172.16.213.51:9092
log.dirs=/usr/local/kafka/logs
num.partitions=6
log.retention.hours=60
log.segment.bytes=1073741824
zookeeper.connect=172.16.213.51:2181,172.16.213.75:2181,172.16.213.109:2181
auto.create.topics.enable=true
delete.topic.enable=true

每个配置项含义如下:
(1).broker.id:每一个broker在集群中的唯一表示,要求是正数。当该服务器的IP地址发生改变时,broker.id没有变化,则不会影响consumers的消息情况。
(2).listeners:设置kafka的监听地址与端口,可以将监听地址设置为主机名或IP地址,这里将监听地址设置为IP地址。
(3).log.dirs:这个参数用于配置kafka保存数据的位置,kafka中所有的消息都会存在这个目录下。可以通过逗号来指定多个路径, kafka会根据最少被使用的原则选择目录分配新的parition。需要注意的是,kafka在分配parition的时候选择的规则不是按照磁盘的空间大小来定的,而是根据分配的 parition的个数多小而定。
(4).num.partitions:这个参数用于设置新创建的topic有多少个分区,可以根据消费者实际情况配置,配置过小会影响消费性能。这里配置6个。
(5).log.retention.hours:这个参数用于配置kafka中消息保存的时间,还支持log.retention.minutes和 log.retention.ms配置项。这三个参数都会控制删除过期数据的时间,推荐使用log.retention.ms。如果多个同时设置,那么会选择最小的那个。
(6).log.segment.bytes:配置partition中每个segment数据文件的大小,默认是1GB,超过这个大小会自动创建一个新的segment file。
(7).zookeeper.connect:这个参数用于指定zookeeper所在的地址,它存储了broker的元信息。 这个值可以通过逗号设置多个值,每个值的格式均为:hostname:port/path,每个部分的含义如下:
 hostname:表示zookeeper服务器的主机名或者IP地址,这里设置为IP地址。
 port: 表示是zookeeper服务器监听连接的端口号。
 /path:表示kafka在zookeeper上的根目录。如果不设置,会使用根目录。
(8).auto.create.topics.enable:这个参数用于设置是否自动创建topic,如果请求一个topic时发现还没有创建, kafka会在broker上自动创建一个topic,如果需要严格的控制topic的创建,那么可以设置auto.create.topics.enable为false,禁止自动创建topic。
(9).delete.topic.enable:在0.8.2版本之后,Kafka提供了删除topic的功能,但是默认并不会直接将topic数据物理删除。如果要从物理上删除(即删除topic后,数据文件也会一同删除),就需要设置此配置项为true。

(3).启动kafka集群

在启动kafka集群前,需要确保ZooKeeper集群已经正常启动。接着,依次在kafka各个节点上执行如下命令即可:

[root@localhost ~]# cd /usr/local/kafka
[root@localhost kafka]# nohup bin/kafka-server-start.sh config/server.properties &
[root@localhost kafka]# jps
21840 Kafka
15593 Jps
15789 QuorumPeerMain
(4).kafka集群基本命令操作

kafka提供了多个命令用于查看、创建、修改、删除topic信息,也可以通过命令测试如何生产消息、消费消息等,这些命令位于kafka安装目录的bin目录下,这里是/usr/local/kafka/bin。登录任意一台kafka集群节点,切换到此目录下,即可进行命令操作。下面列举kafka的一些常用命令的使用方法。

(1)显示topic列表
	sh  bin/kafka-topics.sh --list --bootstrap-server kafkahost:9092
(2)创建一个topic,并指定topic属性(副本数、分区数等)
	sh bin/kafka-topics.sh --bootstrap-server kafkahost:9092 --create --topic talking --partitions 1
(3).监控topic输入
	sh bin/kafka-console-consumer.sh --bootstrap-server ...:9092 --topic talking --from-beginning

7.安装并配置Filebeat

(1).为什么要使用filebeat

Logstash功能虽然强大,但是它依赖java、在数据量大的时候,Logstash进程会消耗过多的系统资源,这将严重影响业务系统的性能,而filebeat就是一个完美的替代者,filebeat是Beat成员之一,基于Go语言,没有任何依赖,配置文件简单,格式明了,同时,filebeat比logstash更加轻量级,所以占用系统资源极少,非常适合安装在生产机器上。

(2).下载与安装filebeat

由于filebeat基于go语言开发,无其他任何依赖,因而安装非常简单,可以从elastic官网https://www.elastic.co/downloads/beats/filebeat 获取filebeat安装包,这里下载的版本是filebeat-6.3.2-linux-x86_64.tar.gz。将下载下来的安装包直接解压到一个路径下即可完成filebeat的安装。根据前面的规划,将filebeat安装到filebeatserver主机(172.16.213.157)上,这里设定将filebeat安装到/usr/local目录下,基本操作过程如下:

[root@filebeatserver ~]# tar -zxvf filebeat-6.3.2-linux-x86_64.tar.gz -C /usr/local
[root@filebeatserver ~]# mv /usr/local/filebeat-6.3.2-linux-x86_64  /usr/local/filebeat
(3).配置filebeat

filebeat的配置文件目录为/usr/local/filebeat/filebeat.yml,这里仅列出常用的配置项,内容如下:

//注意默认打开的是es的output,将es的屏蔽后,末尾加上kafka output
//若kafka收集不到日志信息,需手动创建topic
filebeat.inputs:
- type: log
  enabled: true
  paths:
   - /var/log/messages
   - /var/log/secure
  fields:
    log_topic: osmessages/topic
name: "172.16.213.157"
output.kafka:
  enabled: true
  hosts: ["172.16.213.51:9092", "172.16.213.75:9092", "172.16.213.109:9092"]
  version: "0.10"
  topic: '%{[fields][log_topic]}'
  partition.round_robin:
    reachable_only: true
  worker: 2
  required_acks: 1
  compression: gzip
  max_message_bytes: 10000000
logging.level: debug

配置项的含义介绍如下:
(1).filebeat.inputs:用于定义数据原型。
(2).type:指定数据的输入类型,这里是log,即日志,是默认值,还可以指定为stdin,即标准输入。
(3).enabled: true:启用手工配置filebeat,而不是采用模块方式配置filebeat。
(4).paths:用于指定要监控的日志文件,可以指定一个完整路径的文件,也可以是一个模糊匹配格式,例如:

 -  /data/nginx/logs/nginx_*.log,该配置表示将获取/data/nginx/logs目录下的所有以.log结尾的文件,注意这里有个破折号“-”,要在paths配置项基础上进行缩进,不然启动filebeat会报错,另外破折号前面不能有tab缩进,建议通过空格方式缩进。
 -  /var/log/*.log,该配置表示将获取/var/log目录的所有子目录中以”.log”结尾的文件,而不会去查找/var/log目录下以”.log”结尾的文件。

(5).name: 设置filebeat收集的日志中对应主机的名字,如果配置为空,则使用该服务器的主机名。这里设置为IP,便于区分多台主机的日志信息。
(6).output.kafka:filebeat支持多种输出,支持向kafka,logstash,elasticsearch输出数据,这里的设置是将数据输出到kafka。
(7).enabled:表明这个模块是启动的。
(8).host: 指定输出数据到kafka集群上,地址为kafka集群IP加端口号。
(9).topic:指定要发送数据给kafka集群的哪个topic,若指定的topic不存在,则会自动创建此topic。注意topic的写法,在filebeat6.x之前版本是通过“%{[type]}”来自动获取document_type配置项的值。而在filebeat6.x之后版本是通过’%{[fields][log_topic]}'来获取日志分类的。
(10).logging.level:定义filebeat的日志输出级别,有critical、error、warning、info、debug五种级别可选,在调试的时候可选择debug模式。

(4).启动filebeat收集日志

所有配置完成之后,就可以启动filebeat,开启收集日志进程了,启动方式如下:

[root@filebeatserver ~]# cd /usr/local/filebeat
[root@filebeatserver filebeat]# nohup  ./filebeat -e -c filebeat.yml &

启动后,在当前目录下会生成一个nohup.out文件,可以查看filebeat启动日志和运行状态。

(5).filebeat输出信息格式解读

这里以操作系统中/var/log/secure文件的日志格式为例,选取一个SSH登录系统失败的日志,内容如下:
Jan 31 17:41:56 localhost sshd[13053]: Failed password for root from 172.16.213.37 port 49560 ssh2
filebeat接收到/var/log/secure日志后,会将上面日志发送到kafka集群,在kafka任意一个节点上,消费输出日志内容如下:

{"@timestamp":"2018-08-16T11:27:48.755Z",
"@metadata":{"beat":"filebeat","type":"doc","version":"6.3.2","topic":"osmessages"},
"beat":{"name":"filebeatserver","hostname":"filebeatserver","version":"6.3.2"},
"host":{"name":"filebeatserver"},
"source":"/var/log/secure",
"offset":11326,
"message":"Jan 31 17:41:56 localhost sshd[13053]: Failed password for root from 172.16.213.37 port 49560 ssh2",
"prospector":{"type":"log"},
"input":{"type":"log"},
"fields":{"log_topic":"osmessages"}
}

从这个输出可以看到,输出日志被修改成了JSON格式,日志总共分为10个字段,分别是"@timestamp"、“@metadata”、“beat”、“host”、“source”、“offset”、“message”、“prospector”、"input"和"fields"字段,每个字段含义如下:

	@timestamp:时间字段,表示读取到该行内容的时间。
	@metadata:元数据字段,此字段只有是跟Logstash进行交互使用。
	beat:beat属性信息,包含beat所在的主机名、beat版本等信息。
	host: 主机名字段,输出主机名,如果没主机名,输出主机对应的IP。
	source: 表示监控的日志文件的全路径。
	offset: 表示该行日志的偏移量。
	message: 表示真正的日志内容。
	prospector:filebeat对应的消息类型。
	input:日志输入的类型,可以有多种输入类型,例如Log、Stdin、redis、Docker、TCP/UDP等
	fields:topic对应的消息字段或自定义增加的字段。

通过filebeat接收到的内容,默认增加了不少字段,但是有些字段对数据分析来说没有太大用处,所以有时候需要删除这些没用的字段,在filebeat配置文件中添加如下配置,即可删除不需要的字段:

processors:
- drop_fields:
   fields: ["beat", "input", "source", "offset"]

这个设置表示删除"beat"、“input”、“source”、“offset” 四个字段,其中, @timestamp 和@metadata字段是不能删除的。做完这个设置后,再次查看kafka中的输出日志,已经不再输出这四个字段信息了。

8.安装并配置Logstash服务

(1).下载与安装Logstash

可以从elastic官网https://www.elastic.co/downloads/logstash 获取logstash安装包,这里下载的版本是logstash-6.3.2.tar.gz。将下载下来的安装包直接解压到一个路径下即可完成logstash的安装。根据前面的规划,将logstash安装到logstashserver主机(172.16.213.120)上,这里统一将logstash安装到/usr/local目录下,基本操作过程如下:

[root@logstashserver ~]# tar -zxvf logstash-6.3.2.tar.gz -C /usr/local
[root@logstashserver ~]# mv /usr/local/logstash-6.3.2.tar.gz  /usr/local/logstash
(2).Logstash是怎么工作的

Logstash是一个开源的、服务端的数据处理pipeline(管道),它可以接收多个源的数据、然后对它们进行转换、最终将它们发送到指定类型的目的地。Logstash是通过插件机制实现各种功能的,可以在https://github.com/logstash-plugins 下载各种功能的插件,也可以自行编写插件。

Logstash实现的功能主要分为接收数据、解析过滤并转换数据、输出数据三个部分,对应的插件依次是input插件、filter插件、output插件,其中,filter插件是可选的,其它两个是必须插件。也就是说在一个完整的Logstash配置文件中,必须有input插件和output插件。

(3).常用的input插件

input插件主要用于接收数据,Logstash支持接收多种数据源,常用的有如下几种:
(1).file: 读取一个文件,这个读取功能有点类似于linux下面的tail命令,一行一行的实时读取。
(2).syslog: 监听系统514端口的syslog messages,并使用RFC3164格式进行解析。
(3).redis: Logstash可以从redis服务器读取数据,此时redis类似于一个消息缓存组件。
(4).kafka:Logstash也可以从kafka集群中读取数据,kafka加Logstash的架构一般用在数据量较大的业务场景,kafka可用作数据的缓冲和存储。
(5).filebeat:filebeat是一个文本日志收集器,性能稳定,并且占用系统资源很少,Logstash可以接收filebeat发送过来的数据。

(4).常用的filter插件

filter插件主要用于数据的过滤、解析和格式化,也就是将非结构化的数据解析成结构化的、可查询的标准化数据。常见的filter插件有如下几个:
(1).grok:grok是Logstash最重要的插件,可解析并结构化任意数据,支持正则表达式,并提供了很多内置的规则和模板可供使用。此插件使用最多,但也最复杂。
(2).mutate: 此插件提供了丰富的基础类型数据处理能力。包括类型转换,字符串处理和字段处理等。
(3).date:此插件可以用来转换你的日志记录中的时间字符串。
(4).GeoIP:此插件可以根据IP地址提供对应的地域信息,包括国别,省市,经纬度等,对于可视化地图和区域统计非常有用。

(5).常用的output插件

output插件用于数据的输出,一个Logstash事件可以穿过多个output,直到所有的output处理完毕,这个事件才算结束。输出插件常见的有如下几种:
(1).elasticsearch: 发送数据到elasticsearch。
(2).file:发送数据到文件中。
(3).redis:发送数据到redis中,从这里可以看出,redis插件既可以用在input插件中,也可以用在output插件中。
(4).kafka:发送数据到kafka中,与redis插件类似,此插件也可以用在Logstash的输入和输出插件中。

(6).Logstash配置文件入门
1).配置例1-标准输入输出

这里将kafka安装到/usr/local目录下,因此,kafka的配置文件目录为/usr/local/logstash/config/,其中,jvm.options是设置JVM内存资源的配置文件,logstash.yml是logstash全局属性配置文件,另外还需要自己创建一个logstash事件配置文件,这里介绍下logstash事件配置文件的编写方法和使用方式。
在介绍Logstash配置之前,先来认识一下logstash是如何实现输入和输出的。Logstash提供了一个shell脚本/usr/local/logstash/bin/logstash,可以方便快速的启动一个logstash进程,在Linux命令行下,运行如下命令启动Logstash进程:

[root@logstashserver ~]# cd /usr/local/logstash/
[root@logstashserver logstash]# bin/logstash -e 'input{stdin{}} output{stdout{codec=>rubydebug}}'

首先解释下这条命令的含义:
(1).-e代表执行的意思。
(2).input即输入的意思,input里面即是输入的方式,这里选择了stdin,就是标准输入(从终端输入)。
(3).output即输出的意思,output里面是输出的方式,这里选择了stdout,就是标准输出(输出到终端)。
(4).这里的codec是个插件,表明格式。这里放在stdout中,表示输出的格式,rubydebug是专门用来做测试的格式,一般用来在终端输出JSON格式。

在终端输入信息。这里我们输入"Hello World",按回车,马上就会有返回结果,内容如下:
{
“@version” => “1”,
“host” => “logstashserver”,
“@timestamp” => 2018-01-26T10:01:45.665Z,
“message” => “Hello World”
}

这就是logstash的输出格式。Logstash在输出内容中会给事件添加一些额外信息。比如"@version"、“host”、“@timestamp” 都是新增的字段, 而最重要的是@timestamp ,用来标记事件的发生时间。由于这个字段涉及到Logstash内部流转,如果给一个字符串字段重命名为@timestamp的话,Logstash就会直接报错。另外,也不能删除这个字段。

在logstash的输出中,常见的字段还有type,表示事件的唯一类型、tags,表示事件的某方面属性,我们可以随意给事件添加字段或者从事件里删除字段。
使用-e参数在命令行中指定配置是很常用的方式,但是如果logstash需要配置更多规则的话,就必须把配置固化到文件里,这就是logstash事件配置文件,如果把上面在命令行执行的logstash命令,写到一个配置文件logstash-simple.conf中,就变成如下内容:
input { stdin { }
}
output {
stdout { codec => rubydebug }
}
这就是最简单的Logstash事件配置文件。此时,可以使用logstash的-f参数来读取配置文件,然后启动logstash进程,操作如下:

[root@logstashserver logstash]# bin/logstash -f logstash-simple.conf

通过这种方式也可以启动logstash进程,不过这种方式启动的进程是在前台运行的,要放到后台运行,可通过nohup命令实现,操作如下:

[root@logstashserver logstash]# nohup bin/logstash -f logstash-simple.conf &

这样,logstash进程就放到了后台运行了,在当前目录会生成一个nohup.out文件,可通过此文件查看logstash进程的启动状态。

2).配置例2-输入文件输出Kafka

下面再看另一个logstash事件配置文件,内容如下:
input {
file {
path => “/var/log/messages”
}
}
output {
stdout {
codec => rubydebug
}
}

如果需要监控多个文件,可以通过逗号分隔即可,例如:
path => [“/var/log/*.log”,“/var/log/message”,“/var/log/secure”]
对于output插件,这里仍然采用rubydebug的JSON输出格式,这对于调试logstash输出信息是否正常非常有用。
将上面的配置文件内容保存为logstash_in_stdout.conf,然后启动一个logstash进程,执行如下命令:

[root@logstashserver logstash]# nohup bin/logstash -f logstash_in_stdout.conf &

接着开始进行输入、输出测试,这里设定/var/log/messages的输入内容为如下信息(其实就是执行“systemctl stop nginx”命令后/var/log/messages的输出内容):
Aug 19 16:09:12 logstashserver systemd: Stopping The nginx HTTP and reverse proxy server…
Aug 19 16:09:12 logstashserver systemd: Stopped The nginx HTTP and reverse proxy server.
然后查看logstash的输出信息,可以看到内容如下:
{
“@version” => “1”,
“host” => " logstashserver",
“path” => “/var/log/messages”,
“@timestamp” => 2018-08-19T08:09:12.701Z,
“message” => “Aug 19 16:09:12 logstashserver systemd: Stopping The nginx HTTP and reverse proxy server…"
}
{
“@version” => “1”,
“host” => " logstashserver",
“path” => “/var/log/messages”,
“@timestamp” => 2018-08-19T08:09:12.701Z,
“message” => “Aug 19 16:09:12 logstashserver systemd: Stopped The nginx HTTP and reverse proxy server."
}

接着把logstash_in_stdout.conf文件稍加修改,变成另外一个事件配置文件logstash_in_kafka.conf,内容如下:
input {
file {
path => “/var/log/messages”
}
}
output {
kafka {
bootstrap_servers => “172.16.213.51:9092,172.16.213.75:9092,172.16.213.109:9092”
topic_id => “osmessages”
}
}
这个配置文件中,输入input仍然是file,重点看输出插件,这里定义了output的输出源为kafka,通过bootstrap_servers选项指定了kafka集群的IP地址和端口。特别注意这里IP地址的写法,每个IP地址之间通过逗号分隔。另外,output输出中的topic_id选项,是指定输出到kafka中的哪个topic下,这里是osmessages,如果无此topic,会自动重建topic。

(7).配置logstash作为转发节点–输入Kafka输出ES

上面对logstash的使用做了一个基础的介绍,现在回到本节介绍的这个案例中,在这个部署架构中,logstash是作为一个二级转发节点使用的,也就是它将kafka作为数据接收源,然后将数据发送到elasticsearch集群中,按照这个需求,新建logstash事件配置文件kafka_os_into_es.conf,内容如下:
input {
kafka {
bootstrap_servers => “172.16.213.51:9092,172.16.213.75:9092,172.16.213.109:9092”
topics => [“osmessages”]
}
}
output {
elasticsearch {
hosts => [“172.16.213.37:9200”,“172.16.213.77:9200”,“172.16.213.78:9200”]
index => " osmessageslog-%{+YYYY-MM-dd}"
}
}

9.安装并配置Kibana展示日志数据

(1).下载与安装Kibana

kibana使用JavaScript语言编写,安装部署十分简单,即下即用,可以从elastic官网https://www.elastic.co/cn/downloads/kibana 下载所需的版本,这里需要注意的是Kibana与Elasticsearch的版本必须一致,另外,在安装Kibana时,要确保Elasticsearch、Logstash和kafka已经安装完毕。

将下载下来的安装包直接解压到一个路径下即可完成kibana的安装,根据前面的规划,将kibana安装到server2主机(172.16.213.77)上,然后统一将kibana安装到/usr/local目录下,基本操作过程如下:

[root@localhost ~]# tar -zxvf kibana-6.3.2-linux-x86_64.tar.gz -C /usr/local
[root@localhost ~]# mv /usr/local/kibana-6.3.2-linux-x86_64  /usr/local/kibana
(2).配置Kibana

由于将Kibana安装到了/usr/local目录下,因此,Kibana的配置文件为/usr/local/kibana/config/kibana.yml,Kibana配置非常简单,这里仅列出常用的配置项,内容如下:

server.port: 5601
server.host: "172.16.213.77"
elasticsearch.url: "http://172.16.213.37:9200"
kibana.index: ".kibana"

其中,每个配置项的含义介绍如下:
(1).server.port:kibana绑定的监听端口,默认是5601。
(2).server.host:kibana绑定的IP地址,如果内网访问,设置为内网地址即可。
(3).elasticsearch.url:kibana访问ElasticSearch的地址,如果是ElasticSearch集群,添加任一集群节点IP即可,官方推荐是设置为ElasticSearch集群中client node角色的节点IP。
(4).kibana.index:用于存储kibana数据信息的索引,这个可以在kibanaweb界面中看到。

(3).启动Kibana服务与web配置

所有配置完成后,就可以启动kibana了,启动kibana服务的命令在/usr/local/kibana/bin目录下,执行如下命令启动kibana服务:

[root@kafkazk2 ~]# cd /usr/local/kibana/
[root@kafkazk2 kibana]# nohup bin/kibana --allow-root &
[root@kafkazk2 kibana]# ps -ef|grep node
root      6407     1  0 Jan15 ?        00:59:11 bin/../node/bin/node --no-warnings bin/../src/cli
root      7732 32678  0 15:13 pts/0    00:00:00 grep --color=auto node
(4).kinana页面配置

找到 StaskManagement 菜单, 进入后,在 Index Management 菜单下,即可看到 生成的日志索引
在这里插入图片描述
在 Data Views 菜单下, 创建新的 data view
在这里插入图片描述
输入表达式, springboot-logstash-* , 创建新的data viewer
在这里插入图片描述

然后在 discovery 菜单下, 即可看到日志, 对日志进行过滤查看等操作
在这里插入图片描述

10. 调试并验证日志数据流向

经过上面的配置过程,大数据日志分析平台已经基本构建完成,由于整个配置架构比较复杂,这里来梳理下各个功能模块的数据和业务流向。
在这里插入图片描述

  • 1
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
ELK(Elasticsearch、Logstash、Kibana)是一个开源的日志管理和分析平台,能够帮助企业收集、存储、搜索、分析和可视化各种类型的日志数据。而Kafka是一个高吞吐量的分布式消息队列系统,可以用来收集和传输大规模的日志数据。Reyslog是一个开源的日志收集器,可以帮助企业从各种不同的数据源中收集日志数据。Filebeat是一个轻量级的日志收集工具,可以帮助企业从各种不同的文件中收集日志数据。 以下是ELK+kafka+reyslog+filebeat企业部署的步骤: 1. 安装和配置Elasticsearch、Logstash和Kibana,并确保它们能够正常运行。可以使用docker-compose等工具来简化部署过程。 2. 安装和配置Kafka,并创建一个主题(topic)用于存储日志数据。 3. 安装和配置Reyslog,并将其配置为从各种不同的数据源中收集日志数据,并将其发送到Kafka主题(topic)中。 4. 安装和配置Filebeat,并将其配置为从各种不同的文件中收集日志数据,并将其发送到Kafka主题(topic)中。 5. 在Kibana中创建一个索引(index),并定义一个包含所有必需字段的映射(mapping)。然后,使用Logstash来将从Kafka主题(topic)中接收到的日志数据转换为适合索引(index)的格式,并将其存储在Elasticsearch中。 6. 在Kibana中创建一个仪表板(dashboard),并使用其可视化功能来呈现和分析日志数据。可以使用各种不同的可视化插件来创建自定义可视化效果。 7. 部署整个系统,并定期监控其性能和可用性,以确保其正常运行。 总之,ELK+kafka+reyslog+filebeat企业部署需要进行一系列复杂的配置和设置,需要具备一定的技术知识和实践经验。建议企业可以考虑使用专业的日志管理和分析平台,如Splunk等,以简化部署和管理过程。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值