ELK之Kafka

ELK

Kafka使用


前言

Kafka是一种高吞吐量的分布式发布/订阅消息系统,这是官方对kafka的定义,kafka是Apache组织下的一个开源系统,它的最大的特性就是可以实时的处理大量数据以满足各种需求场景:比如基于hadoop平台的数据分析、低时延的实时系统、storm/spark流式处理引擎等。kafka现在它已被多家大型公司作为多种类型的数据管道和消息系统使用。

一、kafka角色术语

在介绍架构之前,先了解下kafka中一些核心概念和各种角色。

角色功能
BrokerKafka集群包含一个或多个服务器,每个服务器被称为broker
Topic每条发布到Kafka集群的消息都有一个分类,这个类别被称为Topic(主题)
Producer指消息的生产者,负责发布消息到Kafka broker
Consumer指消息的消费者,从Kafka broker拉取数据,并消费这些已发布的消息
PartitionParition是物理上的概念,每个Topic包含一个或多个Partition,每个partition都是一个有序的队列。partition 中的每条消息都会被分配一个有序的id(称为offset)
Consumer Group消费者组,可以给每个Consumer指定消费者组,若不指定消费者组,则属于默认的group
Message消息,通信的基本单位,每个producer可以向一个topic发布一些消息

二、Kafka拓扑架构(关系图)

一个典型的Kafka集群包含若干Producer,若干broker、若干Consumer Group,以及一个Zookeeper集群。Kafka通过Zookeeper管理集群配置,选举leader,以及在Consumer Group发生变化时进行rebalance(调整)。Producer使用push模式将消息发布到broker,Consumer使用pull模式从broker订阅并消费消息。
在这里插入图片描述

三、Kafka重要机制

1、Topic与Partition

Kafka中的topic是以partition的形式存放的,每一个topic都可以设置它的partition数量,Partition的数量决定了组成topic的log的数量。推荐partition的数量一定要大于同时运行的consumer的数量。另外,建议partition的数量大于集群broker的数量,这样消息数据就可以均匀的分布在各个broker中。

那么,Topic为什么要设置多个Partition呢,这是因为kafka是基于文件存储的,通过配置多个partition可以将消息内容分散存储到多个broker上,这样可以避免文件尺寸达到单机磁盘的上限。同时,将一个topic切分成任意多个partitions,可以保证消息存储、消息消费的效率,因为越多的partitions可以容纳更多的consumer,可有效提升Kafka的吞吐率。因此,将Topic切分成多个partitions的好处是可以将大量的消息分成多批数据同时写到不同节点上,将写请求分担负载到各个集群节点。

2、Kafka消息发送的机制

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

发送消息流程为:
首先获取topic的所有Patition,如果客户端不指定Patition,也没有指定Key的话,使用自增长的数字取余数的方式实现指定的Partition。这样Kafka将平均的向Partition中生产数据。如果想要控制发送的partition,则有两种方式,一种是指定partition,另一种就是根据Key自己写算法。实现其partition方法。
每一条消息被发送到broker时,会根据paritition规则选择被存储到哪一个partition。如果partition规则设置的合理,所有消息可以均匀分布到不同的partition里,这样就实现了水平扩展。同时,每条消息被append到partition中时,是顺序写入磁盘的,因此效率非常高,经验证,顺序写磁盘效率比随机写内存还要高,这是Kafka高吞吐率的一个很重要的保证。
在这里插入图片描述

3、Kafka消息消费机制

Kafka中的Producer和consumer采用的是push(推送)、pull(拉取)的模式,即Producer只是向broker push消息,consumer只是从broker pull消息,push和pull对于消息的生产和消费是异步进行的。pull模式的一个好处是Consumer可自主控制消费消息的速率,同时Consumer还可以自己控制消费消息的方式是批量的从broker拉取数据还是逐条消费数据。
当生产者将数据发布到topic时,消费者通过pull的方式,定期从服务器拉取数据,当然在pull数据的时候,服务器会告诉consumer可消费的消息offset。
在这里插入图片描述
消费规则:
1、不同 Consumer Group下的消费者可以消费partition中相同的消息,相同的Consumer Group下的消费者只能消费partition中不同的数据。
即广播(发布-订阅式)和队列模式
2、topic的partition的个数和同一个消费组的消费者个数最好一致,如果消费者个数多于partition个数,则会存在有的消费者消费不到数据。
3、服务器会记录每个consumer的在每个topic的每个partition下的消费的offset,然后每次去消费去拉取数据时,都会从上次记录的位置开始拉取数据。

4、Kafka消息存储机制

在存储结构上,每个partition在物理上对应一个文件夹,该文件夹下存储这个partition的所有消息和索引文件,每个partion(目录)相当于一个巨型文件被平均分配到多个大小相等segment(段)数据文件中。
partiton命名规则为topic名称+序号,第一个partiton序号从0开始,序号最大值为partitions数量减1。
在每个partition (文件夹)中有多个大小相等的segment(段)数据文件,每个segment的大小是相同的,但是每条消息的大小可能不相同,因此segment 数据文件中消息数量不一定相等。
在这里插入图片描述
segment数据文件有两个部分组成,分别为index file和data file,此两个文件是一一对应,成对出现,后缀".index"和“.log”分别表示为segment索引文件和数据文件。

5、Kafka使用磁盘好处

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

四、kafka下载安装

1、下载

直接从从kafka官网https://kafka.apache.org/downloads下载即可
下载完成后上传到/usr目录下
这里以kafka_2.10-0.10.0.1.tgz为例

2、安装

cd进入/usr目录下
解压

[root@VM-0-2-centos usr]# tar -zxvf kafka_2.10-0.10.0.1.tgz -C /usr/local/

重命名一下

[root@VM-0-2-centos local]# mv /usr/local/kafka_2.10-0.10.0.1/ /usr/local/kafka

四、配置kafka集群

vim打开/usr/local/kafka/config/server.properties文件
未被注释的参数有如下

#每一个broker在集群中的唯一表示,要求是正数。
#当该服务器的IP地址发生改变时,broker.id没有变化,则不会影响consumers的消息情况
broker.id=1
#broker处理消息的最大线程数,一般情况下数量为cpu核数
num.network.threads=2
#broker处理磁盘IO的线程数,数值为cpu核数2倍
num.io.threads=4
#socket的发送缓冲区,socket的调优参数 一般不改
socket.send.buffer.bytes=102400
#socket的接受缓冲区,socket的调优参数 一般不改
socket.receive.buffer.bytes=102400
#socket请求的最大数值,防止serverOOM
#message.max.bytes必然要小于socket.request.max.bytes
#会被topic创建时的指定参数覆盖
#一般不改
socket.request.max.bytes=104857600
#kafka数据的存放地址,多个地址的话用逗号分割
#多个目录分布在不同磁盘上可以提高读写性能
log.dirs=../tmp/kafka-logs
#每个topic的分区个数
#若是在topic创建时候没有指定的话会被topic创建时的指定参数覆盖
num.partitions=6
#每数据目录用于日志恢复启动和关闭时的线程数量。因为这些线程只是服务器
#启动和关闭时会用到。所以完全可以设置大量的线程来达到并行操作的目的
num.recovery.threads.per.data.dir=4
#数据文件保留多长时间
#存储的最大时间超过这个时间会根据log.cleanup.policy设置数据清除策略
log.retention.hours=168
#topic的分区是以一堆segment文件存储的
#这个控制每个segment的大小,会被topic创建时的指定参数覆盖
log.segment.bytes=1073741824
#文件大小检查的周期时间,是否处罚 log.cleanup.policy中设置的策略
log.retention.check.interval.ms=300000
#zookeeper集群的地址,可以是多个,多个之间用逗号分
zookeeper.connect=10.206.0.2:2181,10.206.0.2:2182,10.206.0.2:2183
#zooKeeper的连接超时时间
zookeeper.connection.timeout.ms=6000

除此之外 我们还需要假如如下配置

#设置kafka的监听地址与端口,可以将监听地址设置为主机名或IP地址,这里将监听地址设置为IP地址
listeners=PLAINTEXT://172.16.213.51:9092
#这个参数用于设置是否自动创建topic,如果请求一个topic时发现还没有创建kafka会在broker上自动创建一个topic
#如果需要严格的控制topic的创建,那么可以设置auto.create.topics.enable为false,禁止自动创建topic
auto.create.topics.enable=true
#在0.8.2版本之后,Kafka提供了删除topic的功能,但是默认并不会直接将topic数据物理删除
#如果要从物理上删除(即删除topic后,数据文件也会一同删除),就需要设置此配置项为true
delete.topic.enable=true

五、启动kafka集群

在启动kafka集群前,需要确保ZooKeeper集群已经正常启动。接着,依次在kafka各个节点上执行如下命令即可
cd进入/usr/local/kafka目录下

[root@VM-0-2-centos kafka]# nohup ./bin/kafka-server-start.sh config/server.properties &

这样即可
jps查看是否启动成功
在这里插入图片描述
这样即为成功

其他服务器修改对应的broker.id为2、3后启动完成即可

  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值