我想既然Kafka是为了写数据而产生的,那么用作家的名字来命名会显得更有意义.我在大学时期上过很多文学课程,很喜欢Franz
Kafka.况且,对于开源项目来说,这个名字听起来很酷.因此,名字和应用本身基本没有太多联系 --Jay Kreps
1.2.1 消息和批次
kafka的数据单元被称为消息.
为了提高效率,消息被分批次写入kafka.批次就是一组消息,这些消息属于同一个主题和分区.
如果每一个消息都单独穿行于网络,会导致大量的网络开销,把消息分成批次传输可以减少网络开销.
1.2.3 主题和分区
Kafka的消息通过主题进行分类.主题好比数据库的表,或者文件系统里的文件夹.主题可以被分为若干个分区,一个分区就是一个提交日志.消息以追加的方式写入分区,然后以先进先出的顺序读取.
1.2.4 生产者和消费者
生产者创建消息.也被称为发布者或写入者.
一般情况下,一个消息会被发布到一个特定的主题上.生产者在默认情况下把消息均衡地分布到主题的所有分区上,而并不关心特定消息会被写到哪个分区.
在某些情况下,生产者会把消息直接写到指定的分区.通常是通过消息键和分区器来实现的,分区器为键生成一个散列值,并将其映射到指定的分区上.可以保证包含同一个键的消息会被飞到同一个分区上.生产者也可以使用自定义的分区器,根据不同的业务规则将消息映射到分区.
消费者读取消息.也被称为订阅者或读者.消费者订阅一个或多个主题,按照消息生成的顺序读取它们.消费者通过检查消息的偏移量来区分已经读取过的消息.偏移量是另一种元数据,它是一个不断递增的整数值,在创建消息时,kafka会把它添加到消息里.在给定的分区里,每个消息的偏移量都是唯一的.消费者把每个分区最后读取的消息偏移量保存在Zookeeper或Kafka上,如果消费者关闭或重启,它的读取状态不会丢失.
消费者是消费者群组的一部分,会有一个或多个消费者共同读取一个主题.群组保证每个分区只能被一个消费者使用.
如图,有3个消费者同时读取一个主题.其中的两个消费者各自读取一个分区,另一个消费者读取其他两个分区.消费者与分区之间的映射通常被称为消费者对分区的所有权关系.
通过这种方式,消费者可以消费包含大量消息的主题.而且,如果一个消费者失效,群组里的其他消费者可以接管失效消费者的工作.
1.2.4 broker和集群
一个独立的kafka服务器被称为broker.broker接收来自生产者的消息,为消息设置偏移量,并提交消息到磁盘保存.broker为消费者提供服务,对读取分区的请求作出响应,返回已经提交到磁盘上的消息.
broker是集群的组成部分.每个集群都有一个broker同时充当了集群控制器的角色(自动从集群的活跃成员中选举出来).控制器负责管理工作,包括将分区配给broker和监控broker.在集群中,一个分区从属于一个broker,该broker被称为分区的首领.一个分区可以分配给多个broker,这个时候会发生分区复制.这种复制机制为分区提供了消息冗余,如果有一个broker失效,其他broker可以接管领导权.不过,相关的消费者和生产者都要重新链接到新的首领.
保留消息(在一定期限内)是kafka的一个重要特性.kafka broker集群默认的消息保留策略是:要么保留一段时间(比如7天),要么保留到消息达到一定大小的字节数(比如1GB).可以通过把主题当作紧凑型日志,只有最后一个带有特定键的消息会被保留下来.
1.2.6 多集群
数据类型分离
安全需求隔离
多数据中心(灾难恢复)
kafka提供了一个叫做MirrorMaker的工具,可以用它来实现集群间的消息赋值.MirrorMaker的核心组件包含了一个生产者和一个消费者,两者之间通过一个队列相连.
消费者从一个集群读取消息,生产者把消息发送到另一个集群上.
参考链接 https://blog.csdn.net/Cocktail_py/article/details/89877741
2.3.1 常规配置
1.broker. id
标识符.默认值0.在整个Kafka集群中必须是谓一致.
2.zookeeper.connect
localhost:2181表示这个Zookeeper是运行在2181端口.hostname:port/path
hostname是Zookeeper服务器的机器名或IP地址;
port是Zookeeper的客户端连接端口;
/path(可选)Zookeeper路径,作为Kafka集群的chroot环境
3.log.dirs
Kafka把消息保存在磁盘上,通过log.dirs指定的目录.用一组逗号分隔的本地文件系统路径.如果指定了多个路径,broker根据"最少使用"原则,往拥有最少数目分区的路径新增分区
4.num.recovery.threads.per.data.dir
一下3种情况,kafka会使用可配置的线程池来处理日志片段
服务器正常启动,用于打开每个分区的日志片段;
服务器崩溃后重启,用于检查和截短每个分区的日志片段;
服务器正常关闭,用于关闭日志片段.
如果num.recovery.threads.per.data.dir=8,log.dir指定了3个路径,那么总共需要24个线程
5.auto.create.topics.enable
当一个生产者开始往主题写入消息时;
当消费者开始从主题读取消息时;
当任意一个客户端向主题发送元数据请求时;
2.3.2 主题的默认配置