Kafka入门初探+伪集群部署
Kafka是目前非常流行的消息队列中间件,常用于做普通的消息队列、网站的活性数据分析(PV、流量、点击量等)、日志的搜集(对接大数据存储引擎做离线分析)。
全部内容来自网络,可信度有待考证!如有问题,还请及时指正。
概念介绍
在Kafka中消息队列分为三种角色:
-
producer
,即生产者,负责产生日志数据。 -
broker
,存储节点,负责按照topic
中的partition
分区,均匀分布式的存储分区。 -
consumer
,即消费者,负责读取使用broker
中的分区。
producer
Kafka系统中的生产者,用于产生数据并发送给broker进行存储。由于需要与broker中的分区保持socket连接,因此需要在zk中维护生产者与分区broker的对应关系。同一个topic下的数据,会以某种负载均衡的方式发送到不同的分区中。
broker
Broker可以当做Kafka中的存储节点,数据按照topic组织,按照某种负载均衡方式分配到不同的分区中。一个Topic由多个分区组成,每个分区可以设置备份数量。分区由一个leader+多个followers组成,生产者直接与leader进行沟通,leader接收消息后,其他的followers会同步这个消息。所有的follwers同步消息后,该消息才会成为可消费的状态。
Broker中Topic与分区,分区与生产者,分区之间的选举备份等等信息都需要ZK进行协调。
consumer
Consumer是Kafka中的消费者,通常以组的形式存在,一个Group会包含多个Consumer。每个组对应一个Topic,该Topic内的分区只能对应一个消费者,也就是如果消费者很多的情况下,会出现有的消费者消费不到数据;如果消费者很少的情况下,会有消费者同时消费多个分区的数据。
Kafka仅仅会保证一个分区的消息的消费是有序的,多个分区并不保证有序性。
为了保证数据消费的可靠性,Kakka提供了几种消费的机制:
- 1 at most once,即消费数据后,保存offset,就再也取不到这个数据了。
- 2 at least once,即消费数据后,保存offset,如果保存出错,下次可能还会取到该数据
- 3 exactly once,待查阅
在Kafka中offset是由consumer维护的(实际可以由zk来完成)。这种机制有两个好处,
- 一个是可以依据consumer的能力来消费数据,避免产生消费数据的压力;
- 另一个就是可以自定义fetch消费的数据数目,可以一次读取1条,也可以1次读取100条。
topic
Kafka中的数据的主题,所有的操作(如消息的存储和读取消费)都是依据topic完成。
partition
每个Topic由多个分区组成,每个分区内部的数据保证了有序性,即是按照时间序列,append到分区的尾部。分区是有固定大小的,容量不够时,会创建新的分区。Kafka在一定时间内会定期清理过期的文件。
这种连续性的文件存储,一方面有效的利用磁盘的线性存取;另一方面减轻了内存的压力。
zookeeper
在Kafka中很多节点的调度以及资源的分配,都要依赖于zookeeper来完成。 如:
- 1 Broker的注册,保存Broker的IP以及端口;
- 2 Topic注册,管理broker中Topic的分区以及分布情况
- 3 Broker的负载均衡,讲Topic动态的分配到broker中,通过topic的分布以及broker的负载判断
- 4 消费者,每个分区的消息仅发送给一个消费者(不知道跟zookeeper有啥关系)
- 5 消费者与分区的对应关系,存储在zk中
- 6 消费者负载均衡,一旦消费者增加或者减少,都会触发消费者的负载均衡
- 7 消费者的offset,High level中由zk维护offset的信息;Low Level中由自己维护offset
伪集群环境的搭建
部署伪集群环境,即单节点环境非常简单。下载部署文件,解压后,直接运行即可。
运行命令如下:
# 启动zookeeper
bin/zookeeper-server-start.sh config/zookeeper.properties &
# 启动kafka
bin/kafka-server-start.sh config/server.properties &
如果想要测试,可以启动测试程序:
# 启动生产者测试程序
./kafka-console-producer.sh --broker-list localhost:9092 --topic test
# 启动消费者测试程序
./kafka-console-consumer.sh --zookeeper localhost:2181 --topic test --from-beginning
在生产者界面输入的内容,就可以直接在消费者界面中看到了。
- tensorflow之tf.placeholder 与 tf.Variable区别对比
- 11g备库搭建碰到自己给自己埋的坑(r7笔记第63天)
- JDBC基础入门(2)
- 11g备库无法开启ADG的原因分析 (r7笔记第62天)
- JDBC基础入门(3)
- Python多元线性回归-sklearn.linear_model,并对其预测结果评估
- python 聚类分析实战案例:K-means算法(原理源码)
- JAVA面试题解惑——final、finally和finalize的区别
- Java内存管理
- python基础知识——内置数据结构(字典)
- mysql、mongodb、python(dataframe).聚合函数的形式,以及报错解决方案
- JavaScript计算水仙花数【可自定义范围】
- JSP简单入门(1)
- mongodb取出json,利用python转成dataframe(dict-to-dataframe)
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- 使用2D卷积技术进行时间序列预测
- 在PyTorch中使用DistributedDataParallel进行多GPU分布式模型训练
- 同城双活与异地多活架构分析
- leetcode多线程之按序打印
- leetcode多线程之交替打印FooBar
- leetcode链表之反转链表
- leetcode链表之合并两个排序的链表
- leetcode链表之找出倒数第k个节点
- ZooKeeper能解决什么问题?不能解决什么问题?
- 画解算法 77-组合
- Spring 源码系列之容器概览~
- Spring Security 中如何让上级拥有下级的所有权限?
- Spring Security 权限管理的投票器与表决机制
- 通过cycler实现属性的自动映射
- 为你的图片添加图例