kafka 搭建以及 kafka收集log
- 首先搭建kafka和zookeeper,找帖子
搭建时需要注意
其次,保证zookeeper是集群环境,也可以代建伪集群,不然启动不起来报:
partitions have leader brokers without a matching listener。 -
一个生产者的消息如果没有key值,则会随机到每个分区,
搭建时出了个问题,因为kafka配置文件默认partition为1,所以在我本地两个消费者始终有一个消费者消费不到消息,
后面改完配置文件分区设置2个,but 没起作用,依然只有一个消费者能消费到消息
各种查。。。网上也是都在说topic会发送到不同的partition,不同的partition会对应不同的消费者,吴国。。。
后面在生产者新建一个topic_b 然后好了,看来是一个topic在生成时就会有一些操作来对应partition,后面在查阅。 - 卡夫卡是真的快。测试几万条数据/嗖嗖就消费完了/
- kafka充当消息中间件
利用spring boot
pom.xml<dependency> <groupId>org.springframework.kafka</groupId> <artifactId>spring-kafka</artifactId> </dependency>
application.yml
kafka: bootstrap-servers: ip:9093,ip:9094,ip:9095 consumer: group-id: consumer-default auto-commit-interval: 100 auto-offset-reset: earliest enable-auto-commit: true key-deserializer: org.apache.kafka.common.serialization.StringDeserializer value-deserializer: org.apache.kafka.common.serialization.StringDeserializer
如果是单机kafka 则配置一个即可
a.生产者:@Autowired private KafkaTemplate kafkaTemplate; .... kafkaTemplate.send("topic_name","message");
b.消费者:
@Component public class KafkaCustomer { private static int count = 0; @KafkaListener(topics = {"topic_a"}) public void listen (ConsumerRecord<?, ?> record) throws Exception { System.out.printf("topic = %s, offset = %d, value = %s \n", record.topic(), record.offset(), record.value()); } }
期间遇到的问题上述已解释哈/
- kafka 充当日志收集
默认使用logback(springboot自带)
上配置主要配置logback-spring.xml即可,利用springboot搭建的消费者即可看到kafka的收集的日志。
有一个问题哈/为什么用kafka收集呢?是优势,更大的优势可能是可以由不同的消费者,来分析日志。
问题在于原先本人搭建过ELK收集日志,后来网上说logstash太消耗本地内存,后用filebeat来收集,
logstash来解析日志,现在就是filebeat和kafka的区别和优势又有哪些,笔记一下,后续查阅。
<?xml version="1.0" encoding="UTF-8"?> <configuration scan="true" scanPeriod="60 seconds" debug="false"> <contextName>logback</contextName> <logger name="org.apache.kafka" level="OFF"/> <appender name="console" class="ch.qos.logback.core.ConsoleAppender"> <encoder> <pattern>%d{HH:mm:ss.SSS} %contextName [%thread] %-5level %logger{36} - %msg%n</pattern> </encoder> </appender> <appender name="file" class="ch.qos.logback.core.rolling.RollingFileAppender"> <file>D:\log</file> <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy"> <fileNamePattern>logback.%d{yyyy-MM-dd}.log</fileNamePattern> </rollingPolicy> <encoder> <pattern>%d{HH:mm:ss.SSS} %contextName [%thread] %-5level %logger{36} - %msg%n</pattern> </encoder> </appender> <appender name="KafkaAppender" class="com.github.danielwegener.logback.kafka.KafkaAppender"> <encoder> <pattern>%d{HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n</pattern> </encoder> <topic>loges</topic> <keyingStrategy class="com.github.danielwegener.logback.kafka.keying.HostNameKeyingStrategy" /> <deliveryStrategy class="com.github.danielwegener.logback.kafka.delivery.AsynchronousDeliveryStrategy" /> <producerConfig>bootstrap.servers=ip:9093,ip:9094,ip:9095</producerConfig> </appender> <logger name="Application_ERROR"> <appender-ref ref="KafkaAppender"/> </logger> <root level="debug"> <appender-ref ref="console" /> <appender-ref ref="file" /> <appender-ref ref="KafkaAppender" /> </root> </configuration>
期间的问题:问题如下放, 一开始将日志级别设置成info没有问题发生,但当把级别设成debug时,就卡住不动了,
这个问题我认为主要是由于org.apache.kafka这个包底下有用到log.debug()方法,但项目加载到log.xml时log还为起作用,导致log.xml调用log.debug()时报错进而导则timeout。
解决方法,将org.apache.kafka报下的日志关闭,即:<logger name="org.apache.kafka" level="OFF"/>,即可解决下方的错误。22:25:40.199 logback [main] DEBUG o.a.k.clients.producer.KafkaProducer - [Producer clientId=producer-1] Exception occurred during message send: org.apache.kafka.common.errors.TimeoutException: Failed to update metadata after 60000 ms.
- 会继续更新。