本篇主要讲Linux下的Kafka环境搭建步骤,不是基于docker容器安装,搭建测试的环境包括CentOS7.7、Unbuntu18.08,其中有涉及引用其他博客网上资料,若有不妥之处,请私信处理。
首先 简要介绍一下Kafka:一种高吞吐量的分布式发布订阅消息系统,java开发的mq中间件,通过磁盘I0进行消息的持久化,每秒可以支持百万级的消息吞吐量,支持集群拓展、使用主从节点协调机制具有高容错性。其使用场景如:运行服务产生的日志、网站浏览监控分析、运营监控数据指标,大数据的流处理平台构建等。
Kafka的角色包括broker、toptic、partition、offset、producer、consumer、consumer group:broker表示一个运行Kafka的服务器节点;toptic是表示消息的种类的逻辑概念;partition是消息存储的物理概念,一个partition对应磁盘上的一个log文件,一个toptic分成多个partition存储分区,分布在多个broker上;producer是消息的生产者,可指定发布的topic和parition;offset是长整型,唯一标识每一条消息追加存储到partition的log文件的偏移量;consumer是消费者,对生产者产生的消息进行消费,consumer group是消费者组,每一个consumer都隶属于一个consumer,如果不指定则为默认,消息会发送给每个consumer group(消息广播),但是同一个consumer group内部的consumers只能基于负载均衡消费消息,每个consumer消费的消息不重复(消息单播)。如下为详细的架构图示:
切入正题,Kafka的环境部署,由于Kafka是基于java语言开发的,因此需要JDK支持,同时依赖zookeeper注册进行节点管理,此外还有Kafka的下载,下面为下载链接:
JDK:Java SE Development Kit 8 - Downloads
zookeeper:zookeeper
kafka:kafka
安装流程是JDK->zookeeper->kafka,关于JDK的安装配置这里就不多说明了,网上资料搜索对于涉及过java的来说是比较简单的,接下来说说zookeeper和kafka:
对于zookeeper:
1.下载安装包之后使用linux的解压tar命令解压,如tar -zxvf apache-zookeeper-3.5.5-bin.tar.gz;
2.解压之后cd进入目录 cd apache-zookeeper-3.5.5-bin/config;
3.重命名zoo_sample.cfg文件:mv zoo_sample.cfg zoo.cfg;
对于kafka:
1.解压:tar -xzf kafka_2.12-2.3.0.tgz;
2.进入kafka目录:cd kafka_2.12-2.3.0/
完成以上流程只是进行下面的安装包进行解压和文件命名而已,后续配置,基于不同的模式需要进行不同的配置,对于解压后的zookeeper和kafka,配置中涉及两个修改项的目录,zookeeper解压后的子目录bin和conf,bin存放启动的程序,conf目录下的zoo.cfg存放配置参数,同理,kafka解压后的子目录bin也是存成启动程序,config文件夹下的server.properties存放配置参数,部署模式分成根据节点的个数分为集群和单机两种,根据通讯网络分为内网和外网,如下:
(一)集群部署
以三个节点为例,则需要部署三个zookeeper和kafka在三个不同的机器上运行,每一个节点如下:
1.zoo.cfg存放参数配置信息,编辑zookeeper的conf目录下的zoo.cfg文件夹:vi zoo.cfg,可修改或者新增如下参数:
initLimit=10 #集群中leader服务器与follower服务器第一次连接最多次数(可修改)
syncLimit=5 # leader 与 follower 之间发送和应答时间,如果该follower 在设置的时间内不能与leader 进行通信,那么此 follower 将被视为不可用。(可修改)
dataDir=/usr/local/zookeeper-3.4.6/data #自定义的zookeeper保存数据的目录(可修改)
clientPort=2181 #客户端连接 Zookeeper 服务器的端口,Zookeeper 会监听这个端口,接受客户端的访问请求,(可修改)
server.1=192.168.200.14:2888:38888#服务器编号=服务器IP:LF数据同步端口:LF选举端口(新增)
server.2=192.168.200.10:2888:3888(新增)
server.3=192.168.200.11:2888:3888(新增)
# 其中server配置对于集群中对应多少个节点就配置多少个,IP填写对应的服务器IP,两个端口一般为以上默认端口
2.配置zookeeper集群节点的ID:在每一个节点的zookeeper下的conf目录的同一级目录新建一个data文件夹,新建一个myid文件,写入节点的ID编号,如 执行 echo“1”>>/usr/local/apache-zookeeper-3.5.5-bin/data/myid ,表示将1写入zookeeper下的data目录下的myid文件,注意此ID不能重复,而且需要与上一点中的server编号进行一一对应,每一个节点都需创建此文件,写入该节点的ID编号;
3.修改每个节点的kafka解压目录下的config目录下的server.properties文件,修改或新增如下:
broker.id=1 # 指定节点的ID号,不同节点ID必须不同,同时与zookeeper中国的myid文件中的ID对应
listeners=PLAINTEXT://192.168.200.14:9092 # 监听的ip和端口
zookeeper.connect=192.168.200.14:2181,192.168.200.10:2181,192.168.200.11:2181 #对于集群每个节点的和端口的集合描述符。
(二)单机部署
1.修改单机的kafka解压目录下的config目录下的server.properties文件,修改或新增如下:
listeners=PLAINTEXT://192.168.200.14:9092 # 监听的ip和端口
zookeeper.connect=192.168.200.14:2181 #对于单机IP和端口的描述符。
(三)内网通讯
对于生产和消费连接kafka在本机运行通讯,只需要确认kafka解压目录下的config目录下的server.properties文件中: listeners=PLAINTEXT://192.168.200.14:9092 # 监听的ip和端口 ,此ip配置为该节点机器的本地ip,比如locahost表示本机,
如果生产和消费者连接kafka是在内网运行通讯,则该ip修改为主机名(可自定义,比如kafkahost),配置为listeners=PLAINTEXT://kafkahost:9092,然后编辑/etc/hosts文件,新增 比如:192.168.200.14 kafkahost ,建立内网IP和主机名的映射关系。
(四)外网通讯
对于生产者和消费者连接kafka在外网通讯,如果该节点机器已配置外网IP,则在kafka解压目录下的config目录下的server.properties文件中修改listeners配置,新增advertised.listeners设置,如下:
#当告诉服务器监听了 0.0.0.0,意味着监听每一个可用的网络接口
listeners=PLAINTEXT://0.0.0.0:9092
#该配置是提供给消费者和生产者的,如果没有配置,则默认将listeners的值给消费者和生产者 ,此IP为外网IP
advertised.listeners=PLAINTEXT://59.69.101.206:9092
对于生产者连接kafka所在的节点的机器为内网IP,需要通过IP和端口映射才能访问到的,推荐使用主机名替换listeners中的IP,如:
listeners=PLAINTEXT://hostname:9092
advertised.listeners=PLAINTEXT://hostname:9092
命令生产和消费时也用主机名代替真实IP,不过是客户端机器的/etc/hosts配置hostname映射成内网IP,外网客户端配成映射外网IP。
(五)服务启动
开启zookeeper命令(备注:先进入zookeeper的bin目录)
./zkServer.sh start
关闭zookeeper命令(备注:先进入zookeeper的bin目录)
./zkServer.sh stop
查看zookeeper的启动状态(备注:先进入zookeeper的bin目录)
./zkServer.sh status
Kafka启动命令(备注:先进入kafka目录)
常规模式启动kafka
bin/kafka-server-start.sh config/server.properties
进程守护模式启动kafka
nohup bin/kafka-server-start.sh config/server.properties >/dev/null 2>&1 &
Kafka关闭命令(备注:先进入kafka目录)
bin/kafka-server-stop.sh
启动成功可查看kafka进程
ps -ef|grep kafka
(六)测试
1.zookeeper测试:
对于单节点使用上述查询zookeeper状态便可以,对于多节点的zookeeper测试,比如zookeeper解压在/usr/local/目录下:
在任意节点上执行如下,创建topic为test1,发送hello成功,注意IP为该节点机器的IP和端口:
/usr/local/apache-zookeeper-3.5.5-bin/bin/zkCli.sh -server 192.168.200.10:2181 create /test1 "hello"
在其他节点上获取topic为test1的消息,输入如下命令显示收到hello,注意IP为该节点机器的IP和端口:
/usr/local/apache-zookeeper-3.5.5-bin/bin/zkCli.sh -server 192.168.200.11:2181
2.kafka测试:
创建话题"test":
bin/kafka-topics.sh --create --bootstrap-server localhost:9092 --replication-factor 1 --partitions 1 --topic test
列出话题列表,可以查看创建的话题:
bin/kafka-topics.sh --list --bootstrap-server localhost:9092
发送信息:
bin/kafka-console-producer.sh --broker-list localhost:9092 --topic test
启动消费者,可以看到收到了刚才生产者发送的消息:
bin/kafka-console-consumer.sh --bootstrap-server localhost:9092 --topic test --from-beginning
以上命令是用连接的kafka为本机单节点为例,命令参数为locahost:9092,如果为集群也可以改为如下某个 集群配置192.168.200.14:2181,192.168.200.10:2181,192.168.200.11:2181 。