本来从原公司离职以后,应该去约好的公司去面试的。但是家里出了一点急事就回老家了。因此利用在老家的这段时间来整理下之前的公司项目里面用的的知识点和一些经验。原来的项目数据采集部分都是使用flume+kafka等框架。但是最新的潮流是ELK三兄弟来进行数据的采集处理显示。整个配置很长,往下一直看下去,对你还是有帮助的。
使用Filebeat来代替flume,因为Filebeat消耗的资源更少,能力更强,操作起来更简单。
整体的架构如上图所示
此架构稍微有些复杂,因此,这里做一下架构解读。 这个架构图从左到右,总共分为5层,每层实现的功能和含义分别介绍如下:
第一层、数据采集层 数据采集层位于最左边的业务服务器集群上,在每个业务服务器上面安装了filebeat做日志收集,然后把采集到的原始日志发送到Kafka+zookeeper集群上。
第二层、消息队列层 原始日志发送到Kafka+zookeeper集群上后,会进行集中存储,此时,filbeat是消息的生产者,存储的消息可以随时被消费。
第三层、数据分析层 Logstash作为消费者,会去Kafka+zookeeper集群节点实时拉取原始日志,然后将获取到的原始日志根据规则进行分析、清洗、过滤,最后将清洗好的日志转发至Elasticsearch集群。
第四层、数据持久化存储 Elasticsearch集群在接收到logstash发送过来的数据后,执行写磁盘,建索引库等操作,最后将结构化的数据存储到Elasticsearch集群上。
第五层、数据查询、展示层 Kibana是一个可视化的数据展示平台,当有数据检索请求时,它从Elasticsearch集群上读取数据,然后进行可视化出图和多维度分析。
1、服务器环境与角色 操作系统统一采用Centos7.5版本,各个服务器角色如下表所示:
IP地址 | 主机名 | 角色 | 所属集群 |
172.16.213.157 | filebeatserver | 业务服务器+filebeat | 业务服务器集群 |
172.16.213.51 | kafkazk1 | Kafka+ ZooKeeper | Kafka Broker集群 |
172.16.213.75 | kafkazk2 | Kafka+ ZooKeeper | |
172.16.213.109 | kafkazk3 | Kafka+ ZooKeeper | |
172.16.213.120 | logstashserver | Logstash | 数据转发 |
172.16.213.37 | server1 | ES Master、ES NataNode | Elasticsearch集群 |
172.16.213.77 | server2 | ES Master、Kibana | |
172.16.213.78 | server3 | ES Master、ES NataNode |
下表详细说明了本节安装软件对应的名称和版本号,其中,ELK三款软件推荐选择一样的版本,这里选择的是6.3.2版本。
软件名称 | 版本 | 说明 |
JDK | JDK 1.8.0_151 | Java环境解析器 |
filebeat | filebeat-6.3.2-linux-x86_64 | 前端日志收集器 |
Logstash | logstash-6.3.2 | 日志收集、过滤、转发 |
zookeeper | zookeeper-3.4.11 | 资源调度、协作 |
Kafka | kafka_2.10-0.10.0.1 | 消息通信中间件 |
elasticsearch | elasticsearch-6.3.2 | 日志存储 |
kibana | kibana-6.3.2-linux-x86_64 | 日志展示、分析 |
安装JDK以及设置环境变量
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文件中。添加如下内容到/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 然后执行如下命令让设置生效: [root@localhost ~]# source /etc/profile
安装并配置elasticsearch集群
1、elasticsearch集群的架构与角色 在ElasticSearch的架构中,有三类角色,分别是Client Node、Data Node和Master Node,搜索查询的请求一般是经过Client Node来向Data Node获取数据,而索引查询首先请求Master Node节点,然后Master Node将请求分配到多个Data Node节点完成一次索引查询。
elasticsearch集群的架构与角色 集群中每个角色的含义介绍如下: 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分担了部分压力
安装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
安装并配置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 最后,还需要修改/etc/security/limits.d/20-nproc.conf文件(centos7.x系统),将: * soft nproc 4096 修改为: * soft nproc 20480 或者直接删除/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 node.master: true node.data: true path.data: /data1/elasticsearch,/data2/elasticsearch path.logs: /usr/local/elasticsearch/logs bootstrap.memory_lock: true network.host: 0.0.0.0 http.port: 9200 discovery.zen.minimum_master_nodes: 1 discovery.zen.ping.unicast.hosts: ["172.16.213.37:9300","172.16.213.78:9300"]
5、配置elasticsearch (1)cluster.name: elkbigdata 配置elasticsearch集群名称,默认是elasticsearch。这里修改为elkbigdata,elasticsearch会自动发现在同一网段下的集群名为elkbigdata的主机。 (2)node.name: server1 节点名,任意指定一个即可,这里是server1,我们这个集群环境中有三个节点,分别是server1、server2和server3,记得根据主机的不同,要修改相应的节点名称。 (3)node.master: true 指定该节点是否有资格被选举成为master,默认是true,elasticsearch集群中默认第一台启动的机器为master角色,如果这台服务器宕机就会重新选举新的master。 (4)node.data: true 指定该节点是否存储索引数据,默认为true,表示数据存储节点,如果节点配置node.master:false并且node.data: false,则该节点就是client node。这个client node类似于一个“路由器”,负责将集群层面的请求转发到主节点,将数据相关的请求转发到数据节点。
5、配置elasticsearch (5)path.data:/data1/elasticsearch,/data2/elasticsearch 设置索引数据的存储路径,默认是elasticsearch根目录下的data文件夹,这里自定义了两个路径,可以设置多个存储路径,用逗号隔开。 (6)path.logs: /usr/local/elasticsearch/logs 设置日志文件的存储路径,默认是elasticsearch根目录下的logs文件夹 (7)bootstrap.memory_lock: true 此配置项一般设置为true用来锁住物理内存。 linux下可以通过“ulimit -l” 命令查看最大锁定内存地址空间(memlock)是不是unlimited
5、配置elasticsearch (8)network.host: 0.0.0.0 此配置项用来设置elasticsearch提供服务的IP地址,默认值为0.0.0.0,此参数是在elasticsearch新版本中增加的,此值设置为服务器的内网IP地址即可。 (9)http.port: 9200 设置elasticsearch对外提供服务的http端口,默认为9200。其实,还有一个端口配置选项transport.tcp.port,此配置项用来设置节点间交互通信的TCP端口,默认是9300。 (10)discovery.zen.minimum_master_nodes: 1 配置当前集群中最少的master节点数,默认为1,也就是说,elasticsearch集群中master节点数不能低于此值,如果低于此值,elasticsearch集群将停止运行。在三个以上节点的集群环境中,建议配置大一点的值,推荐2至4个为好。 (11)discovery.zen.ping.unicast.hosts: ["172.16.213.37:9300","172.16.213.78:9300"] 设置集群中master节点的初始列表,可以通过这些节点来自动发现新加入集群的节点。这里需要注意,master节点初始列表中对应的端口是9300。即为集群交互通信端口。
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
6.5、安装并配置ZooKeeper集群 对于集群模式下的ZooKeeper部署,官方建议至少要三台服务器,关于服务器的数量,推荐是奇数个(3、5、7、9等等),以实现ZooKeeper集群的高可用,这里使用三台服务器进行部署 1、下载与安装zookeeper ZooKeeper是用Java编写的,需要安装Java运行环境,可以从zookeeper官网https://zookeeper.apache.org/获取zookeeper安装包,这里安装的版本是zookeeper-3.4.11.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
6.5、安装并配置ZooKeeper集群 3、启动zookeeper集群 在三个节点依次执行如下命令,启动Zookeeper服务: [root@localhost ~]# cd /usr/local/zookeeper/bin [root@localhost bin]# ./zkServer.sh start [root@localhost kafka]# jps 23097 QuorumPeerMain Zookeeper启动后,通过jps命令(jdk内置命令)可以看到有一个QuorumPeerMain标识,这个就是Zookeeper启动的进程,前面的数字是Zookeeper进程的PID。 有时候为了启动Zookeeper方面,也可以添加zookeeper环境变量到系统的/etc/profile中,这样,在任意路径都可以执行“zkServer.sh start”命令了,添加环境变量的内容为: export ZOOKEEPER_HOME=/usr/local/zookeeper export PATH=$PATH:$ZOOKEEPER_HOME/bin
6.6、安装并配置Kafka Broker集群 这里将kafka和zookeeper部署在一起了。另外,由于是部署集群模式的kafka,因此下面的操作需要在每个集群节点都执行一遍。 1、下载与安装Kafka 可以从kafka官网https://kafka.apache.org/downloads获取kafka安装包,这里推荐的版本是kafka_2.10-0.10.0.1.tgz,将下载下来的安装包直接解压到一个路径下即可完成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 这里我们将kafka安装到了/usr/local目录下。 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
6.6、安装并配置Kafka Broker集群 每个配置项含义如下: broker.id:每一个broker在集群中的唯一表示,要求是正数。当该服务器的IP地址发生改变时,broker.id没有变化,则不会影响consumers的消息情况。 listeners:设置kafka的监听地址与端口,可以将监听地址设置为主机名或IP地址,这里将监听地址设置为IP地址。 log.dirs:这个参数用于配置kafka保存数据的位置,kafka中所有的消息都会存在这个目录下。可以通过逗号来指定多个路径, kafka会根据最少被使用的原则选择目录分配新的parition。需要注意的是,kafka在分配parition的时候选择的规则不是按照磁盘的空间大小来定的,而是根据分配的 parition的个数多小而定。 num.partitions:这个参数用于设置新创建的topic有多少个分区,可以根据消费者实际情况配置,配置过小会影响消费性能。这里配置6个。 log.retention.hours:这个参数用于配置kafka中消息保存的时间,还支持log.retention.minutes和 log.retention.ms配置项。这三个参数都会控制删除过期数据的时间,推荐使用log.retention.ms。如果多个同时设置,那么会选择最小的那个。 log.segment.bytes:配置partition中每个segment数据文件的大小,默认是1GB,超过这个大小会自动创建一个新的segment file。 zookeeper.connect:这个参数用于指定zookeeper所在的地址,它存储了broker的元信息。 这个值可以通过逗号设置多个值,每个值的格式均为:hostname:port/path,每个部分的含义如下: hostname:表示zookeeper服务器的主机名或者IP地址,这里设置为IP地址。 port: 表示是zookeeper服务器监听连接的端口号。 /path:表示kafka在zookeeper上的根目录。如果不设置,会使用根目录。 auto.create.topics.enable:这个参数用于设置是否自动创建topic,如果请求一个topic时发现还没有创建, kafka会在broker上自动创建一个topic,如果需要严格的控制topic的创建,那么可以设置auto.create.topics.enable为false,禁止自动创建topic。 delete.topic.enable:在0.8.2版本之后,Kafka提供了删除topic的功能,但是默认并不会直接将topic数据物理删除。如果要从物理上删除(即删除topic后,数据文件也会一同删除),就需要设置此配置项为true。
6.6、安装并配置Kafka Broker集群 4、启动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 这里将kafka放到后台运行,启动后,会在启动kafka的当前目录下生成一个nohup.out文件,可通过此文件查看kafka的启动和运行状态。通过jps指令,可以看到有个Kafka标识,这是kafka进程成功启动的标志。
6.6、安装并配置Kafka Broker集群 5、kafka集群基本命令操作 kefka提供了多个命令用于查看、创建、修改、删除topic信息,也可以通过命令测试如何生产消息、消费消息等,这些命令位于kafka安装目录的bin目录下,这里是/usr/local/kafka/bin。登录任意一台kafka集群节点,切换到此目录下,即可进行命令操作。下面列举kafka的一些常用命令的使用方法。 (1)显示topic列表 (2)创建一个topic,并指定topic属性(副本数、分区数等) (3)查看某个topic的状态 (4)生产消息 (5)消费消息 (6)删除topic
6.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 这里我们将filebeat就安装到了/usr/local目录下。
6.7、安装并配置Filebeat 3、配置filebeat filebeat的配置文件目录为/usr/local/filebeat/filebeat.yml,这里仅列出常用的配置项,内容如下: filebeat.inputs: - type: log enabled: true paths: - /var/log/messages - /var/log/secure fields: log_topic: osmessages 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
6.7、安装并配置Filebeat 3、配置filebeat 配置项的含义介绍如下: filebeat.inputs:用于定义数据原型。 type:指定数据的输入类型,这里是log,即日志,是默认值,还可以指定为stdin,即标准输入。 enabled: true:启用手工配置filebeat,而不是采用模块方式配置filebeat。 paths:用于指定要监控的日志文件,可以指定一个完整路径的文件,也可以是一个模糊匹配格式,例如: - /data/nginx/logs/nginx_*.log,该配置表示将获取/data/nginx/logs目录下的所有以.log结尾的文件,注意这里有个破折号“-”,要在paths配置项基础上进行缩进,不然启动filebeat会报错,另外破折号前面不能有tab缩进,建议通过空格方式缩进。 - /var/log/*.log,该配置表示将获取/var/log目录的所有子目录中以”.log”结尾的文件,而不会去查找/var/log目录下以”.log”结尾的文件。 name: 设置filebeat收集的日志中对应主机的名字,如果配置为空,则使用该服务器的主机名。这里设置为IP,便于区分多台主机的日志信息。 output.kafka:filebeat支持多种输出,支持向kafka,logstash,elasticsearch输出数据,这里的设置是将数据输出到kafka。 enabled:表明这个模块是启动的。 host: 指定输出数据到kafka集群上,地址为kafka集群IP加端口号。 topic:指定要发送数据给kafka集群的哪个topic,若指定的topic不存在,则会自动创建此topic。注意topic的写法,在filebeat6.x之前版本是通过“%{[type]}”来自动获取document_type配置项的值。而在filebeat6.x之后版本是通过'%{[fields][log_topic]}'来获取日志分类的。 logging.level:定义filebeat的日志输出级别,有critical、error、warning、info、debug五种级别可选,在调试的时候可选择debug模式。
6.7、安装并配置Filebeat 4、启动filebeat收集日志 所有配置完成之后,就可以启动filebeat,开启收集日志进程了,启动方式如下: [root@filebeatserver ~]# cd /usr/local/filebeat [root@filebeatserver filebeat]# nohup ./filebeat -e -c filebeat.yml & 这样,就把filebeat进程放到后台运行起来了。启动后,在当前目录下会生成一个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任意一个节点上,消费输出日志内容如下:
6.7、安装并配置Filebeat 5、filebeat输出信息格式解读 {"@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"} }
6.7、安装并配置Filebeat 5、filebeat输出信息格式解读 从这个输出可以看到,输出日志被修改成了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中的输出日志,已经不再输出这四个字段信息了。
6.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 这里我们将logstash安装到了/usr/local目录下。 2、Logstash是怎么工作的 Logstash是一个开源的、服务端的数据处理pipeline(管道),它可以接收多个源的数据、然后对它们进行转换、最终将它们发送到指定类型的目的地。Logstash是通过插件机制实现各种功能的,可以在https://github.com/logstash-plugins 下载各种功能的插件,也可以自行编写插件。 Logstash实现的功能主要分为接收数据、解析过滤并转换数据、输出数据三个部分,对应的插件依次是input插件、filter插件、output插件,其中,filter插件是可选的,其它两个是必须插件。也就是说在一个完整的Logstash配置文件中,必须有input插件和output插件。
6.8、安装并配置Logstash服务 3、常用的input input插件主要用于接收数据,Logstash支持接收多种数据源,常用的有如下几种: file: 读取一个文件,这个读取功能有点类似于linux下面的tail命令,一行一行的实时读取。 syslog: 监听系统514端口的syslog messages,并使用RFC3164格式进行解析。 redis: Logstash可以从redis服务器读取数据,此时redis类似于一个消息缓存组件。 kafka:Logstash也可以从kafka集群中读取数据,kafka加Logstash的架构一般用在数据量较大的业务场景,kafka可用作数据的缓冲和存储。 filebeat:filebeat是一个文本日志收集器,性能稳定,并且占用系统资源很少,Logstash可以接收filebeat发送过来的数据。 4、常用的filter filter插件主要用于数据的过滤、解析和格式化,也就是将非结构化的数据解析成结构化的、可查询的标准化数据。常见的filter插件有如下几个: grok:grok是Logstash最重要的插件,可解析并结构化任意数据,支持正则表达式,并提供了很多内置的规则和模板可供使用。此插件使用最多,但也最复杂。 mutate: 此插件提供了丰富的基础类型数据处理能力。包括类型转换,字符串处理和字段处理等。 date:此插件可以用来转换你的日志记录中的时间字符串。 GeoIP:此插件可以根据IP地址提供对应的地域信息,包括国别,省市,经纬度等,对于可视化地图和区域统计非常有用。
6.8、安装并配置Logstash服务 5、常用的output output插件用于数据的输出,一个Logstash事件可以穿过多个output,直到所有的output处理完毕,这个事件才算结束。输出插件常见的有如下几种: elasticsearch: 发送数据到elasticsearch。 file:发送数据到文件中。 redis:发送数据到redis中,从这里可以看出,redis插件既可以用在input插件中,也可以用在output插件中。 kafka:发送数据到kafka中,与redis插件类似,此插件也可以用在Logstash的输入和输出插件中。
6.8、安装并配置Logstash服务 6、Logstash配置文件入门 这里将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}}' 首先解释下这条命令的含义: -e代表执行的意思。 input即输入的意思,input里面即是输入的方式,这里选择了stdin,就是标准输入(从终端输入)。 output即输出的意思,output里面是输出的方式,这里选择了stdout,就是标准输出(输出到终端)。 这里的codec是个插件,表明格式。这里放在stdout中,表示输出的格式,rubydebug是专门用来做测试的格式,一般用来在终端输出JSON格式。
6.8、安装并配置Logstash服务 6、Logstash配置文件入门 在终端输入信息。这里我们输入"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就会直接报错。另外,也不能删除这个字段。
6.8、安装并配置Logstash服务 6、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进程的启动状态。
6.8、安装并配置Logstash服务 7、logstash事件文件配置实例 下面再看另一个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 &
6.8、安装并配置Logstash服务 7、logstash事件文件配置实例 接着开始进行输入、输出测试,这里设定/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." }
6.8、安装并配置Logstash服务 7、logstash事件文件配置实例 接着把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。
6.8、安装并配置Logstash服务 8、配置logstash作为转发节点 上面对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}" } }
6.9、安装并配置Kibana展示日志数据 1、下载与安装Kibana kibana使用JavaScript语言编写,安装部署十分简单,即下即用,可以从elastic官网https://www.elastic.co/cn/downloads/kibana 下载所需的版本,这里需要注意的是Kibana与Elasticsearch的版本必须一致,另外,在安装Kibana时,要确保Elasticsearch、Logstash和kafka已经安装完毕。 这里安装的版本是kibana-6.3.2-linux-x86_64.tar.gz。将下载下来的安装包直接解压到一个路径下即可完成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
6.9、安装并配置Kibana展示日志数据 2、配置Kibana 由于将Kibana安装到了/usr/local目录下,因此,Kibana的配置文件为/usr/local/kibana/kibana.yml,Kibana配置非常简单,这里仅列出常用的配置项,内容如下: server.port: 5601 server.host: "172.16.213.77" elasticsearch.url: "http://172.16.213.37:9200" kibana.index: ".kibana" 其中,每个配置项的含义介绍如下: server.port:kibana绑定的监听端口,默认是5601。 server.host:kibana绑定的IP地址,如果内网访问,设置为内网地址即可。 elasticsearch.url:kibana访问ElasticSearch的地址,如果是ElasticSearch集群,添加任一集群节点IP即可,官方推荐是设置为ElasticSearch集群中client node角色的节点IP。 kibana.index:用于存储kibana数据信息的索引,这个可以在kibanaweb界面中看到。
6.9、安装并配置Kibana展示日志数据 3、启动Kibana服务与web配置 所有配置完成后,就可以启动kibana了,启动kibana服务的命令在/usr/local/kibana/bin目录下,执行如下命令启动kibana服务: [root@kafkazk2 ~]# cd /usr/local/kibana/ [root@kafkazk2 kibana]# nohup bin/kibana & [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 这样,kibana对应的node服务就启动起来了。
6.10、调试并验证日志数据流向 经过上面的配置过程,大数据日志分析平台已经基本构建完成,由于整个配置架构比较复杂,这里来梳理下各个功能模块的数据和业务流向。