kafka02-安装kafka
1、安装kafka(单机模式)
1、部署环境
- 软件版本
- JDK:jdk-8u291-linux-x64.tar.gz
- ZooKeeper:apache-zookeeper-3.5.9-bin.tar.gz
- kafka:kafka_2.13-2.8.0.tgz
- 系统环境
- 10.1.1.11:CentOSLinuxrelease7.7.1908(Core)
2、安装JDK
- Kafka和ZooKeeper都是运行在JVM之上的服务,所以需要安装JDK。
- Kafka从2.0.0版本开始就不再支持JDK7及以下版本,因此安装的是JDK8。
1、下载JDK
官网:https://www.oracle.com 下载地址:https://www.oracle.com/java/technologies/downloads/archive/ 安装包:jdk-8u291-linux-x64.tar.gz --下载SE的 下载时需要登录Oracle,获取Oracle的账户:http://bugmenot.com/view/oracle.com
2、安装JDK
]# tar zvfx ./jdk-8u291-linux-x64.tar.gz -C /usr/local/ --解压之后在/usr/local/目录下生成一个名为jdk1.8.0_291的文件夹
3、配置JDK的环境变量
--向/etc/profile文件中添加如下配置 ]# vim /etc/profile export JAVA_HOME=/usr/local/jdk1.8.0_291/ export JRE_HOME=/usr/local/jdk1.8.0_291/jre export PATH=$JAVA_HOME/bin:$JRE_HOME/bin:$PATH export CLASSPATH=::$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar --使配置生效 ]# source /etc/profile
4、验证JDK是否已经安装配置成功
]# java -version --如果安装配置成功,则会正确显示出JDK的版本信息 openjdk version "1.8.0_222-ea" OpenJDK Runtime Environment (build 1.8.0_222-ea-b03) OpenJDK 64-Bit Server VM (build 25.222-b03, mixed mode)
3、安装ZooKeeper(单机)
4、安装kafka
- kafka根据Scala(开发kafka的语言)版本不同,又分为多个版本。只有当您使用Scala,并且希望构建与您使用的Scala版本相同时,这才重要。否则,任何Scala版本都可以工作(推荐2.13版本)。
1、下载kafka
官网:http://kafka.apache.org 下载地址:http://kafka.apache.org/downloads 安装包:kafka_2.13-2.8.0.tgz --2.13为scala版本号,2.8.0为kafka版本号
2、安装kafka
]# tar zvfx ./kafka_2.13-2.8.0.tgz -C /usr/local/ --解压之后在/usr/local/目录下生成一个名为kafka_2.13-2.8.0的文件夹
3、配置kafka的环境变量
--向/etc/profile文件中添加如下配置 ]# vim /etc/profile export KAFKA_HOME=/usr/local/kafka_2.13-2.8.0/ export PATH=$PATH:$KAFKA_HOME/bin --使配置生效 ]# source /etc/profile
4、修改kafka的配置文件
--备份server.properties文件 ]# cp /usr/local/kafka_2.13-2.8.0/config/server.properties{,.bak} --修改server.properties文件 ]# vim /usr/local/kafka_2.13-2.8.0/config/server.properties #broker的编号,如果集群中有多个broker,则每个broker的编号必须唯一,且是个整数。 broker.id=1 #broker对外提供的服务入口地址。如果没有配置,它将获得从java.net.InetAddress.getCanonicalHostName()返回的值。 listeners=PLAINTEXT://0.0.0.0:9092 #代理将向生产者和消费者发布的主机名和端口,不能监听0.0.0.0。如果没有设置,则在配置时使用“listeners”的值。否则,它将使用java.net.InetAddress.getCanonicalHostName()返回的值。 advertised.listeners=PLAINTEXT://10.1.1.11:9092 #存放消息日志文件的地址 log.dirs=/tmp/kafka/log/ #Kafka所需的ZooKeeper集群地址,为了方便演示,我们假设Kafka和ZooKeeper都安装在本机 #包含chroot路径,可以实现多个Kafka集群复用一套ZooKeeper集群:zookeeper.connect=10.1.1.11:2181,10.1.1.12:2181,10.1.1.13:2181/kafka zookeeper.connect=localhost:2181 num.network.threads=3 num.io.threads=8 socket.send.buffer.bytes=102400 socket.receive.buffer.bytes=102400 socket.request.max.bytes=104857600 num.partitions=1 num.recovery.threads.per.data.dir=1 offsets.topic.replication.factor=1 transaction.state.log.replication.factor=1 transaction.state.log.min.isr=1 log.retention.hours=168 log.segment.bytes=1073741824 log.retention.check.interval.ms=300000 zookeeper.connection.timeout.ms=18000 group.initial.rebalance.delay.ms=0 --创建目录 ]# mkdir -p /tmp/kafka/log
5、启动kafka服务
--在前台运行kafka ]# kafka-server-start.sh /usr/local/kafka_2.13-2.8.0/config/server.properties --在后台运行kafka,可以在启动命令中加入-daemon参数或&字符 ]# kafka-server-start.sh -daemon /usr/local/kafka_2.13-2.8.0/config/server.properties ]# kafka-server-start.sh /usr/local/kafka_2.13-2.8.0/config/server.properties & ]# which kafka-server-start.sh /usr/local/kafka_2.13-2.8.0/bin/kafka-server-start.sh
6、kafak集群
- 以上是关于kafka单机模式的安装与配置,一般在生产环境中使用的都是集群模式,集群模式的配置也比较简单,相比单机模式只需要修改一些配置即可。
- broker.id:确保集群中每个broker的broker.id配置参数的值唯一
- listeners:修改为与broker对应的IP地址或域名
- zookeeper.connect:配置ZooKeeper集群的所有机器的IP:PORT
- 注意,在启动Kafka服务之前同样需要确保zookeeper.connect参数所配置的ZooKeeper服务己经正确启动。
2、安装kafka(集群模式)
1、部署环境
- 软件版本
- JDK:jdk-8u291-linux-x64.tar.gz
- ZooKeeper:apache-zookeeper-3.5.9-bin.tar.gz
- kafka:kafka_2.13-2.8.0.tgz
- 系统环境
- 10.1.1.11:CentOSLinuxrelease7.7.1908(Core)
- 10.1.1.12:CentOSLinuxrelease7.7.1908(Core)
- 10.1.1.13:CentOSLinuxrelease7.7.1908(Core)
2、安装JDK
- 在三台机器上分别安装jdk,步骤就不详述了。
3、安装ZooKeeper集群
4、安装kafka集群
- 在三台机器上分别安装kafka,步骤就不详述了。
1、下载kafka
2、安装kafka
3、配置kafka的环境变量
4、修改kafka的配置文件
--备份server.properties文件 ]# cp /usr/local/kafka_2.13-2.8.0/config/server.properties{,.bak} --修改server.properties文件 ]# vim /usr/local/kafka_2.13-2.8.0/config/server.properties #broker的编号,如果集群中有多个broker,则每个broker的编号必须唯一,且是个整数。 --kafka集群中的每个broker的编号唯一(注意,修改此数字) broker.id=1 #broker对外提供的服务入口地址。 listeners=PLAINTEXT://0.0.0.0:9092 #代理将向生产者和消费者发布的主机名和端口,不能监听0.0.0.0。 --监听对应的IP地址(注意,修改此IP) advertised.listeners=PLAINTEXT://10.1.1.11:9092 #存放消息日志文件的地址 log.dirs=/tmp/kafka/log/ #配置ZooKeeper集群的所有机器的IP:PORT --ZooKeeper集群的所有机器 #包含chroot路径,可以实现多个Kafka集群复用一套ZooKeeper集群:zookeeper.connect=10.1.1.11:2181,10.1.1.12:2181,10.1.1.13:2181/kafka zookeeper.connect=10.1.1.11:2181,10.1.1.12:2181,10.1.1.13:2181 num.network.threads=3 num.io.threads=8 socket.send.buffer.bytes=102400 socket.receive.buffer.bytes=102400 socket.request.max.bytes=104857600 num.partitions=1 num.recovery.threads.per.data.dir=1 offsets.topic.replication.factor=1 transaction.state.log.replication.factor=1 transaction.state.log.min.isr=1 log.retention.hours=168 log.segment.bytes=1073741824 log.retention.check.interval.ms=300000 zookeeper.connection.timeout.ms=18000 group.initial.rebalance.delay.ms=0 --创建目录 ]# mkdir -p /tmp/kafka/log
5、启动kafka服务
- 启动kafka之前需要将zookeeper集群正常运行,否则kafka将不能启动。
]# kafka-server-start.sh -daemon /usr/local/kafka_2.13-2.8.0/config/server.properties
3、服务踹参数配置
1、zookeeper.connect
- 该参数指明broker要连接的ZooKeeper集群的服务地址(包含端口号),没有默认值,且此参数为必填项。
- ZooKeeper只有单节点:zookeeper.connect=localhost:2181
- ZooKeeper集群中有多个节点,用逗号将每个节点隔开:zookeeper.connect=localhost1:2181,localhost2:2181,localhost3:2181
- 最佳的实践方式是可以再加一个chroot路径:
- 包含chroot路径:zookeeper.connect=localhost1:2181,localhost2:2181,localhost3:2181/kafka
- 既可以明确指明该chroot路径下的节点是为Kafka所用的,也可以实现多个Kafka集群复用一套ZooKeeper集群,这样可以节省更多的硬件资源。
- 如果不指定chroot,那么默认使用ZooKeeper的根路径。
2、listeners
- 该参数指明broker监听客户端连接的地址列表,即为客户端要连接broker的入口地址列表。
- 配置格式为:listeners=protocol1://hostnamel:portl,protocol2://hostname2:port2
- protocol:协议类型,Kafka当前支持的协议类型有PLAINTEXT、SSL、SASL_SSL等,如果未开启安全认证,则使用简单的PLAINTEXT即可。
- hostname:主机名
- 如果不指定主机名,则表示绑定默认网卡,注意有可能会绑定到127.0.0.1,这样无法对外提供服务,所以主机名最好不要为空。
- 如果主机名是0.0.0.0,则表示绑定所有的网卡。
- port:服务端口。
- 与此参数关联的还有advertised.listeners,作用和listeners类似。
- advertised.listeners主要用于IaaS(Infrastructure as a Service)环境,比如公有云上的机器通常配备有多块网卡,即包含私网网卡和公网网卡。
- advertised.listeners参数绑定公网IP供外部客户端使用。
- listeners参数来绑定私网IP地址供broker间通信使用。
3、broker.id
- broker.id是broker在启动之前必须设定的参数之一。如果没有设置,那么Kafka会自动生成一个。
- 在Kafka集群中,每个broker都有唯一的id(也可以记作brokerId)值来标识自己。
- broker在启动时会在ZooKeeper中的/brokers/ids路径下创建一个以当前brokerId为名称的临时节点,broker的健康状态检查就依赖于此临时节点。当broker下线时,该临时节点会自动删除,其他broker节点或客户端通过判断/brokers/ids路径下是否有此broker的brokerId节点来确定该broker的健康状态。
1、配置broker.id的方式
- (1)通过broker端的配置文件config/server.properties里的broker.id参数来配置brokerId,默认情况下broker.id值为-1,在Kafka中,brokerId值必须大于等于0才有可能正常启动。
- (2)通过broker端的meta.properties(日志根目录中)文件来配置brokerId
- (3)自动生成brokerId。
2、自动生成
- broker.id.generation.enable和reserved.broker.max.id配合生成新的brokerId。
- broker.id.generation.enable参数用来配置是否开启自动生成brokerId的功能,默认情况下为true,即开启此功能。
- reserverd.broker.max.id参数用来配置自动生成brokerId的基准值,默认值为1000。也就是说,默认情况下自动生成的brokerId从1001开始。
- 自动生成的brokerId的原理是先往ZooKeeper中的/brokers/seqid节点中写入一个空字符串,然后获取返回的Stat信息中的version值,进而将version的值和reserved.broker.max.id参数配置的值相加。
- 先往节点中写入数据再获取Stat信息,这样可以确保返回的version值大于0,进而就可以确保生成的brokerId值大于reserved.broker.max.id参数配置的值。
- 符合非自动生成的broker.id的值是[0,reserved.broker.max.id]区间内。
3、broker.id与meta.properties文件的关联
- (1)如果log.dir或log.dirs中配置了多个日志根目录,这些日志根目录中的meta.properties文件所配置的broker.id不一致则会抛出InconsistentbrokerIdException的异常。
- (2)如果config/server.properties配置文件里配置的broker.id的值和meta.properties文件里的broker.id值不一致,那么同样会抛出InconsistentbrokerIdException的异常。
- (3)如果config/server.properties配置文件中并未配置broker.id的值,那么就以meta.properties文件中的broker.id值为准。
- (4)如果没有meta.properties文件,那么在获取合适的broker.id值之后会创建一个新的meta.properties文件并将broker.id值存入其中。
4、log.dir和log.dirs
- Kafka把所有的消息都保存在磁盘上,而这两个参数用来配置Kafka日志文件存放的根目录。
- 一般情况下,log.dir用来配置单个根目录,而log.dirs用来配置多个根目录(以逗号分隔〉,但是Kafka并没有对此做强制性限制,也就是说,log.dir和log.dirs都可以用来配置单个或多个根目录。
- log.dirs的优先级比log.dir高,但是如果没有配置log.dirs,则会以log.dir配置为准。
- 默认情况下只配置了log.dir参数,其默认值为/tmp/kafka-logs。
5、message.max.bytes
- 该参数用来指定broker所能接收消息的最大值,默认值为1000012(B),约等于976.6KB。
- 如果Producer发送的消息大于这个参数所设置的值,那么(Producer)就会报出RecordTooLargeException的异常。
- 如果需要修改这个参数,那么还要考虑max.request.size(客户端参数)、max.message.bytes(topic端参数)等参数的影响。
- 为了避免修改此参数而引起级联的影响,建议在修改此参数之前考虑分拆消息的可行性。
6、bootstrap.servers
- 一般可以简单地理解为将要连接的Kafka集群的broker地址列表。深层次的意义是用来发现Kafka集群元数据信息的服务地址。
- 如果broker端没有显式配置listeners(或advertised.listeners)使用IP地址,那么最好将bootstrap.server配置成主机名而不要使用IP地址,因为Kafka内部使用的是全称域名(Fully Qualified Domain Name) 。如果不统一,则会出现无法获取元数据的异常。
4、简单使用kafka
- 生产者将消息发送至Kafka的主题中,或者更加确切地说应该是主题的分区中,而消费者也是通过订阅主题从而消费消息的。
- Kafka提供了许多实用的脚本工具,存放在$KAFKA_HOME的bin目录下。
- 查看kafka版本
]# find /usr/local/kafka_2.13-2.8.0/libs/ -name \*kafka_\* | head -1 | grep -o '\kafka[^\n]*' kafka_2.13-2.8.0/libs/kafka_2.13-2.8.0.jar --2.13为scala版本,2.8.0为kafka版本
1、创建主题
- 创建一个分区数为4、副本因子为3的主题topic-name1
]# kafka-topics.sh --zookeeper localhost:2181 --create --topic topic-name1 --replication-factor 3 --partitions 4
-
- --zookeeper指定了Kafka所连接的ZooKeeper服务地址
- --create是创建主题的动作指令
- --topic指定了所要创建主题的名称
- --replication-factor指定了副本因子
- --partitions指定了分区个数
- 通过--list列出所有主题
]# kafka-topics.sh --zookeeper localhost:2181 --list
- 通过--describe展示主题的具体信息:
]# kafka-topics.sh --zookeeper localhost:2181 --describe --topic topic-name1
2、生产和消费消息
- 可以使用脚本kafka-console-producer.sh和kafka-console-consumer.sh,通过控制台收发消息。
- 这两个脚本一般用来做一些测试类的工作
- 使用kafka-console-consumer.sh脚本订阅主题topic-name1
]# kafka-console-consumer.sh --bootstrap-server localhost:9092 --topic topic-name1
-
- --bootstrapserver指定连接的Kafka集群地址
- --topic指定消费者订阅的主题
- 开启另一个shell终端,使用kafka-console-producer.sh脚本发送一条消息“hello,kafka!”至主题topic-name1
]# kafka-console-producer.sh --broker-list localhost:9092 --topic topic-name1 >hello,kafka!
-
- --broker-list指定了连接的Kafka集群地址
- --topic 指定了发送消息时的主题