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 指定了发送消息时的主题
posted @ 2021-10-05 09:00  麦恒  阅读(42)  评论(0编辑  收藏  举报