文章目录
Kafka初识
Kafka系列文章是基于:深入理解Kafka:核心设计与实践原理一书,结合自己的部分实践和总结。
一、什么是Kafka
- 消息系统
Kafka提供传统消息中间件的系统解耦、冗余存储、削峰填谷、异步通信、缓冲、扩展和恢复功能,以及大多数消息中间件不具备的消息顺序保证和回溯消费。
- 存储系统
Kafka提供持久化机制,并提供多副本机制,将对应主题设置保留策略并开启压缩,可将Kakfa作为存储系统。
- 流式处理平台
Kafka为流式处理平台提供可靠的数据来源,并且提供了完整的流式处理类库,比如窗口、连接、变换和聚合等。
- PS:关于Kafka版本信息,可以参考:kafka版本
二、架构
2.1 架构角色
- Kafka架构包含的角色包括:生产者、消费者、Broker和zookeepr。
角色 | 功能 |
---|---|
Producer | 生产消息到Broker |
Broker | 消息持久化和消息管理等 |
Consumer | 从Broker订阅消费消息 |
Zookeeper | 管理Kafka集群元数据 |
- Topic:主题;Kafka中消息按照主题进行归类,每一个消息都有一个主题,同一主题的消息并不意味着要保存在一个地方,主题仅仅是一个逻辑的概念。
- Partion:分区;Kafka是高扩展的,一个Topic下的消息数量理论上没有限制(offset有限制,但是是一个天文数字),但一个Topic下的消息可以分为多个分区,每个分区的消息互不一样,他们的并集是整个Topic的消息,每一分区可理解为一个可追加的日志文件。
- Offset:偏移,或者位移;Kafka中消息是有序的,这个有序是通过偏移来实现的,类似于数组的下标,每条消息的元数据中会保存该消息的Offset,但是需要注意的是Offset是不跨分区的,他只能代表自己在一个分区内的位移标示,换言之Kafka中消息有序是针对分区而言的,对于Topic而言消息不能保证有序。
- Replica:副本;Kafka是高可用的,分区的消息需要保证不能丢失,由此引入了副本机制,对于一个分区而言可有多个副本,副本间是一主多从,冗余保存消息,主是leader负责读写请求,从是follower负责同步leader的消息,leader故障,follower会重新选举出新的leader对外服务,实现故障转移。
- AR:Assigned Replicas;分区所有副本称为AR。
- ISR:AR中与leader副本保持一定程度同步的副本集合为ISR(In-Sync Replicas),ISR是AR的一个子集,这个"一定程度"可以通过参数配置。
- OSR:AR中不能保持和leader同步的副本称为OSR(Out-of-Sync Replicas),AR=ISR+OSR,正常情况OSR为空,AR=ISR
PS:leader副本会维护ISR和OSR集合,当ISR中某副本落后太多则会被转移到OSR,反之也是一样。默认情况leader故障时只有ISR中的副本有资格被选举,OSR中的副本没有机会。(也可以通过配置改变)
- HW:High Watermark,高水位,它标示了一个offset,消费者只能拉取该offset之前的消息。比如HW是5,那么消费者只能拉去offset<=4的消息,offset>=5的消息对消费者不可见。
- LEO:Log End Offset,当前分区的最后一条消息的offset加一,它代表下一条待写入消息的offset。
- LEO和HW的关系:ISR中所有LEO的最小值是HW。比如ISR的三个副本LEO是7、8和9,那么说明三个副本依次有6、7和8条消息,那么对于消费者而言只有前面6条消息是可见的,7和8的消息是不能被消费的,因为这2条消息还未确认写成功,因此HW就是7,也就是HW=min(LEO in ISR)。使用这个ISR的机制,消息的写入既不是完全同步,也不是异步,同步是消息需要全部写入到可工作的副本才代表写入成功,异步则是只要写入leader就代表写入成功,前者效率低,后置数据有丢失风险,采用ISR机制,在网络存在部分拥塞时,可以避免写入时阻塞过久,有效的权衡了可靠性和性能之间的关系。
2.2 架构图
- Kafka架构图
[外链图片转存失败(img-0dkCQGoj-1563538131737)(https://note.youdao.com/yws/api/personal/file/290BF970A5004F8AB6370CF59E1E34AC?method=download&shareKey=986f04235455251a3767e4dda7a32d55)]
- Kafka多副本架构
[外链图片转存失败(img-qjstCG8j-1563538131739)(https://note.youdao.com/yws/api/personal/file/C01A2F7458F844749B5A43EBD4033F14?method=download&shareKey=ecde5557fe12eccb2206ef134872c55e)]
三、核心参数
- 只需要配置下面三个参数Kafka就可以启动了。(前提是Zookeeper环境是ok的)
参数 | 作用描述 |
---|---|
zookeeper.connect | zk连接地址;可以配置多个,比如host1:port1,host2:port2,host3:port3。 |
broker.id | 唯一标示,在一个集群中该id是唯一的。默认是-1,建议在server.properties文件中配置。如果没有配置会生成一个唯一id。 |
listeners | kafka的监听地址和端口;建议手动配置,其他相关的监听地址配置项都已经废弃 |
PS:
zookeeper.connect:当一个zk管理多个Kafka集群时可以通过chroot区分,比如host1:port1,host2:port2,host3:port3/chroot1/path1,这样不同的kafka集群数据保存的位置不同
broker.id配置大于0才能启动成功
- 另外有几个关键配置,建议必要时修改
参数 | 作用描述 |
---|---|
log.dirs | 日志保存路径,默认/tmp/kafka-logs。 |
message.max.bytes | 消息大小上限,默认1M左右 |
四、安装部署
- 单机部署,基于Kafka的2.0.0版本,安装包是:kafka_2.11-2.0.0
4.1 准备
- 创建目录
mkdir -p /home/intellif/kafkadata #存放数据日志
4.2 下载安装包
- 下载
下载地址:http://kafka.apache.org/downloads
在线下载:sudo wget https://archive.apache.org/dist/kafka/2.0.0/kafka_2.11-2.0.0.tgz
- 解压
tar -zxvf kafka_2.11-2.0.0.tgz
4.3 修改配置
- server.properties是Kafka的配置文件,在config路径下
vi ./config/server.properties
- 核心配置
zookeeper.connect=localhost:2181
broker.id=0
listeners=PLAINTEXT://192.168.13.53:9092
- PS:单机版修改上面三个参数就可以启动了,但是下面的参数建议修改
log.dirs=/home/intellif/kafkadata ,默认是:/tmp/kafka-logs,重启设备数据就没有了
- PS:安装Zookeeper可以参考:02-zk-单机部署 03-zk-集群部署
4.4 启动、检验和关闭
-
注意下面因为我都在root的权限的文件夹下操作,因此很多命令都带了sudo,如果单独在一个用户权限的路径下,sudo可以不带。
-
启动
启动:进入bin目录,启动kafka:sudo ./kafka-server-start.sh -daemon ../config/server.properties
验证:查看9092端口
- 创建Topic
创建Topic(因为是单点,分区和副本都是1)
./kafka-topics.sh --zookeeper localhost:2181 --create --topic testTopic --partitions 1 --replication-factor 1
- 查看Topic列表
./kafka-topics.sh --zookeeper localhost:2181 --list
- 发送消息到Topic
./kafka-console-producer.sh --broker-list 192.168.13.53:9092 --topic testTopic
- 从Topic消费消息
./kafka-console-consumer.sh --bootstrap-server 192.168.13.53:9092 --topic testTopic --from-beginning
- 示例:
intellif@segment2:/opt/kafka/kafka_2.11-2.0.0/bin$ ./kafka-topics.sh --zookeeper localhost:2181 --create --topic testTopic --partitions 1 --replication-factor 1
Created topic "testTopic".
intellif@segment2:/opt/kafka/kafka_2.11-2.0.0/bin$ ./kafka-topics.sh --zookeeper localhost:2181 --list
testTopic
intellif@segment2:/opt/kafka/kafka_2.11-2.0.0/bin$ ./kafka-console-producer.sh --broker-list 192.168.13.53:9092 --topic testTopic
>aaa
>bbb
>ccc
intellif@segment2:/opt/kafka/kafka_2.11-2.0.0/bin$ ./kafka-console-consumer.sh --bootstrap-server 192.168.13.53:9092 --topic testTopic --from-beginning
aaa
bbb
ccc
- 4.3 关闭
停止:sudo ./kafka-server-stop.sh
4.5 其他
- bin下面有很多Kafka提供的脚本,提供相关的功能,包括各种客户端脚本和测试脚本等。
- kafka内置有zk,但是建议单独部署zk
- 除了命令行中提供的客户端,也可以使用可视化客户端工具kafkatool
- Kafka目录结构,其中bin和config是非常重要的两个目录,平时也是经常使用的。
目录 | 作用 |
---|---|
bin | 存放各种命令脚本 |
config | 存放配置文件 |
libs | 依赖的第三方库 |
logs | Kafka系统日志,部署的时候没有,启动之后会自动创建该文件夹,如果权限不够会启动失败 |
site-docs | 文档 |
LICENSE和NOTICE | 许可和注意事项 |