一、kafka特点
1. 高吞吐量/低延时
高吞吐性:每秒所能处理的字节数/每秒能处理的消息数字
低延时:某条消息的发出与接受的时间间隔
其实现原理如下:
如图所示:消息在进入kafka后,kafka会先通过磁盘顺序I/o写的方式在文件末尾增加一条日制,然后将记录记入系统页缓存中(页缓存中的内容什么时候刷新到磁盘由操作系统决定);消息消费时候,是先从页缓存中读取数据,如果命中消息,则通过操作系统的sendfile技术(零拷贝技术)将消息发送给socket的I/O端,在没有命中时候,则从磁盘中获取数据,并将该数据放到页缓存中然后在发送socket端。
2. 消息持久化
如第一点所述:采用顺序写的方式将消息附加到文件末尾,并且该日志数据提交给操作系统的页缓存中,至于什么时候从页面缓存中数据刷新到硬盘则由操作系统决定。
消息持久化好处:
1.解耦消息的发送与消费
消息生产方只要确定消息已经发送成功后即不用在对消息其后的操作负责,消费着只需要从kafka中获取数据即可,一旦kafka确认接受了来自生产者的数据,则需要对消息的安全性负责
2. 实现灵活的消息处理
可以在未来某个时间对已经处理过的消息进行消息重演
3. 负载均衡与故障转移
kafka是通过智能分区选举算法实现负载均衡,将服务均等分配给各个分区的leader上;
故障转移是通过会话机制将会话注册到zookeeper上,如果该会话超时,那么Kafka集群会选举出另外一台机器来代替这台机器继续提供服务。
4. 伸缩性
将Kafka中的状态交给zookeeper来保管,自己只维护一些比较轻量级别的状态,这样只需要重启一台服务,将新的节点注册给zookeeper,即可自动实现负载均衡,来实现集群的伸缩性。
5. kafka存储特点
采用二进制方式存储而不是通过对象方式存储
6. 高可靠性
kafka所维护的动态分区集合(集合中所有replica保存的消息日志都与主结点保持一致,当replica日志滞后到一定程度时候会从集合中移除,直到其追赶上主节点日志会再次加入集合中)都接收了同一条信息,才表明该信息提交成功
7. 高并发
Topic-partition-offset三层结构,即保证了消息的传输效率,又保证了消息的顺序性
二、kafka环境搭建与启动
1). 下载kafka Apache Kafka 并将其解压(kafka版本3.3.1)
2). 环境要求 jdk7以上
3). 启动zookeeper (kafka中有自带zookeeper)
bin/zookeeper-server-start.sh config/zookeeper.properties
从上图可以见端口为2181
4). 启动kafka服务
./bin/kafka-server-start.sh ./config/server.properties
出现上图所示表明已经启动成功
5). 查看都有哪些命令
bin/kafka-topics.sh --help
6). 创建topic
bin/kafka-topics.sh --create --bootstrap-server localhost:9092 --topic test --partitions 1 --replication-factor 1
如上图表明topic创建成功
7). bin/kafka-topics.sh --describe --bootstrap-server localhost:9092 --topic test
查看topic的状态
如图所示,此时的分区数是1,副本数也是1,
8). 给指定topic中发送消息
bin/kafka-console-producer.sh --bootstrap-server localhost:9092 --topic test
9). 查看指定topic中的消息
bin/kafka-console-consumer.sh --bootstrap-server localhost:9092 --topic test --from-beginning