文章目录
1. 初识kafka框架
kafka是一个分布式、支持分区的(partition)、多副本的(replica),基于zookeeper协调的分布式消息系统(所谓消息系统:用于在不同应用之间传输数据的消息引擎系统)。
其设置初衷是为了解决互联网公司超大量级数据的实时传输,其具备如下能力
- 高吞吐量/低延时
- 消息持久化
- 负载均衡和故障转移
- 伸缩性
高吞吐量/低延时
-
kafka消息持久化大量使用页缓存,读写消息大概率可以命中操作系统页缓存(此处需要明晰:kafka的消息持久化是直接追加到磁盘上的(磁盘为了存储快捷使用了页缓存))
-
kafka不直接参与物理IO,而是由操作系统进行操作
-
写消息采用追加的方式,使用了磁盘顺序写(避免了磁盘随机写性能慢的问题)
-
读消息使用了liunx的sendfile的零拷贝技术
消息持久化
kafka框架设计的时候和别的mq框架不同,别的mq框架对于消息先使用缓存(内存),在一定时机再将缓存持久化到磁盘,而是一反常态直接使用追加写>(利用了磁盘的属性写和内存写性能相同的场景)。 kafka消息持久化是直接持久化到磁盘(顺序写),并没有采用先缓存到内存进而持久化到磁盘,因为顺序写到磁盘的速度和内存随机写的速度相当。
负载均衡和故障转移
kafka实现负载均衡是通过分区领导者选举(partition leader election)来实现的,使得机器上以均等的机会分散各个partition的leader从而整体上实现负载均衡。
kafka实现故障转移使用所有服务节点都会以会话的形式将自己注册到zk上,服务器出现宕机情况则会出现会话超时失效,此时kafka集群会选举出新的机器来提供服务。
伸缩性
伸缩性是指向某个分布式系统添加(伸)和去除(缩)服务资源从而动态改变其吞吐量的能力。阻碍线性扩容的常见因素之一是服务节点之间状态的保存,服务器之间需要保存很多内部状态,自己保存的化需要处理之间的数据一致性问题,如果服务无状态(少量状态)则状态管理可以交给分布式协调服务(比如zk)来处理,进而可以很容易的扩缩容(启动新节点、下线节点)等。
而kafka就是使用zk来保管其服务节点状态(也并非使用zk来保管其所有状态,kafka节点还会自己保存少量状态)。
适用于如下需求场景:
- 基于hadoop的批处理系统、
- 低延迟的实时系统、
- Storm/Spark流式处理引擎,
- 监控日志收集
- 消息服务
设计一个消息系统需要关注两方面因素:
- 消息体的设计:常见的消息体格式有xml,json、二进制等
- 传输协议的设计:常见的消息传输有两种形式 消息队列形式、发布/订阅模式
kafka采用的消息体是二进制的形式,传输协议是基于发布/订阅
2. kafka单节点使用
2.1 搭建环境
说明:此处kafka的版本是2.10版本,所有环境搭建和使用均基于该版本进行(其他版本可能会命令会有不同,其他版本自行百度)
#kafka是使用scala语言开发(运行在jvm上) 需要确保环境安装了jdk
#同时需要确保安装了zk (kafka需要注册到zk上使用)
#1、下载kafka kafka_2.11-2.10.tgz 2.11是scala版本 2.10是kafka的版本
wget https://archive.apache.org/dist/kafka/2.1.0/kafka_2.11-2.1.0.tgz
#2、解压文件
tar -zxvf /home/kafka_2.12-3.0.0.tgz -C /usr/local/
#3、 启动kafka,运行日志在logs目录的server.log文件里
#后台启动,不会打印日志到控制台
./bin/kafka-server-start.sh -daemon config/server.properties
#或者用
bin/kafka-server-start.sh config/server.properties &
# 我们进入zookeeper目录通过zookeeper客户端查看下zookeeper的目录树
bin/zkCli.sh
#查看zk的根目录kafka相关节点
ls /brokers/ids #查看kafka节点
[zk: localhost:2181(CONNECTED) 5] ls /brokers/ids
[0] #显示出现brokers id为0的节点已经在zk上创建(与我们server.properties配置的brokers.id=0一致)
#4、停止kafka
bin/kafka