ELK架构概览

1. ELK架构简介

1.1 核心组成

  • ELK是一套开源免费且功能强大的日志分析管理系统,由Elasticsearch、Logstash、Kibana三部分组成,简称ELK。
  • ELK可以将系统日志、网站日志、应用系统日志等各种日志进行收集、过滤、清洗,然后进行集中存放并可用于检索、分析。
  • 这三款软件都是开源软件,通常是配合使用,且归于Elastic.co公司名下,所以被简称为ELK Stack。

1.2 Elasticsearch简介

  • Elasticsearch是一个实时的分布式搜索和分析引擎,可用于全文搜索,结构化搜索以及分析,采用Java语言编写。

1)主要特点

  • 实时搜索,实时分析
  • 分布式架构、实时文件存储,并将每一个字段都编入索引
  • 文档导向,所有的对象全部是文档
  • 高可用性,易扩展,支持集群(Cluster)、分片和复制(Shared、Replicas)
  • 接口友好,支持JSON

2)典型的集群架构图

1.3 Logstash简介

Logstash是一款轻量级的、开源的日志收集处理框架,它可以方便的把分散的、多样化的日志收集起来,并进行自定义过滤分析处理,然后传输到指定的位置(某服务器或者文件)。Logstash采用JRuby语言编写。

1)Logstash的特点

  • input:数据搜集
  • filter:数据加工,如过滤、改写等
  • output:数据输出

2)Logstash的内部运行逻辑图

  • Shipper:主要用来搜集日志数据,负责监控本地日志文件的变化,及时把日志文件的最新内容收集起来,然后经过加工、过滤,输入到Broker
  • Broker:相当于日志Hub,用来连接多个Shipper和多个Indexer
  • Indexer:从Broker读取文本,经过加工、过滤,输入到指定的介质中(可以是文件、网络、Elasticsearch等)

Redis服务器是logstash官方推荐的broker,这个broker起数据缓存的作用,通过这个缓存器可以提高Logstash Shipper发送日志到Logstash indexer的速度,同时避免了由于突然断电导致的数据丢失。可以实现broker功能的软件还有许多,如kafka等。

在实际应用中LogStash自身并没有什么角色,只是根据不同的功能、不同的配置给出不同的称呼而已,无论是Shipper还是Indexer,始终只做前面说的三件事。

1.4 Kibana简介

Kibana是一个开源的数据分析可视化平台。

使用Kibana可以为Logstash和Elasticsearch提供的日志数据进行高效搜索、可视化总和多维度分析,还可以与Elasticsearch搜索引擎中的数据进行交互。

它基于浏览器的界面操作可以快速创建动态仪表板,实时监控Elasticsearch的数据状态与更新。

1.5 ELK的工作流程

1)工作流程

  1. 一般都是在需要搜索日志的所有服务器上部署Logstash,作为Logstash shipper用于监控并收集、过滤日志,
  2. 接着将过滤后的日志发送给Broker,
  3. 然后Logstash Indexer将存放在Broker中的数据再写入Elasticsearch,Elasticsearch对这些数据创建索引,
  4. 最后由Kibana对其进行各种分析并以图表的形式展示。

 2)工作图示

有些时候,如果搜集的日志量较大,为了保证日志搜集的性能和数据的完整性,Logstash shipper和logstash indexer之间的缓冲器(Broker)也经常用kafka来实现。

2. ZooKeeper基础入门

2.1 ZooKeeper简介

1)分布式协调技术

分布式协调技术主要是用来解决分布式环境当中多个进程之间的同步控制,让它们有序的去访问某种共享资源,防止造成资源竞争(脑裂)。

2)分布式系统

分布式系统就是在不同地域分布的多个服务器,共同组成一个应用系统来提供服务。

在分布式系统中最重要的是进程的调度,需要一个协调器,来让它们有序的来访问这个资源;这个协调器就是分布式系统中的“锁”。分布式环境下的锁叫做分布式锁;分布式锁就是分布式协调技术实现的核心内容。

某个进程在使用资源时,会先去获得这把锁,该进程获得锁以后会对资源保持独占,此时其它进程就无法访问该资源。这个进程用完该资源后会将该锁释放掉,以便让其他教程来获得锁。这样就可以保证分布式系统中多个进程能够有序的访问该共享资源。

3)ZooKeeper

ZooKeeper就是一种为分布式应用所设计的高可用、高性能的开源协调服务。

它提供了一套分布式锁服务,同时也提供了数据的维护和管理机制,如:同一命名服务、状态同步服务、集群管理、分布式消息队列、分布式应用配置项的管理等。

2.2 ZooKeeper的应用

1)单点故障

在分布式锁服务中,最典型的应用场景就是通过对集群进行Master角色的选举,来解决分布式系统中单点故障问题。

单点故障就是在一个主从的的分布式系统中,主节点负责任务调度,从节点负责任务的处理,而当主节点发生故障时,整个应用系统也就瘫痪了,这种故障件求称之为单点故障

2)传统方式解决单点故障

采用一个备用节点定期向主节点发送ping包,主节点收到ping包以后向备用节点发送回复Ack信息,当备节点收到回复的时候就会任务当前主节点运行正常,让它继续提供服务;当主节点故障时,没用节点就无法收到回复信息了,此时,备用节点就认为主节点宕机,然后接替它成为新的主节点继续提供服务。

3)传统方式解决单点故障的缺陷

当主节点并没有出现故障,只是在向从节点回复Ack响应的时候网络发生了故障,这样备用节点就无法收到回复,那么他就会认为主节点出现了故障, 然后备用节点将会接管主节点的服务并成为新的主节点。此时,分布式系统中就出现了两个主节点(双Master节点)的情况(脑裂),双Master节点的出现,会导致分布式系统的服务发生混乱。这样这个分布式系统将不可用。

为了解决传统方式决绝单点故障的缺陷,就引入了ZooKeeper来解决这种问题。

2.3 ZooKeeper的工作原理

1)Master启动

分布式系统中引入ZooKeeper之后,就可以配置多个主节点,以配置两个节点为例,Master A和Master B都启动后,它们都会向ZooKeeper中注册节点信息。

假设Master A锁注册的节点信息是master00001,Master B注册的节点信息是master00002,注册完成之后会进行选举,选举有多种算法。以编号最小作为选举算法为例,编号最小的节点将在选举中获胜并获得锁成为主节点,也就是Master A将会获得锁并成为主节点,然后Master B将被阻塞成为一个备用节点。那么通过这种方式ZooKeeper就完成了对两个Master进程的调度,完成了主、备节点的分配和协作。

2)Master故障

如果Master A发生了故障,这时它在ZooKeeper所注册的节点信息会被自动删除,而ZooKeeper会自动感知节点的变化,发现Master A故障后,会再次发出选举,这时Master B将在选举中获胜,替代Master A成为新的主节点,这样就完成了主、被节点的重新选举。

3)Master恢复

如果主节点恢复了,它会再次向ZooKeeper注册自身的节点信息,但是这时它注册的节点信息将会变成master00003,而不是原来的信息。ZooKeeper会感知节点的变化再次发动选举,这时Master B会在选举中再次获胜继续担任主节点,Master A会担任备用节点。

ZooKeeper就是通过这样的协调、调度机制如此反复的对集群进行管理和状态同步的。

2.4 ZooKeeper集群架构

1)ZooKeeper集群图示

ZooKeeper一般是通过集群架构来提供服务的

2)ZooKeeper的角色

ZooKeeper集群主要角色有Server和Client,其中Server又分为Leader、Follower、Observer三个角色

  • Leader:领导者角色,主要负责投票的发起和决议,以及更新系统状态
  • Follower:跟随者角色,用于接收客户端的请求并返回结果给客户端,在选举过程中参与投票
  • Observer:观察者角色,用户接收客户端的请求,并将写请求转发给Leader,同时同步Leader状态,但不参与投票;Observer的目的是扩展系统,提高伸缩性。
  • Client:客户端角色,用于向ZooKeeper发起请求。

3)ZooKeeper数据存储机制

ZooKeeper集群中每个Server在内存中存储了一份数据,在ZooKeeper启动时,将从实例中选举一个Server作为Leader,Leader负责处理数据更新等操作,当大多数Server在内存中成功修改数据,才认为数据修改成功。

4)ZooKeeper写的流程

客户端Client首先和一个Server或者Observer通信,发起写请求,然后Server将写请求转发给Leader,Leader再将写请求转发给其他Server,其他Server在接收到写请求后写入数据并响应Leader,Leader在接收到大多数写成功回应后,认为数据写成功,最后响应Client,完成一次写操作过程。

3. Kafka基础入门

3.1 kafka基本概念

Kafka是一种高吞吐量的分布式发布/订阅消息系统

kafka是Apache旗下的一个开源系统,它可以实时处理大量数据以满足各种需求场景:如基于hadoop平台的数据分析、低时延的实时系统、storm/spark流式处理引擎等。

3.2 kafka角色术语

Broker:Kafka集群包含一个或多个服务器,每个服务器被称为broker。

Topic:每条发布到Kafka集群的消息都有一个分类,这个类别被称为Topic(主题)。

Producer:指消息的生产者,负责发布消息到Kafka broker。

Consumer:指消息的消费者,从Kafka broker拉取数据,并消费这些已发布的消息。

Partition:Partition是物理上的概念,每个Topic包含一个或多个Partition,每个partition都是一个有序的队列;partition中的每条消息都会被分配一个有序的id(称为offset)。

Consumer Group:消费者组,可以给每个Consumer指定消费者组,若不指定消费者组,则属于默认的group。

Message:消息,通信的基本单位,每个producer可以向一个topic发布一些消息。

3.3 kafka拓扑架构

典型的Kafka集群包含若干Producer,若干broker,若干Consumer Group,以及一个Zookeeper集群。

Kafka通过ZooKeeper管理集群配置,选举leader,以及在Consumer Group发生变化时进行rebalance。

Produce使用push模式将消息发布到broker,Consumer使用pull模式从broker订阅并消费消息。

3.4 Topic与Partition

Kafka中的topic是以partition的形式存放的,每个topic都可以设置它的partition数量

Partition的数量决定了组成topic的log的数量,推荐partition的数量大于同时运行的consumer的数量,这样消息数据就可以均匀的分布在各个broker中。

Topic设置多个Partition的缘由:

应该kafka是基于文件存储的,通过配置多个partition可以将消息内容分散存储到多个broker上,这样可以避免文件尺寸达到单机磁盘的上限。

同时,将topic切分成任意多个partitions,可以保证消息存储、消息消费的效率,因为越多的partitions可以容纳更多的consumer,可以有效的提升kafka的吞吐率。

所以,将Topic切分成多个partitions的好处是可以将大量的消息分成多批数据同时写到不同节点上,将写请求负担负载到各个集群节点。

3.5 kafka消息发送机制

每当用户往某个Topic发送数据时,数据会被hash到不同的partition,这些partition位于不同的集群节点,所以每个消息都会被记录一个offset消息号,就是offset号。消费者通过offset号去查询读取这个消息。

发送消息的流程:

首先获取topic的所有partition,如果客户端不指定Partition,也没有指定Key的话,使用自增长的数字取余数的方式实现指定的Partition。这样Kafka将平均的向Partition中生产数据。

如果想要控制发送的partition,有两种方式:1. 指定partition,2.根据Key自己写算法,实现其partition方法。

每一条消息被发送到broker时,会根据partition规则选择被存储到哪一个partition。如果partition规则设置的合理,所有消息可以均匀分布到不同的partition里,这样就实现了水平扩展。同时,每条消息被append到partition中时,是顺序写入磁盘的,因此效率非常高。

顺序写磁盘效率比随机写内存要更高,这是Kafka高吞吐量的一个很重要的保证。

3.6 kafka消息消费机制

Kafka中的Producer和consumer采用的是push(推送)、pull(拉取)的模式,即Producer只是向broker push消息,consumer只是从broker pull消息,push和pull对于消息的生产和消费是异步进行的。

pull模式的一个好处是Consumer可自主控制消费消息的速率,同时Consumer还可以自己控制消费消息的方式是批量的从broker拉取数据还是逐条消费数据。

当生产者将数据发布到topic时,消费者通过pull的方式,定期从服务器拉取数据,当然在pull数据的时候,服务器会告诉Consumer可消费的消息offset。

消费规则:

  •  不同Consumer Group下的消费者可以消费partition中相同的消息,相同的Consumer Group下的消费者只能消费partition中不同的数据
  • topic的partition的个数和同一消费组的消费者的个数最好一直,如果消费者个数多余partition个数,则会存在有的消费者消费不到数据
  • 服务器会记录每个consumer在每个topic的每个partition下的消费的offset,然后每次去消费拉取数据时,都会从上次记录的位置开始拉取数据

3.7 kafka消息存储机制

segment数据文件有两个部分组成,分别为index file和datafile,这两个文件是一一对应,成对出现,后缀“.index”和“.log”分别表示segment索引文件和数据文件

Kafka最核心的思想是使用磁盘,而不是使用内存,使用磁盘操作有以下几个好处:

  • 磁盘缓存由Linux系统维护,减少了程序员的不少工作
  • 磁盘顺序读写速度超过内存随机读写
  • JVM的GC效率低,内存占用过大,使用磁盘可以避免这一问题
  • 系统冷却启动后,磁盘缓存依然可用

4. filebeat基础入门

4.1 filebeat简介

Filebeat是一个开源的文本日志收集器,它是elastic公司Beats数据采集产品的一个子产品,采用go语言开发,一般安装在业务服务器上作为代理来监测日志目录或特定的日志文件,并把它们发送到logstash、elasticsearch、redis或Kafka等。

Filebeat是一个轻量级的日志监测、传输工具,它最大的特点是性能稳定、配置简单、占用系统资源很少。

4.2 filebeat架构运行原理

1)Filebeat的组件构成

Filebeat主要由两个组件构成:prospector(探测器)和harvester(收集器),这两类组件一起协作完成Filebeat的工作。

其中Harvester负责进行单个文件的内容收集,在运行过程中,每一个Harvester会对一个文件逐行进行内容读取,并且把读写到的内容发送到配置的output中。当Harvester开始进行文件的读取后,将会负责这个文件的打开和关闭操作,因此,在Harvester运行过程中,文件都处于打开状态。如果在搜集过程中,删除了这个文件或者是读文件进行了重命名,Filebeat依然会继续对这个文件进行读取,这时候将会一直占用着文件对应的磁盘空间,直到Harvester关闭。

Prospector负责管理Harvester,它会找到所有需要进行读取的数据源,然后交给Harvester进行内容收集,如果input type配置的是log类型,Prospector将会去配置路径下查找所有能匹配上的文件,然后为每一个文件创建一个Harvester。

2)Filebeat的工作流程

当开启filebeat程序的时候,它会启动一个或多个探测器(prospector)去检测指定的日志目录或文件,对于探测器找出的每一个日志文件,filebeat会启动收集进程(harvester),每一个收集进程读取一个日志文件的内容,然后将这些日志数据发送到后台处理程序(spooler),后台处理程序会集合这些事件,最后发送集合的数据到output指定的目的地。

5. ELK常见应用架构

5.1 简单的ELK架构

此架构主要是将Logstash部署在各个节点上搜集相关日志、数据,并经过分析、过滤后发送给远端服务器上的Elasticsearch进行存储。Elasticsearch再将数据以分片的形式压缩存储,并提供多种API供用户查询、操作。用户可以通过Kibana Web直观的对日志进行查询,并根据需求生成数据报表。

此构架的优点是搭建简单,易于上手。缺点是Logstash消耗系统资源比较大,运行时占用CPU和内存资源较高。另外,由于没有消息队列缓存,可能存在数据丢失的风险。建议数据量较小的环境使用。

5.2 典型ELK架构

 此架构的主要特点是引入了消息队列机制,位于各个节点上的Logstash Agent(一级Logstash,主要用来传输数据)先将数据传递给消息队列(常见的有Kafka、Redis等),接着,Logstash server(二级Logstash,主要用来拉取消息队列数据,过滤并分析数据)将格式化的数据传递给Elasticsearch进行存储,最后,由Kibana将日志和数据呈现给用户。由于引入了Kafka(或者Redis)缓存机制,即使远端Logstash server因故障停止运行,数据也不会丢失,因为数据已经被存储下来了。

这种架构适合较大集群、数据量一般的应用环境,但由于二级Logstash要分析处理大量数据,同时Elasticsearch也要存储和索引大量数据,因此它们的负荷会比较重,解决的方法是将它们配置为集群模式,以分担负载。此架构的优点在于引入了消息队列机制,均衡了网络传输,从而降低了网络闭塞尤其是丢失数据的可能性,但依然存在Logstash占用系统资源过多的问题,在海量数据应用场景下,可能会出现性能瓶颈。

5.3 ELK集群架构

 这个架构是在上面第二个架构基础上改进而来的,主要是将前端收集数据的Logstash Agent换成了filebeat,消息队列使用了Kafka集群,然后将Logstash和Elasticsearch都通过集群模式进行构建,此架构适合大型集群、海量数据的业务场景,它通过将前端Logstash Agent替换成filebeat,有效降低了收集日志对业务系统资源的消耗。同时,消息队列使用Kafka集群架构,有效保障了收集数据的安全性和稳定性,而后端Logstash和Elasticsearch均采用集群模式搭建,从整体上提高了ELK系统的高效性、扩展性和吞吐量。

 

 

 

 

posted @ 2020-09-14 18:26  Praywu  阅读(3089)  评论(1编辑  收藏  举报