Kafka
简介:
Kafka是最初由Linkedin公司开发,是一个分布式、支持分区的(partition)、多副本的(replica),基于zookeeper协调的分布式消息系统,它的最大的特性就是可以实时的处理大量数据以满足各种需求场景:比如基于hadoop的批处理系统、低延迟的实时系统、storm/Spark流式处理引擎,web/nginx日志、访问日志,消息服务等等,用scala语言编写,Linkedin于2010年贡献给了Apache基金会并成为顶级开源 项目。
Kafka 基本概念:
producer:消息和数据的生产者,向kafka的一个topic发布消息的进程/代码/服务
consumer:消息和数据的订阅者,订阅数据(topic)并且处理起发布的消息的进程/代码/服务
Consumer Group:逻辑概念,对于同一个topic,会广播给不同的group,一个group中,只有一个consumer可以消费该消息
Broker:物理概念,kafka集群中的每个kafka节点
Topic:逻辑概念,Kafka消息的类别,对数据进行区分,隔离
partition:物理概念,kafka下存储的基本单元,一个topic可以存多个partition,partition是有序的
Replication: 同一个Partition 可能会有Replica,多个Replica之间数据一样的
Replication Leader:一个Partition的多个 Replica上,需要一个leader负责该Partition上与Producer和 Consumer交互
ReplicaManager:负责管理当前broken 所分区和副本的信息,处理KafkaController发起一些请求,副本状态的却换 添加/读取信息等
-----扩展
Partition
1.每一个Topic被切分为多个Partitions
partition属于消息存储的基本单位。topic就像分类,一个分类下有多个单位(partition)。
2.消费者数据少于或等于Partition的数目
3.Broker Group 中的每一个Broker保存Topic的一个或多个Partitions
4.Consumer Group 中的仅有一个Consumer读取Topic的一个或者多个Partitions,并且是唯一的Consumer
//broker 是kafaka的一个存储节点。多个节点组成一个Broker Group
Replication
1.当集群中有broker 挂掉的情况,系统可以主动的使用Replicas提供服务
2.系统m默认设置每一个Topic的replication系数为1,可以在创建Topic是单独设置
Replication特点
1.replication的基本单位是Topic的Partition
2.所有的读和写都从Leader进,Follwers只是作为备份
3.Follower必须能够及时复制Leader的数据
4.增加容错性与可扩展性
Kafka消息结构
OfferSet:记录消息的偏移量
Length:记录的是整条消息的长度
CRC32:校验字段,校验信息的完整性
Magic:特定数字,判断数据是否属于Kafka,不属于就直接丢弃
attributes:(可选)记录的是数据的多个属性,是一个枚举值
Kafka的特点:分布式
(1)多分区
(2)多副本
(3)多订阅者
(4)基于ZooKeeper调度
Kafka的特点:高性能
1.高吞吐量 ;2.低延迟;3.高并发;4.时间复杂度o(1)
Kafka的特点:持久化与扩展性
1.数据可持久化;2 容错性;3.支持在线水平扩展;4.消息自动平衡
Kafka 应用场景
消息队列、行为跟踪、元信息监控(运维性质)、日志收集、流处理、事件源、持久性日志(commit log)
kafka 的简单案例
1.zookeeper
2.启动 kafka
.\bin\windows\kafka-server-start.bat .\config\server.properties
3. 创建 topic (test ) 他有一个分区和一个副本:
.\bin\kafka-topics.sh --create --zookeeper localhost:2181 --replication-factor 1 --partitions 1 --topic test
4. 现在我们可以运行List(列表)命令来查看这个Topic:
.\bin\kafka-topics.sh --list --zookeeper localhost:2181 test
5.
kafka 消息事务
数据传输的事务定义
1.最多一次:消息不会被重复发送,最多被传输一次,但也有可能一次不传输
2.最少一次:消息不会被漏发送,最少被传输一次,但也有可能被重复传输
3.精确一次(Exactly once):不会漏传输也不会重复传输,每个消息 都被传输一次而且仅仅被传输一次,这是大家所期望的
事务保证:
内部重试问题:Procedure 幂等处理
多分区原子写入
零拷贝 简介 场景:网络传输持久化日志块(消费的消息是日志块),本身很消耗性能 java:Nio chanel transforTo()方法 linux:sendfile系统调用
零拷贝过程
◆操作系统将数据从磁盘读入到内核空间的页缓存
◆将数据的位置和长度的信息的描述符增加至内核空间(socket缓冲区)
◆操作系统将数据从内核拷贝到网卡缓冲区,以便将数据经网络发出
文件传输到网络的公共数据路径
◆操作系统将数据从磁盘读入到内核空间的页缓存
◆应用程序将数据从内核空间读入到用户空间缓存中
◆应用程序将数据写回到内核空间到socket缓存中
◆操作系统将数据从socket缓冲区复制到网卡缓冲区,以便将数据经网络发出
有关kafka的一些下载以及测试 ,我推荐我一哥们的博客地址:
https://blog.youkuaiyun.com/qq_35175995/article/details/100670812