Kafka学习记录--1.简介与单机安装
关于Kafka,到目前(2019.1.9)为止,已经是比较成熟的一个消息中间件了,不需要太多的解释,Kafka本身的高性能和可靠性,在这里我就不多说了,这个系列的几篇文章,我将记录Kafka的安装,集群配置,还有一些语言的API使用(主要是Java和Python),当然在实际环境中的部署以及一些坑,会顺便说一说解决方案。
文章目录
1.Kafka的安装
环境准备:
- CentOS 7.5
- Kafka ( 2.1.0 )
首先要说明一点,Kafka本身是使用到Zookeeper作为其分布式管理中心的,我们知道,Zookeeper是Apache旗下的一个非常好用的分布式管理工具,当然本身它也提供了Java的API,不了解Zookeeper的朋友可以先去了解一下Zookeeper的使用。
当然,在Kafka的源码安装包里,提供了Zookeeper的包,这样可以更快捷的启动Kafka。
1.1 下载Kafka安装包
下载地址:(注意选择合适的版本)
http://kafka.apache.org/downloads
这里是Kafka官方网站的下载地址,我们选择下载二进制安装包:
下载解压安装包,不做过多说明:
# 这个下载源在国内速度比较快
wget http://mirror.bit.edu.cn/apache/kafka/2.1.0/kafka_2.12-2.1.0.tgz
tar -zxvf kafka_2.12-2.1.0.tgz
这时我们就得到了解压完成的Kafka安装包,下面是目录结构:
- bin :Kafka相关的启动脚本,以及客户端脚本
- config:Kafka以及相关的配置文件(zk和log4j等)
- libs:Kafka以及相关组件的jar包
这里要说明一点,Kafka的二进制安装包内,是内置了Zookeeper以及其配置文件的,当然在实际环境中可能要使用到Zookeeper集群,ZK集群是不在本机上搭建的,在这里我们先使用单机安装的方式来安装Kafka,所以直接可以使用其中内置的Zookeeper,使用本机作为Zookeeper服务器。
1.2 启动Zookeeper
首先我们进入bin
目录下:
可以看到,其中包括Zookeeper启动,关闭脚本,以及客户端脚本。
当然,这里的Zookeeper脚本和我们单独安装Zookeeper的脚本是不一样的,因为这是Kafka内置的Zookeeper,所以功能更少。
./zookeeper-server-start.sh -daemon ../config/zookeeper.properties
启动zookeeper服务器,-deamon
是让zk服务器使用守护进程模式启动,然后指定其配置文件路径,../config/zookeeper.properties
,这里Kafka的config文件夹下有默认的配置文件,也是以单机模式启动的zk。
启动完成以后,我们可以查看一下其启动情况,可以直接ps
查看进程,或者ss
查看端口(默认2181)
# 直接查看进程
ps -ef|grep zookeeper
# 查看端口
ss -anp|grep 2181
当然,我们也可以使用zk客户端,连接到本机的zookeeper服务器。
# 这是Kafka自带的zk客户端,指定ip:port,连接到指定的zk服务器
./zookeeper-shell.sh localhost:2181
成功连接到本机zookeeper服务器。
这里有一个小问题,如果Jline不存在的话,可能客户端shell会很难看,解决方式就是把Jline包放到libs目录下。我是用的是jline-0.9.94.jar
1.3 启动kafka服务器
Kafka安装包内为我们提供了默认的配置文件,在config
目录下:
这个默认配置文件,是单机启动Kafka服务器的配置文件,默认的端口是9092,同时默认连接到本机Zookeeper服务器。
我们可以直接使用这个配置文件启动Kafka。
./kafka-server-start.sh -daemon ../config/server.properties
守护进程模式,启动kafka,使用了默认的配置文件。
启动完成以后,我们可以直接看一下kafka的启动情况:(查看进程或者端口都可以)
1.4 测试发布消息到主题
PS: 在这里,我们不涉及到多个分区(Partition)的话题(Topic)操作,相当于我们在某个话题下只有一个分区,当然因为是单机部署Kafka,我们能使用到的副本也是默认为1。
我们知道,kafka本质上是一个消息队列,作为消息队列,其本质功能就是接收、存储、发送消息。
1.4.1 创建一个主题
首先我们创建一个自己的话题(Topic):
# 这里指定了话题分区1个,复制因子为1
./kafka-topics.sh --zookeeper localhost:2181 --create --partitions 1 --replication-factor 1 --topic CringKong
这样我们就创建了一个自己的话题(Topic)。PS:如果不知道什么是Topic请先学习消息队列常见的两种模式
这里有几个参数,暂时不解释什么意思,涉及到Kafka的一些特性。
# 查看已经存在的话题
./kafka-topics.sh --zookeeper localhost:2181 --list
可以看到我们已经成功新建了一个名为CringKong的话题。
1.4.2 使用生产者脚本发送消息到特定主题
接下来我们使用生产者脚本发送消息到Kafka中特定的主题(Topic)
# 这里我们制定Topic为CringKong
./kafka-console-producer.sh --broker-list localhost:9092 -topic CringKong
这个脚本可以让我们连接到特定ip:port
的kafka服务器,然后指定主题(Topic),这里我们指定到之前已经创建的主题CrIngKong。
这时我们已经可以向特地的主题发送消息!
我们先随便向这个主题发送两条消息。
1.4.3 使用消费者脚本获得消息
这时我们需要新打开一个shell,也就是相当于打开了另一台电脑,我们运行消费者脚本:
# 监听特定的kafka主题
./kafka-console-consumer.sh --bootstrap-server localhost:9092 --from-beginning -topic CringKong
这里我们使用到了--from-beginning
参数,可以获得这个主题从建立以来接收到的全部消息!
此时我们在生产者脚本发送两条新消息:
可以看到消费者脚本实时接收到了这两条消息。
当然在这里说实时接收,好像有点同步的味道,但实际上Kafka是异步推送的手段实现的,至于消息幂等和消息落地的实现,这就是Kafka内部设计实现的了。我们只需要知道,Kafka是一种高性能而且高稳定性的消息队列,可以熟练使用就可以了。