一、ELK架构设计
1. 核心组成
ELK是一个应用套件,由Elastic Search、Logstash和Kibana三部分组成,简称ELK;它是一个开源免费、功能强大的日志分析管理系统。ELK可以将系统日志、网站日志、应用系统日志等各种日志进行收集、过滤、清洗,然后进行集中存放并可用于实时检索、分析。
2. Elastic Search介绍
Elastic Search是一个实时的分布式搜索和分析引擎,它可以用于全文检索,结构化搜索以及分析,采用Java语言编写。它的主要特点是
- 实时搜索,实时分析
- 分布式架构、实时文件存储,并将每一个字段都编入索引
- 文档导向,所有的对象全部都是文档
- 高可用性,易扩展,支持集群(Cluster)、分片和复制(Shards和Replicas)
- 接口友好,支持JSON
3. Logstash介绍
Logstash是一款轻量级的、开源的日志收集处理框架,它可以方便的把分散的、多样化的日志搜集起来,并进行自定义过滤分析处理,然后传输到指定的位置,比如某个服务器或者文件。Logstash采用JRuby语言编写。它主要特点如下:
Logstash的理念很简单,从功能上来讲,它只做三件事
- Input:数据采集
- filter:数据加工,如过滤、改写等
- output:数据输出
Logstash内部运行逻辑图
Shipper:主要用来收集日志数据,负责监控本地日志的变化,及时吧日志文件的最新内容收集起来,然后经过加工、过滤、输出到Broker
Broker:相当于日志hub,用于连接多个Shipper和多个Indexer。
Indexer:从Broker读取文本,经过加工、过滤、输出到指定介质(可以是文件、网络、ElasticSearch等)中。
4、Kibana介绍
Kibana是一个开源的数据分析可视化平台。使用kibana可以为Logstash和ElasticSearch提供的日志数据进行高效的搜索、可视化汇总和多维度分析,还可以与ElasticSearch搜索引擎之中的数据进行交互。它基于浏览器界面操作可以快速创建动态仪表盘,实时监控ElasticSearch的数据状态与更改。
5、ELK工作流程
二、Zookeeper基础与入门
Zookeeper是一种为分布式应用所设计的高可用、高性能的开源协调服务,它提供了一项基本服务:分布式锁服务,同时,也提供了数据的维护和管理机制,如:统一命名服务、状态同步服务、集群管理、分布式消息队列、分布式应用配置项的管理等等。
三、 Kafka基础与入门
Kafka是一个高吞吐量的分布式发布/订阅消息系统,Kakfa是Apache组织下的一个开源系统,它的最大特性就是可以实时的处理大量数据以及满足各种场景。
Kafka使用磁盘,而不是使用内存。使用磁盘操作有以下好处:
- 磁盘缓存由Linux系统维护,不需要额外维护成本。
- 磁盘顺序读写速度超过内存随机读写。
- JVM的GC效率低,内存占用大。使用磁盘可以避免这一问题。
- 系统冷启动后,磁盘缓存依然可用。
四、FileBeat基于与入门
FileBeat是一个开源的文本日志收集器,它是elastic公司Beats数据产品的一个子产品,采用go语言开发,一般安装在业务服务器上作为代理来检测日志目录或特定的日志文件,并把它们发送到Logstash、Elastic Search、Redis或Kafka等。
FileBeat的工作流程为:当开启filebeat程序的时候,它会启动一个或多个探测器(prospector)去检测指定的日志目录或文件,对于探测器找到的每一个日志文件,fileBeat会启动收集进程(harvester),每一个收集进程读取一个日志文件的内容,然后将这些日志数据发送到后台处理程序(spooler),后台处理程序会集合这些事件,最后发送集合的数据到output指定的目的地。
五、ELK常见应用架构
- 简单的ELK应用架构
此架构主要是将Logstash部署在各个节点上搜集相关日志、数据,并经过分析、过滤后发送到远端服务器上的ElasticSearch进行存储。Elastic Search再将数据以分片的形式压缩存储,并提供多种API供用户查询、操作。用户可以通过Kibana Web直观的对日志进行查询,并根据需求生成数据报表。
此架构的优点是搭建简单,易于上手。缺点是Logstash消耗系统资源比较大,运行时占用CPU和内存资源较高。此外,由于没有消息队列缓存,可能存在数据丢失的风险。此架构建议供初学者或数据量小的环境使用。
- 典型的ELK架构
此架构主要特点是引入了消息队列机制,位于各个节点上的Logstash Agent(一级Logstas,主要用来传输数据),先将数据传递给消息队列(常见的有Kafka、Redis等)。接着,Logstash Server(二级Logstash,主要用来拉取消息队列数据,过滤并分析数据)将格式化的数据传递给Elastic Search进行存储。最后,有Kibana将日志和数据呈现给用户。由于引入了Kafka(或者Redis)缓存机制,即使远端Logstash Server 因故障停止运行,数据也不会丢失,因为数据已经被存储下来了。
这种架构适用于较大集群,数据量一般的应用环境。但由于二级Logstash要分析处理大量数据,同时,Elastic Search也要存储和索引大量数据,因此他们负载会比较重。解决的方法是将它们配置为集群模式,以分担负载。此架构的优点在于引入了消息队列机制,均衡了网络传输,从而降低了网络闭塞尤其是丢失数据的可能性,但依然存在Logstash占用系统资源过多的问题,在海量数据应用场景下,可能会存在性能瓶颈。
- ELK集群架构
这个架构是在上面第二个架构基础上改进而来的,主要是将前端收集数据的Logstash Agent换成了fileBeat,消息队列使用了Kafka集群,然后将Logstash和Elastic Search都通过集群模式进行构建,此架构适合大型集群、海量数据的业务场景,它通过将前端的Logstash Agent替换成filebeat,有效降低了收集日志对业务系统资源的消耗。同时,消息队列使用提高了ELK系统的高效性、扩展性和吞吐性。
六、 ELK+FileBeat +Kafka + Zookeeper构建大数据日志分析平台
6.1 架构说明
6.2 环境与角色说明
- 服务器环境与角色
操作系统统一采用Cent os 7.5版本,各个服务器角色如下表所示
| IP地址 | 主机名 | 角色 | 所属集群 |
|---|---|---|---|
| Filebeat Server | 业务服务器+filebeat | 业务服务器集群 | |
| Kafka zk1 | Kafka + Zookeeper | Kafka Broker集群 | |
| Kafka zk1 | |||
| Kafka zk1 | |||
| Logstash Server | Logstash | 数据转发 | |
| server1 | ES Master、ES DataNode | ES集群 | |
| server2 | ES Master、Kibana | ||
| server3 | ES Master、ES DataNode |
- 软件环境与版本
下表详细说明了安装软件对应的名称和版本号,其中,ELK三款软件推荐选择一样的版本
| 软件名称 | 版本 | 说明 |
|---|---|---|
| JDK | Java环境解释器 | |
| File Beat | 前端日志收集器 | |
| Logstash | 日志收集、过滤转发 | |
| Zookeeper | 资源调度、协助 | |
| Kafka | 消息通信中间件 | |
| Elastic Search | 日志存储 | |
| Kibana | 日志展示、分析 |
6.3 Kafka 集群基本命令操作
- 显示topic列表
bin/kafka-topics.sh --zookeeper 192.168.21.107:2181,192.168.21.108:2181,192.168.21.109:2181 --list
- 创建一个topic,并指定topic属性(副本数、分区数等)
bin/kafka-topics.sh --create --zookeeper 192.168.21.107:2181,192.168.21.108:2181,192.168.21.109:2181 --replication-factor 1 --partitions 3 --topic mytopic
replication: 副本信息
partitions 数量:与消费者数量有关
- 查看某个topic的属性状态
bin/kafka-topics.sh --describe --zookeeper 192.168.21.107:2181,192.168.21.108:2181,192.168.21.109:2181 --topic mytopic
Topic:mytopic PartitionCount:3 ReplicationFactor:1 Configs:
Topic: mytopic Partition: 0 Leader: 1 Replicas: 1 Isr: 1
Topic: mytopic Partition: 1 Leader: 2 Replicas: 2 Isr: 2
Topic: mytopic Partition: 2 Leader: 0 Replicas: 0 Isr: 0
- 生产消息
bin/kafka-console-producer.sh --broker-list 192.168.21.107:9092,192.168.21.108:9092,192.168.21.109:9092 --topic mytopic
- 消费消息
# 从源端开始消费
bin/kafka-console-consumer.sh --bootstrap-server 192.168.21.107:9092,192.168.21.108:9092,192.168.21.109:9092 --topic mytopic --from-beginning
# 从当前位置开始消费
bin/kafka-console-consumer.sh --bootstrap-server 192.168.21.107:9092,192.168.21.108:9092,192.168.21.109:9092 --topic mytopic
- 删除topic
bin/kafka-topics.sh -zookeeper 192.168.21.107:2181,192.168.21.108:2181,192.168.21.109:2181 --delete --topic mytopic
# 标记删除 如果将delete.topic.enable 设置为true,则从磁盘上删除
Topic mytopic is marked for deletion.
Note: This will have no impact if delete.topic.enable is not set to true.
6.4 安装并配置FileBeat
为什么要使用filebeat
Logstash功能虽然强大,但依赖Java,在数据量大的时候,Logstas进程会消耗过多的系统资源,这将严重影响影响业务系统的性能。而FileBeat就是一个完美的替代者,filebeat是Beat成员之一,基于Go语言,没有任何依赖,配置文件简单,格式明了,同时,filebeat比logstash更加轻量级。所以占用系统资源极少,非常适合安装在生产环境。
FileBeat配置项
filebeat.inputs:
- type: log
enbaled: true
paths:
- /var/log/messages
- /var/log/secure
fields:
log_topic: osmessages
#====================Preocessors=====================
processors:
- drop_fields:
fields: ["beat","host","input","source","offset","prospector"]
#=====================Kafka output==============================
output.kafka:
enabled: true
hosts: ["192.168.21.107:9092","192.168.21.108:9092","192.168.21.109:9092"]
topic: \'%{[fields.log_topic]}\'
partition.round_robin:
reachable_only: true
worker: 2
required_acks: 1
compression: gzip
max_message_bytes: 1000000
logging.level: debug
启动FileBeat命令
# 前台方式启动filebeat
./filebeat -e -c filebeat.yml
# 后台方式启动
nohup ./filebeat -e -c filebeat.yml &
# 注册到系统服务启动
systemctl start filebeat
6.5 配置Logstash
logstash是一个来源的、服务端的数据处理pipeline(管道),它可以接收多个数据源的数据,然后对它们进行转换、最终将它们发送到指定类型的目的地。Logstash是通过插件机制机制实现各种功能的。
Logstash实现的功能主要分为接收数据、解析过滤并转换数据,输出数据三个部分,对应的插件依次是input插件、filter插件、output插件,其中,filter插件是可选的,其他两个是必须插件。也就是说在一个完整的Logstash配置文件中,必须要有input插件和output插件。
bin/logstash -e \'input{stdin{}} output{stdout{codec=>rubydebug}}\'
/usr/share/logstash/bin/logstash -e \'input{stdin{}} output{stdout{codec=>rubydebug}}\'
# logstash监控一个文件变化,并输出到屏幕
input {
file {
path => "/var/log/messages"
}
}
output {
stdout {codec => rubydebug}
}
# logstash 将监控文件内容信息输出到kafka
input {
file {
path => "/var/log/messages"
}
}
output {
kafka {
codec => json
bootstrap_servers => "192.168.21.107:9092,192.168.21.108:9092,192.168.21.109:9092"
topic_id => "osmessages"
}
}
# 接收指定端口发送的数据
input {
beats {
port => 5044
}
}
output {
stdout {
codec => rubydebug
}
}
Filebeat output的输出配置
# 输出到logstash
output.logstash:
hosts: ["127.0.0.1:5044"]
# 查看
cat /etc/logstash/conf.d/logstash-sample.conf
input {
kafka {
bootstrap_servers => "192.168.21.107:9092,192.168.21.108:9092,192.168.21.109:9092"
topics => ["osmessages"]
codec => "json"
}
}
output {
elasticsearch{
hosts => ["192.168.21.107:9200"]
index => "osmessageslog-%{+YYYY-MM-dd}"
}
}