Kafka
定义topic 类似于一个表 存储相同格式,有顺序的数据,传到kafka里面的数据叫消息。
按照磁盘顺序来读写数据 通过多分区,多副本提供容错性。
分区内有序读取和存储
Kafka原理
1.Partition内 顺序存储,写入新消息采用追加的方式,消费消息采用FIFO的方式顺序拉取消息
2.一个Topic可以有多个分区,Kafka只保证同一个分区内有序,不保证Topic整体(多个分区之间)
有序
3 Consumer Group(CG),为了加快读取速度,多个consumer可以划分一个组,并行消费一个Topic
一个Topic可以由多个CG订阅,多个CG之间是平等的,同一个CG内可以有一个多个consumer,同一个
CG内的consumer之间是竞争关系,一个消息在一个CG内只能被一个consumer消费。
Kafka核心概念
Topic:特指Kafka处理的消息源(feeds of messages)的不同分类,相当于数据库的表。
Broker:缓存代理,Kafa集群中的一台或多台服务器统称为broker。
Partition:Topic物理上的分组,一个topic可以分为多个partition,每个partition是一个有序的队列。partition中的每条消息都会被分配一个有序的id(offset)
相当于把一个数据集分成多份放到不同的分区中存储。
Replication:副本,一个partition可以设置一个或多个副本,副本保证系统能够持续不丢失对外提供服务,提供系统的容错能力。
Message:消息,是通信的基本单位,每个producer可以向一个topic(主题)发布一些消息。
Producers:消息和数据生产者,向Kafka的一个topic发布消息的过程叫做producers。
Consumers:消息和数据消费者,订阅topics并处理其发布的消息的过程叫做consumers。
Consumer Group:消费者所属组,一个Consumer group可以包含一个或者多个consumer。当一个topic被一个Consumer Group消费的时候。
Consumer Group内只能有一个consumer消费同一条消息,不会出现同一个Consumer Group多个consumer同时消费一条消息的情况。
Zookeeper:Zookeeper在kafka集群中主要用于协调管理,Kafka将
元数据信息保存在Zookeeper中,通过Zookeeper管理维护整个Kafka
集群的动态扩展、各个Broker负载均衡、Partition leader选举等
#Kafka存储
每个partition的副本是一个目录
Segment:段文件,kafka中最小数据存储单位,一个partition包含多个segment文件,每个segment以message在partition中的起始偏移量
命名以log结尾的文件Offset:消息在分区中的偏移量,用来在分区中唯一的标识这个消息。
afka为了提高写入、查询速度在partition文件夹下每一个segment log文件都有同名的索引文件,在kafka0.10以后的版本中会存在两个
索引文件,一个用offset做名字以index结尾的索引文件,我们称为偏移量索引文件。一个是以消息写入的时间戳为做名字以timeinde
结尾的索引文件,我们称为时间戳索引文件。
存在两种索引文件:
偏移量索引:index为后缀,通过log.index.interval.bytes设置索引跨度,索引内容格式:offset,position。
时间戳索引:timestamp,offset,通过log.index.interval.bytes设置索引跨度。
#Kafka高可用的实现
(1)多分区多副本
同一个partition的不同副本分布到不同的broker。一个分区的多个副本选举一个leader,由leader负责读写,其他副本作为follower从leader同步消息,
(2)Kafka Controller选举
从集群中的broker选举出一个Broker作为Controller控制节点;负责整个集群的管理,如Broker管理、Topic管理、Partition Leader选举等。选举过程
通过向Zookeeper创建临时znode实现,为被选中的Broker监听Controller的znode,等待下次选举。
(3)Kafka Partition Leader选举:
Controller负责分区Leader选举。ISR列表:Follower批量从Leader拖取数据;Leader跟踪不其保持同步的flower列表ISR(In Sync Replica),ISR作为
下次选主的候选列表。Follower心跳超时或者消息落后太多,将被移除出ISR。Leader失败后,从ISR列表中选择一个Follower作为新的Leader。
实际演示
(1)安装略
(2)
创建主题
bin/kafka-topics.sh --create --zookeeper 192.168.183.101:2181,192.168.183.102:2181,192.168.183.103:2181,192.168.183.104:2181,192.168.183.105:2181, --replication-factor 2 --partitions 3 --topic topicnewtest1
bin/kafka-topics.sh --create --zookeeper 192.168.183.101:2181,192.168.183.102:2181,192.168.183.102:2181,192.168.183.104:2181,192.168.183.105:2181, --replication-factor 2 --partitions 3 --topic test2
bin/kafka-topics.sh --create --zookeeper 192.168.183.101:2181,192.168.183.102:2181,192.168.183.102:2181,192.168.183.104:2181,192.168.183.105:2181, --replication-factor 2 --partitions 3 --topic test3
bin/kafka-topics.sh --create --zookeeper 192.168.183.101:2181,192.168.183.102:2181,192.168.183.102:2181,192.168.183.104:2181,192.168.183.105:2181, --replication-factor 2 --partitions 3 --topic sumer_offset
查看主题信息
bin/kafka-topics.sh --describe --zookeeper 192.168.183.101:2181 --topic topicnewtest1
查看kafka中已经创建的主题列表
bin/kafka-topics.sh --list --zookeeper 192.168.183.101:2181
删除主题
bin/kafka-topics.sh --delete --zookeeper 192.168.183.101:2181 --topic topictest1
增加分区
bin/kafka-topics.sh --alter --zookeeper 192.168.183.101:2181 --topic topicnewtest1 --partitions 5
使用kafka自带的生产者客户端脚本
在node03上,bin/kafka-console-producer.sh --broker-list 192.168.183.103:9092,192.168.183.104:9092 --topic topicnewtest1
使用kafka自带的消费者客户端脚本
bin/kafka-console-consumer.sh --zookeeper 192.168.183.101:2181 --from-beginning --topic topicnewtest1
生产者和消费者的例子