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
我自己画了一个大概的流程图,并不是准确的,只是为了方便理解而已,还是用笔画的哈哈
什么是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
我自己画了一个大概的流程图,并不是准确的,只是为了方便理解而已,还是用笔画的哈哈
相关文章推荐
- 我对php的mvc的一些理解,以及自己写的框架
- 我对php的mvc的一些理解,以及自己写的框架
- 图像、帧、片、NALU 是学习 H.264 的人常常感到困惑的一些概念,我在这里对自己的理解做一些阐述,欢迎大家讨论:
- 协方差矩阵的概念,算法以及自己的一些理解
- zoj 3861 Valid Pattern Lock(以及自己对dfs的一些理解)
- 偶对学习C#以及理解.Net平台的一些看法(二,Junior Bibliography)
- 学习Java时自己的一些重要理解
- 用类名做方法的返回值类型 在学习Java的初始阶段,很多同学使用基本数据类型定义变量和引用类型定义变量以及使用类名做方法的返回值类型常常不知所以。今天我以自己的解读方式和个人的理解作一个简单的解释,和
- 自己在学习Mybits的时候理解的一点sql注入的知识,以及处理的方法!
- 由读《深入理解计算机系统》一书引发对程序本质的探讨以及自己的一些理解
- 《水晶之约》的完整代码以及一些思想很值得学习---优秀程序的代码固然能更提高自己
- 偶对学习C#以及理解.Net平台的一些看法(一,Prerequisites)
- 自己对Z-stack的架构一些理解(仅作学习笔记,有错误希望大家能指出来,初学Z-Stack菜鸟一只)
- 学习linux framebuffer遇到的一些词汇的理解
- 自己一些对Exchange 2007 Autodiscover服务的新理解。。。。更新中
- Java学习过程中应该深入理解的一些重点
- Data block 的物理结构介绍以及一些参数的学习
- 自己一些对Exchange 2007 Autodiscover服务的新理解。。。。更新中
- Java学习过程应该深入理解的一些重点
- Java学习过程中应该理解的一些重点内容