您的位置:首页 > 其它

kafka学习积累以及自己对kafka的一些理解

2017-04-12 16:25 267 查看
最近在自学Kafka,在学习的过程中也是东一块西一块的总算是拼凑起来了,特意今天注册了帐号,分享下自己学的时的一些经验,以后也方便自己回忆,话不多说,直接进入正题。

什么是kafka:

kafka是一个消息队列,你可以向其发送消息,你也可以从其中消费消息,producer发送消息时是以topic,message的方式,consumer消费也是topic,message的方式,consumer订阅topic,当此topic有新消息的时候,这个consumer就可以收到通知啦。

kafka的搭建

kafka的搭建分为单机模式,伪分布式模式,和完全分布式模式,其实我觉没有必要区分这么多,我学习是用伪分布式搭建的,这里我说一下详细的配置信息和搭建的思路,因为kafka实际需要配置的并不多,至少我是这么觉得的,只要有了配置的思路,那么走到哪都会配置的。

1:确认自己的服务器环境,你是linux还是windows,我自己是用的linux

2:下载相应的压缩包就可以了:我下载的是 kafka_2.11-0.10.1.0.tgz,版本你自己随意,差不了多少

3:解压压缩包到本地,linux的就是 tar -zxvf kafka_2.11-0.10.1.0.tgz /home/xx/xx 就可以了

4:进入你的kafka的目录吧,看看里面都有什么东西 cd 解压后的目录即

剩下的具体配置,网上肯定有一大堆,我就不在这里说了,提供一下链接吧

http://blog.csdn.net/silent_strings/article/details/50879407

kafka的组成

kafka的组成其实和从配置文件就能看出来了,就是kafka+zookeeper,现在的问题就是zookeeper是干嘛用的,为什么kafka需要用到zookeeper?

zookeeper:

1:统一的命名空间

2:集群管理

3:分布式锁

4:配置服务

详细的可以看这篇文章 http://www.cnblogs.com/yuyijq/p/3424473.html

那么kafka用到了zookeeper的哪些功能呢,其实细致的说这四个都用到了。

kafka,broker

kafka是消息队列,producer将消息发送到了kafka中,kafka将消息存在了缓存中并且持久化到本地,这个很好理解,总不能服务器一重启啥都没有了吧,所以持久化肯定是必须的,那么消息肯定是大量的,只有一台kafka服务器(一台安装并配置了kafka的服务器)肯定是不行的,始终是要存满的,所以kafka集群就出现了,每一台kafka服务器被称为broker,broker对应的配置就是server.properties文件中的配置,既然是kafka集群,那么集群肯定是需要有人管理的,因为每台服务器并不知道自己在哪个集群当中,自己的集群当中又有谁,所以zookeeper来了,它来管理这个集群,所以在server.properties当中有一条配置zookeeper.connect=192.168.0.1:2181,这句话的意思就是将kafka服务也就是broker注册到zookeeper当中,后面的Ip:port就是zookeeper服务,每台kafka服务器都是如此,这样broker就被zookeeper管理了,在192.168.0.1:2181的zookeeper服务收到了3台broker的注册

topic,partition

topic是概念上的,topic就是主题,也就是你这消息是什么主题的,你可以设置成动漫类的,体育类的等等,partition物理上的,每个topic可以对应一至多个partition,partiton我的理解就是将topic分成几份进行存储,例如当前只有一台服务器的时候,server.properties中num.partitions=3,则意味着在log.dirs=/tmp/kafka-logs,这个目录下,你的topic被分成了3份,testTopic0、testTopic1、testTopic2,当然在一台服务器的情况下这么分组是没有任何意义的,不管分成几份都是在这台服务器当中,所以partition的主要意思就在于分布式集群环境下了,当我们的集群有3台服务器的时候,kafka会把testTopic0、testTopic1、testTopic2这三份partiton按照一定的算法,平均分配到三台服务器上。如果没有partiton,那么我们的消息就会集中在某一台机器上,如果我们的topic量级很大,就会导致这台机器压力很大,请求这个topic的时候也会导致读取速度特别的慢,甚至崩溃,但将topic均匀分布到多台机器上时,就不会导致这个问题,这时有人应该会有疑问了,那我的testTopic分布在了3个机器上,我怎么读取呢?,接着看吧

offset,zookeeper

offset就是偏移量,或者理解为java数组中的index,在Kafka中,每个group中只有一个消费者可以消费消息,如果要群发消息,只需要把每个消费者分别定义一个group就好了,offset就是记录你们这个group消费到哪一条消息了,它被记录在了kafka中,具体关系可以这么理解

consumer在kafka中

consumers{consumerA,consumerB,consumerC}

consumerA{topic1,topic2,topic3}

topic1{partiton0,partiton1,partiton3}

partiton0{offset},partiton1{offset},partiton2{offset},

每个consumer中保存了定订阅的每个topic的offset

topic在kafka中

brokers{topics,ids}

topics{topic1,topic2,topic3}

topic1{partiton0,partiton1,partiton2}

partiton0{broker1,broker2,broker3}

broker在kafka中

brokers{topics,ids}

ids{broker1,broker2,broker3}

broker1{host:port},broker2{host:port},broker3{host:port},

由上面的关系可以看出,cosumer要知道自己要取的topic和partition以及offset,然后去topics下找到topic,partition以及partiton所在的broker,这样就拿着offset到该broker下取数据就可以了

具体kafka在zookeeper中的节点关系,可以从以下链接中具体学习,写的超级详细http://blog.csdn.net/tianbianlan/article/details/46387039

我自己画了一个大概的流程图,并不是准确的,只是为了方便理解而已,还是用笔画的哈哈

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
相关文章推荐