使用的目的:

从filebeat采集到kafka的数据,在ELK方案中使用的是logstash落到ES

那么在graylog中要实现logstash如下两个重要功能:

1.消息体的解析(包含过滤、剔除、提取,转换)

2.ES的索引映射,ES作为底层的存储,涉及到日至平台性能,因此这个索引映射和存储要把握住

使用的流程:

1.input配置,kafka接入

extractor提取器:

解析json

解析message(不好使)

 

2.indices、stream配置,ES索引映射写入

ES索引的生成,不能细粒度的控制

 

 

3.pipelines配置,删除不符合规则的数据

配置后没有生效

 

 

放弃的原因:

就是因为上面的红色部分

1.对于日志内容的过滤、控制转换

2.对于ES存储的控制、配置

这两个核心关注点把控不到,暂时先不使用graylog

ElasticSearch术语

Lucene的核心术语:

术语

 

词条(Term):

索引里面最小的存储和查询单元,对于英文来说是一个单词,对于中文来说一般指分词后的一个词。
词典(Term Dictionary): 或字典,是词条Term的集合。搜索引擎的通常索引单位是单词,单词词典是由文档集合中出现过的所有单词构成的字符串集合,单词词典内每条索引项记载单词本身的一些信息以及指向“倒排列表”的指针。
倒排表(Post list): 一个文档通常由多个词组成,倒排表记录的是某个词在哪些文档里出现过以及出现的位置。每条记录称为一个倒排项(Posting)。倒排表记录的不单是文档编号,还存储了词频等信息。
倒排文件(Inverted File): 所有单词的倒排列表往往顺序地存储在磁盘的某个文件里,这个文件被称之为倒排文件,倒排文件是存储倒排索引的物理文件。
段(Segment): 索引中最小的独立存储单元。一个索引文件由一个或者多个段组成。在Luence中的段有不变性,段一旦生成,在其上只能有读操作,不能有写操作。

 

在分段的思想下,对数据写操作的过程如下:

操作

 

新增:

当有新的数据需要创建索引时,由于段的不变性,所以会新建一个段来存储新增的数据。
删除: 当有新的数据需要创建索引时,由于段的不变性,所以会新建一个段来存储新增的数据。
更新: 更新的操作其实就是删除和新增操作的组合(delete & insert),先在.del文件中标记旧数据的删除,再在新段中添加一条更新后的数据。

段不可变性的优点:

优点

 

不需要锁:

因为数据不会更新,所以不用考虑多线程下的读写不一致情况。
可以常驻内存: 段在被加载到内存后,由于具有不变性,所以只要内存的空间足够大,就可以长时间驻存,大部分查询请求会直接访问内存,而不需要访问磁盘,使得查询的性能有很大的提升。
缓存友好: 在段的声明周期内始终有效,不需要在每次数据更新时被重建。
增量创建: 分段可以做到增量创建索引,可以轻量级地对数据进行更新,由于每次创建的成本很低,所以可以频繁地更新数据,使系统接近实时更新。

段不可变性的缺点:

缺点

 

删除:

当对数据进行删除时,旧数据不会被马上删除,而是在.del文件中被标记为删除。旧数据只能等到段更新时才能真正地被移除,这样会有大量的空间浪费。
更新: 更新数据由删除和新增这两个动作组成。若有一条数据频繁更新,则会有大量的空间浪费。
新增: 由于索引具有不变性,所以每次新增数据时,都需要新增一个段来存储数据。当段的数量太多时,对服务器的资源(如文件句柄)的消耗会非常大,查询的性能也会受到影响。
过滤: 在查询后需要对已经删除的旧数据进行过滤,这增加了查询的负担。

为了提升写的性能,Lucene并没有每新增一条数据就增加一个段,而是采用延迟写的策略,每当有新增的数据时,就将其先写入内存中,然后批量写入磁盘中。

若有一个段被写到硬盘,就会生成一个提交点,提交点就是一个用来记录所有提交后的段信息的文件。

一个段一旦拥有了提交点,就说明这个段只有读权限,失去了写权限;

相反,当段在内存中时,就只有写数据的权限,而不具备读数据的权限,所以也就不能被查询了。

因此严格意义上来说,Lucene或者Elasticsearch并不能被称为实时的搜索引擎,只能被称为准实时的搜索引擎。

写索引的流程:

流程

 

1.暂驻内存:

新数据被写入时,并没有被直接写到硬盘中,而是被暂时写到内存中。(Lucene默认是一秒钟,或者当内存中数据量达到一定阶段时,再批量提交到磁盘中,默认提交时间和数据量的大小是可以通过参数控制的。通过延时写的策略,可以减少数据往磁盘上写的次数,从而提升整体的写入性能,降低磁盘压力。),此时该内存中的数据不能被检索到。
2.持久化: 在达到触发条件以后,会将内存中缓存的数据一次性写入磁盘中,并生成提交点,此时该段数据可以被检索到。
3.释放内存: 释放内存并等待新的数据写入。

 

通过上面的流程中可以看到,当内存中的数据还没有持久化到磁盘中的时候如果集群出现故障,那么内存中的数据就会丢失无法恢复,因此在Elasticsearch中新增了事务日志用以保证数据安全。

事务日志TransLog

步骤

 

内存缓存且记录日志:

当有数据写入时,为了提升写入的速度,并没有数据直接写在磁盘上,而是先写入到内存中,但是为了防止数据的丢失,会追加一份数据到事务日志里。
Refresh: 当达到默认的时间(1秒钟)或者内存的数据达到一定量时,会触发一次Refresh。将JVM中的数据以段的格式缓存到文件系统缓存(操作系统内存)中。
Flush: 当日志数据的大小超过512MB或者时间超过30分钟时,需要触发一次Flush。将文件系统缓存中的段数据同步至磁盘中。

 

Logo

汇聚全球AI编程工具,助力开发者即刻编程。

更多推荐