部署Filebeat+Kafka+Logstash+Elasticsearch+Kibana集群详解
参见安装与部署ELK详解
参见安装与部署EFLK详解
参见安装与部署Zookeeper集群详解
1. Kafka
1.1 Kafka概述
1.1.1 为什么需要消息队列(MQ)
MQ(Message Queue)主要原因是由于在高并发环境下,同步请求来不及处理,请求往往会发生阻塞。比如大量的并发请求,访问数据库,导致行锁表锁,最后请求线程会堆积过多,从而触发too many connection错误,引发雪崩效应。
我们使用消息队列,通过异步处理请求,从而缓解系统的压力。消息队列常应用于异步处理,流量削峰,应用解耦,消息通讯等场景。
当前比较常见的MQ中间件有ActiveMQ、RabbitMQ、RocketMQ、Kafka、pulsar等。
1.1.2 使用消息队列的好处
(1)解耦
允许你独立的扩展或修改两边的处理过程,只要确保它们遵守同样的接口约束。
(2)可恢复性
系统的一部分组件失效时,不会影响到整个系统。消息队列降低了进程间的耦合度,所以即使一个处理消息的进程挂掉,加入队列中的消息仍然可以在系统恢复后被处理。
(3)缓冲
有助于控制和优化数据流经过系统的速度,解决生产消息和消费消息,处理速度不一致的情况。
(4)灵活性 & 峰值处理能力
在访问量剧增的情况下,应用仍然需要继续发挥作用,但是这样的突发流量并不常见。如果以能处理这类峰值访问为标准,来投入资源随时待命,无疑是巨大的浪费。使用消息队列能够使关键组件顶住突发的访问压力,而不会因为突发的超负荷请求,而完全崩溃。
(5)异步通信
很多时候,用户不想也不需要立即处理消息。消息队列提供了异步处理机制,允许用户把一个消息放入队列,但并不立即处理它。想向队列中放入多少消息,就放多少,然后在需要的时候再去处理它们。
1.2 消息队列的两种模式
(1)点对点模式(一对一,消费者主动拉取数据,消息收到后消息清除)
消息生产者生产消息发送到消息队列中,然后消息消费者从消息队列中取出并且消费消息。消息被消费以后,消息队列中不再有存储,所以消息消费者不可能消费到已经被消费的消息。消息队列支持存在多个消费者,但是对一个消息而言,只会有一个消费者可以消费。
(2)发布/订阅模式(一对多,又叫观察者模式,消费者消费数据之后不会清除消息)
消息生产者(发布)将消息发布到topic中,同时有多个消息消费者(订阅)消费该消息。和点对点方式不同,发布到topic的消息会被所有订阅者消费。
发布/订阅模式是定义对象间一种一对多的依赖关系,使得每当一个对象(目标对象)的状态发生改变,则所有依赖于它的对象(观察者对象)都会得到通知并自动更新。
1.3 Kafka定义
Kafka是一个分布式的基于发布/订阅模式的消息队列(MQ,Message Queue),主要应用于大数据领域的实时计算以及日志收集。
1.3.1 Kafka简介
Kafka最初是由Linkedin公司开发,是一个分布式、支持分区的(partition)、多副本的(replica),基于Zookeeper协调的分布式消息中间件系统,它最大的特性就是可以实时处理大量数据,以满足各种需求场景,比如基于hadoop的批处理系统、低延迟的实时系统、Spark/Flink流式处理引擎,nginx访问日志,消息服务等等。用scala语言编写,Linkedin于2010年贡献给了Apache基金会并成为顶级开源项目。
1.3.2 Kafka的特性
高吞吐量、低延迟
Kafka每秒可以处理几十万条消息,它的延迟最低只有几毫秒。每个topic可以分多个Partition,Consumer Group对Partition进行消费操作,提高负载均衡能力和消费能力。
可扩展性
kafka集群支持热扩展
持久性、可靠性
消息被持久化到本地磁盘,并且支持数据备份,防止数据丢失
容错性
允许集群中节点失败(多副本情况下,若副本数量为n,则允许n-1个节点失败)
高并发
支持数千个客户端同时读写
1.3.3 Kafka系统架构
(1)Broker
一台kafka服务器就是一个broker。一个集群由多个broke组成。一个broker可以容纳多个topic。
(2)Topic
可以理解为一个队列,生产者和消费者面向的都是一个topic。
类似于数据库的表名或者ES的index
物理上不同topic的消息,分开存储
(3)Partition
为了实现扩展性,一个非常大的topic可以分布到多个broker(即服务器)上,一个topic可以分割为一个或多个partition,每个partition是一个有序的队列。Kafka只保证partition内的记录是有序的,而不保证topic中,不同partition间的顺序。
每个topic至少有一个partition,当生产者产生数据的时候,会根据分配策略选择分区,然后将消息追加到指定分区队列的末尾。
1.3.4 Partation数据路由规则
(1)指定了patition,则直接使用;
(2)未指定patition但指定key(相当于消息中某个属性),通过对key的value进行hash取模,选出一个patition;
(3)patition和key都未指定,使用轮询选出一个patition。
每条消息都会有一个自增的编号,用于标识消息的偏移量,标识顺序从0开始。
每个partition中的数据,使用多个segment文件存储。
如果topic有多个partition&#