Kafka学习笔记-基本概念与安装部署

    Kafka是Linkedin开源的消息系统,它主要用于日志处理的分布式消息队列,处理活跃的流式数据。活跃的流式数据在网站应用中非常常见,这些数据包括网站的pv、用户行为(登录、浏览、点击、分享、喜欢等),搜索内容以及系统运行日志(CPU、内存、磁盘、网络、系统及进程状态)等。这些数据通常以日志的形式记录下来,然后每隔一段时间进行一次统计处理。传统的日志分析系统提供了一种离线处理日志信息的可扩展方案,但若要进行实时处理,通常会有较大延迟。而现有的消(队列)系统能够很好的处理实时或者近似实时的应用,但未处理的数据通常不会写到磁盘上,这对于Hadoop之类(一小时或者一天只处理一部分数据)的离线应用而言,可能存在问题。Kafka正是为了解决以上问题而设计的,它能够很好地离线和在线应用。当前很多的消息队列服务提供可靠交付保证,并默认是即时消费(不适合离线)。高可靠交付对linkedin的日志不是必须的,故可通过降低可靠性来提高性能,同时通过构建分布式的集群,允许消息在系统中累积,使得kafka同时支持离线和在线日志处理。

 

部署结构图

  Kafka is a distributed,partitioned,replicated commit logservice。它提供了类似于JMS的特性,但是在设计实现上完全不同,此外它并不是JMS规范的实现。Kafka对消息保存时根据Topic进行归类,发送消息者成为Producer,消息接受者成为Consumer,此外Kafka集群有多个Kafka实例组成,每个实例Server成为Broker。无论是Kafka集群,还是Producer和Consumer都依赖于zookeeper来保证系统可用性集群保存一些meta信息。

 

Kafka部分名词解释:

Broker:消息中间件处理结点,一个Kafka节点就是一个Broker,多个Broker可以组成一个Kafka集群。

Topic:一类消息,例如page view日志、click日志等都可以以Topic的形式存在,Kafka集群能够同时负责多个Topic的分发。

Partition:Topic物理上的分组,一个Topic可以分为多个Partition,每个Partition是一个有序的队列。

Segment:Partition物理上由多个Segment组成。

Offset:每个Partition都由一系列有序的、不可变的消息组成,这些消息被连续的追加到Partition中。Partition中的每个消息都有一个连续的序列号叫做Offset,用于Partition中唯一标识的这条消息.

Producer:将消息发布到指定的Topic中,同时Producer也能决定将此消息归属于哪个Partition。

Consumer:每个Consumer属于一个Consumer Group;反过来说,每个Group中可以有多个Consumer。发送到Topic的消息,只会被订阅此Topic的每个Group中的一个Consumer消费。如果所有的Consumer都具有相同的Group,这种情况和Queue模式很像;消息将会在Consumers之间负载均衡。如果所有的Consumer都具有不同的Group,那这就是"发布-订阅";消息将会广播给所有的消费者。在Kafka中,一个Partition中的消息只会被Group中的一个Consumer消费;每个Group中Consumer消息消费互相独立;我们可以认为一个Group是一个"订阅"者,一个Topic中的每个Partition,只会被一个"订阅者"中的一个Consumer消费,不过一个Consumer可以消费多个Partition中的消息。Kafka只能保证一个Partition中的消息被某个Consumer消费时,消息是顺序的。事实上,从Topic角度来说,消息仍不是有序的。Kafka的设计原理决定,对于一个Topic,同一个Group中不能有多于Partition个数的Consumer同时消费,否则将意味着某些Consumer将无法得到消息。

 

Kafka存储策略

 

1.在Kafka文件存储中,同一个Topic下有多个不同Partition,每个Partition为一个目录,Partiton命名规则为Topic名称+有序序号,第一个Partiton序号从0开始,序号最大值为Partitions数量减1。

2.每个Partition(目录)相当于一个巨型文件被平均分配到多个大小相等Segment(段)数据文件中。但每个段Segment File消息数量不一定相等,这种特性方便Old Segment File快速被删除。每个Partition只需要支持顺序读写就行了,Segment文件生命周期由服务端配置参数决定。这样做的好处就是能快速删除无用文件,有效提高磁盘利用率。

3.每个Segment中存储多条消息,消息id由其逻辑位置决定,即从消息id可直接定位到消息的存储位置,避免id到位置的额外映射。Segment File由两个部分组成,分别为index file和data file,此2个文件一一对应,成对出现,后缀名字为".index"和“.log”分别表示为Segment索引文件、数据文件。Segment文件命名规则:Partition全局的第一个Segment从0开始,后续每个Segment文件名为上一个Segment文件最后一条消息的Offset值。数值最大为64位long大小,19位数字字符长度,没有数字用0填充。

4.每个Partition在内存中对应一个index,记录每个Segment中的第一条消息偏移位置。

5.发布者发到某个Topic的消息会被均匀的分布到多个Partition上(随机或根据用户指定的回调函数进行分布),Broker收到发布消息往对应Partition的最后一个Segment上添加该消息,当某个Segment上的消息条数达到配置值或消息发布时间超过阈值时,Segment上的消息会被Flush到磁盘,只有Flush到磁盘上的消息订阅者才能订阅到,Segment达到一定的大小后将不会再往该Segment写数据,Broker会创建新的Segment。

 

 

Kafka高效文件存储设计特点:

1. Kafka把Topic中一个Partition大文件分成多个小文件段,通过多个小文件段,就容易定期清除或删除已经消费完文件,减少磁盘占用。

2. 通过索引信息可以快速定位Message和确定Response的最大大小。

3. 通过Index元数据全部映射到Memory,可以避免Segment File的IO磁盘操作。

4. 通过索引文件稀疏存储,可以大幅降低Index文件元数据占用空间大小。

 

 

Kafka注意事项

1.Zero-Copy

在Kafka上,有两个原因可能导致低效:1)太多的网络请求。2)过多的字节拷贝。为了提高效率,Kafka把message分成一组一组的,每次请求会把一组message发给相应的consumer。 此外, 为了减少字节拷贝,采用了sendfile系统调用。

2.Exactly once message transfer

怎样记录每个consumer处理的信息的状态?在Kafka中仅保存了每个consumer已经处理数据的offset。这样有两个好处:1)保存的数据量少 2)当consumer出错时,重新启动consumer处理数据时,只需从最近的offset开始处理数据即可。

3.Push/Pull

Producer 向Kafka(push)推数据,Consumer 从kafka 拉(pull)数据。

4.负载均衡和容错

Producer和Broker之间没有负载均衡机制。
Broker和Consumer之间利用zookeeper进行负载均衡。所有broker和consumer都会在zookeeper中进行注册,且zookeeper会保存他们的一些元数据信息。如果某个broker和consumer发生了变化,所有其他的broker和consumer都会得到通知。

 

安装部署

 

1、解压kafka_2.11-0.8.2.1.tgz

[hadoop@centos software]$ tar -xzvf kafka_2.11-0.8.2.1.tgz

 

2、由于采用的是已搭建好的zookeeper集群,所以不用编辑config目录下zookeeper.properties文件,如果没有搭建zookeeper集群,需要编辑config目录下zookeeper.properties文件

tickTime=2000

initLimit=10

syncLimit=5

dataDir=/home/hadoop/software/zookeeper-3.4.5/data

dataLogDir=/home/hadoop/software/zookeeper-3.4.5/logs

clientPort=2181

 

启动

[hadoop@centos kafka_2.11-0.8.2.1]$ nohup bin/zookeeper-server-start.sh config/zookeeper.properties &

[hadoop@centos kafka_2.11-0.8.2.1]$ nohup bin/zookeeper-server-start.sh -daemon config/zookeeper.properties &

3、编辑config目录下server.properties文件

broker.id=0

port=9092

num.network.threads=3

num.io.threads=8

socket.send.buffer.bytes=102400

log.dirs=/home/hadoop/software/kafka_2.11-0.8.2.1/logs

num.partitions=1

num.recovery.threads.per.data.dir=1

log.retention.hours=168

log.segment.bytes=1073741824

log.retention.check.interval.ms=300000

log.cleaner.enable=false

zookeeper.connect=centos.master:2181,centos.slave1:2181,centos.slave2:2181

zookeeper.connection.timeout.ms=6000

 

4、编辑config目录下producer.properties文件

metadata.broker.list=centos.master:9092,centos.slave1:9092,centos.slave2:9092

producer.type=sync

compression.codec=none

serializer.class=kafka.serializer.DefaultEncoder

 

5、编辑config目录下consumer.properties文件

zookeeper.connect=centos.master:2181,centos.slave1:2181,centos.slave2:2181

zookeeper.connection.timeout.ms=6000

group.id=test-consumer-group

 

6、拷贝kafka_2.11-0.8.2.1目录到其他机子上

[hadoop@centos software]$ scp -r kafka_2.11-0.8.2.1 hadoop@centos.slave1:/home/hadoop/software/

[hadoop@centos software]$ scp -r kafka_2.11-0.8.2.1 hadoop@centos.slave2:/home/hadoop/software/

 

7、修改其他主机上config目录中server.properties文件中broker.id的值

 

8、启动Broker节点

[hadoop@centos kafka_2.11-0.8.2.1]$ bin/kafka-server-start.sh config/server.properties &

 

9、创建Topic

[hadoop@centos kafka_2.11-0.8.2.1]$bin/kafka-topics.sh --create --zookeeper centos.master:2181,centos.slave1:2181,centos.slave2:2181 --replication-factor 3 --partitions 1 --topic test

[hadoop@centos kafka_2.11-0.8.2.1]$bin/kafka-topics.sh --list --zookeeper centos.master:2181,centos.slave1:2181,centos.slave2:2181

[hadoop@centos kafka_2.11-0.8.2.1]$bin/kafka-topics.sh --describe --zookeeper centos.master:2181,centos.slave1:2181,centos.slave2:2181 --topic test

 

10、生产消息

[hadoop@centos kafka_2.11-0.8.2.1]$ bin/kafka-console-producer.sh --broker-list centos.master:9092,centos.slave1:9092,centos.slave2:9092 --topic test 
this is first message
this is second message

 

11、消费消息

[hadoop@centos kafka_2.11-0.8.2.1]$bin/kafka-console-consumer.sh --zookeeper centos.master:2181,centos.slave1:2181,centos.slave2:2181 --topic test --from-beginning

 

 

 

 

 

 

 

 

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值