上一篇介绍了一下Logstash的数据处理过程以及一些基本的配置功能,同时也提到了Logstash作为一个数据采集端,支持对接多种输入数据源,其中就包括Kafka。那么这次的学习不妨研究一下Logstash如何接收Kafka输入的数据,并与日志中的数据进行统一的处理。

首先在Logstash的配置文件中配置Kafka的数据源(因为篇幅原因,Kafka和ZooKeeper的安装部署就不做介绍了):

input {
file {
path => "D:/logstash-7.14.1/test-log/test.log"
start_position => beginning
} kafka {
bootstrap_servers => "localhost:9092"
topics => "test_topic"
}
}

如上方所示,我们在上一篇的配置文件中追加了Kafka的地址以及主题用来订阅与消费,input插件中kafka项的详细信息也如上一篇所说,可以在官网上进行查看,https://www.elastic.co/guide/en/logstash/current/plugins-inputs-kafka.html#plugins-inputs-kafka-topics

接下来需要一个生产者往Kafka推送数据以供Logstash端采集,那么新增一个Kafka的测试工程来实现,代码如下:

String server = "127.0.0.1:9092";
String topic = "test_topic"; Properties props = new Properties();
props.put("bootstrap.servers", server);
props.put("transactional.id", "my-transactional-id"); KafkaCallback callback = new KafkaCallback(); Producer<String, String> producer = new KafkaProducer<>(props, new StringSerializer(), new StringSerializer());
producer.initTransactions();
try {
producer.beginTransaction();
for (int i = 0; i < 5; i++) {
producer.send(new ProducerRecord<String, String>("test_topic", Integer.toString(i), "093124." + (597 + i) + "[0][28412]:[5]FindResponseByPage[fund_account=900010328]"), callback);
}
producer.commitTransaction();
} catch (KafkaException e) {
producer.abortTransaction();
}
producer.close();

回调类KafkaCallback的代码也贴一下,主要就是接收一下应答并打印分配的偏移量以及存储的分区信息:

public class KafkaCallback implements Callback {

    public void onCompletion(RecordMetadata metadata, Exception e) {
if (e != null)
e.printStackTrace(); SimpleDateFormat df = new SimpleDateFormat("HH:mm:ss.SSS");
System.out.println("[" + df.format(new Date()) + "]partition: " + metadata.partition() + ", offset: " + metadata.offset());
}
}

启动Logstash后也把Kafka的生产者小程序给run起来:

看到消息已经成功推送到Kafka,那么再看下Logstash是否成功收到:

从输出日志中可以看到Logstash从Kafka消费成功,并且来自两个数据源的信息统一进行了输出。不过从上方的两张截图来看,Kafka的消息被发送到了不同的分区,因此Logstash消费时出现了乱序。

这时就引入了两个问题:

1. 从Kafka拉取的数据格式和日志中的数据格式不统一怎么办?

2. Kafka仅在分区内保证顺序,Logstash如果对顺序有着严格要求,怎么办?

首先我们来看第一个问题,不同的数据源数据格式不统一其实是个大概率的事情。那么是否可以针对不同的数据源进行不同的grok分析呢?没找到相关的资料能够支持这种区分的配置,只能通过grok的多match规则顺序执行(第一条失败了会执行第二条)来勉强达到要求。不过进一步考虑下来,架构上可以采用多个Logstash分别来进行不同数据源的信息采集,进行一个数据的初步整理后再分发到下游的ElasticSearch。这样部署上更加灵活,在对各个Logstash的节点进行配置时的限制也会更少。

要回答第二个问题,首先需要了解Kafka为什么会有分区的概念。Kafka对同一个topic支持设置多个分区,主要是为了能够将一个topic的数据处理水平扩展到位于多台服务器的broker中以此提升性能。那么如果说需要对接的系统仅仅是从侵入性考虑不愿意让日志采集直接对接日志或者数据库,而是通过Kafka这种消息中间件来进行解耦,那么专门用来进行日志采集的主题可以设置为只有1个分区。

查看官网,发现input-kafka插件有一个配置项叫做consumer_threads,也就是消费者线程数。那么即便是Kafka的对应主题配置了1个分区,还需要将消费者线程数配置为1,否则同一个消费者组内的多个消费者来拉取同一分区内的数据也没有办法做到顺序。不过该配置项默认值就是1,不太容易踩到这个坑。

综上所述,如果对于消费的数据有严格的顺序要求,消息中间件不妨选用RabbiMQ,Logstash本身也提供了对接RabbitMQ的插件。另外,在对接不同数据源时可以采用多Logstash服务进行区分采集的部署方式。

ELK学习之Logstash+Kafka篇的更多相关文章

  1. ELK学习之Logstash篇

    Logstash在ELK这一整套解决方案中作为数据采集终端,支持对接Kafka.数据库(MySQL.Oracle).文件等等. 而在Logstash内部的数据流转,主要经过三个环节:input -&g ...

  2. ELK学习笔记之Logstash详解

    0x00 Logstash概述 官方介绍:Logstash is an open source data collection engine with real-time pipelining cap ...

  3. ELK 性能(1) — Logstash 性能及其替代方案

    ELK 性能(1) - Logstash 性能及其替代方案 介绍 当谈及集中日志到 Elasticsearch 时,首先想到的日志传输(log shipper)就是 Logstash.开发者听说过它, ...

  4. ELK stack elasticsearch/logstash/kibana 关系和介绍

    ELK stack elasticsearch 后续简称ES logstack 简称LS kibana 简称K 日志分析利器 elasticsearch 是索引集群系统 logstash 是日志归集集 ...

  5. kafka学习2:kafka集群安装与配置

    在前一篇:kafka学习1:kafka安装 中,我们安装了单机版的Kafka,而在实际应用中,不可能是单机版的应用,必定是以集群的方式出现.本篇介绍Kafka集群的安装过程: 一.准备工作 1.开通Z ...

  6. Java工程师学习指南(中级篇)

    Java工程师学习指南 中级篇 最近有很多小伙伴来问我,Java小白如何入门,如何安排学习路线,每一步应该怎么走比较好.原本我以为之前的几篇文章已经可以解决大家的问题了,其实不然,因为我写的文章都是站 ...

  7. 从零开始学习jQuery (一) 入门篇

    本系列文章导航 从零开始学习jQuery (一) 入门篇 一.摘要 本系列文章将带您进入jQuery的精彩世界, 其中有很多作者具体的使用经验和解决方案,  即使你会使用jQuery也能在阅读中发现些 ...

  8. RabbitMQ学习总结 第三篇:工作队列Work Queue

    目录 RabbitMQ学习总结 第一篇:理论篇 RabbitMQ学习总结 第二篇:快速入门HelloWorld RabbitMQ学习总结 第三篇:工作队列Work Queue RabbitMQ学习总结 ...

  9. [原]零基础学习视频解码之android篇系列文章

    截止今天,<零基础学习视频解码系列文章>.<零基础学习在Android进行SDL开发系列文章>以及<零基础学习视频解码之android篇>系列文章基本算是告一段落了 ...

随机推荐

  1. Spring Cloud Gateway自定义异常处理Exception Handler

    版本: Spring Cloud 2020.0.3 常见的方法有 实现自己的 DefaultErrorWebExceptionHandler 或 仅实现ErrorAttributes. 方法1: Er ...

  2. Nginx 配置错误导致漏洞

    目录 1.CRLF注入漏洞 2.目录穿越漏洞 参考链接 1.CRLF注入漏洞 CRLF是"回车+换行"(\r\n)的简称,其十六进制编码分别为0x0d和0x0a.先看payload ...

  3. 靶机DC-2 rbash绕过+git提权

    这个靶机和DC-1一样,一共5个flag.全部拿到通关. root@kali:/home/kali# nmap -sP 192.168.1.* 先扫一下靶机的IP地址,拿到靶机的地址为192.168. ...

  4. 双非本科字节跳动Android面试题分享(已拿offer)

    基本情况 本人系非985非211普通本科生一枚,有实习有项目经历但成绩普通,在面试前刷了很多面经.面试题,这里也把自己的分享下,做个回报好了,顺便攒攒人品,一到这种时候人就迷信起来了. 面试是以视频面 ...

  5. TCP拥塞控制详解

    1. 拥塞原因与代价 拥塞的代价 当分组的到达速率接近链路容量时,分组经历巨大的排队时延. 发送方必须执行重传以补偿因为缓存溢出而丢弃的分组. 发送方在遇到大时延时进行的不必要重传会引起路由器利用其链 ...

  6. 微信小程序开发(二)——使用WeUI组件库

    一.前言 因为小程序的api描述都比较简单,并没有wxml及wxss的描述,一定会想小程序有没有一个UI库,类似于前端中的Bootstrap,MD,Semantic UI这样的框架UI库.有的,它就是 ...

  7. noip34

    因为改不动T3而来水博客的屑 昨晚没睡好,大致看了一遍题面后,选择了死亡231,然后就死的很惨. T1 一开始大致看题面的时候,就略了一眼,加上没读全题,啥思路也没有,最后四十分钟滚回来看了看,发现就 ...

  8. Python实现发送邮件(实现单发/群发邮件验证码)

    Python smtplib 教程展示了如何使用 smtplib 模块在 Python 中发送电子邮件. 要发送电子邮件,我们使用 Python 开发服务器,Mailtrap 在线服务和共享的网络托管 ...

  9. SpringBoot返回枚举对象中的指定属性

    枚举 package com.meeno.boot.oa.employee.enums; import com.alibaba.fastjson.annotation.JSONType; import ...

  10. npm常用命令及其node相关工具汇总

    它是一个事件驱动异步I/O单进程的服务端JS环境,基于Google的V8引擎,V8引擎执行Javascript的速度非常快,性能非常好. 浏览器是JS的前端运行环境. Node.js是JS的后端运行环 ...