Kafka集群
Kafka集群部署
http://kafka.apache.org/documentation
http://kafka.apachecn.org
实验环境
study62 | study63 | study64 |
---|---|---|
zk | zk | zk |
kafka | kafka | kafka |
jdk安装
每台主机都需要安装,此处以study62主机为例
[root@study62 ~]# mkdir /opt/src
[root@study62 ~]# cd /opt/src
[root@study62 src]# ll
total 190524
-rw-r--r-- 1 root root 195094741 Dec 25 2019 jdk-8u221-linux-x64.tar.gz
[root@study62 src]# mkdir /usr/java
[root@study62 src]# tar xf jdk-8u221-linux-x64.tar.gz -C /usr/java
[root@study62 src]# ln -s /usr/java/jdk1.8.0_221 /usr/java/jdk
[root@study62 src]# vi /etc/profile
export JAVA_HOME=/usr/java/jdk
export PATH=$JAVA_HOME/bin:$JAVA_HOME/bin:$PATH
export CLASSPATH=$CLASSPATH:$JAVA_HOME/lib:$JAVA_HOME/lib/tools.jar
[root@study62 src]# source /etc/profile
[root@study62 src]# java -version
java version "1.8.0_221"
Java(TM) SE Runtime Environment (build 1.8.0_221-b11)
Java HotSpot(TM) 64-Bit Server VM (build 25.221-b11, mixed mode)
zookeeper安装部署
每台主机都需要安装,此处以study62主机为例
zk下载地址
[root@study62 src]# wget http://mirrors.tuna.tsinghua.edu.cn/apache/zookeeper/zookeeper-3.4.14/zookeeper-3.4.14.tar.gz
解压zookeeper并创建数据日志存放目录
[root@study62 src]# tar xf zookeeper-3.4.14.tar.gz -C /opt/
[root@study62 src]# ln -s /opt/zookeeper-3.4.14 /opt/zookeeper
[root@study62 src]# mkdir -pv /data/zookeeper/data /data/zookeeper/logs
mkdir: created directory ‘/data’
mkdir: created directory ‘/data/zookeeper’
mkdir: created directory ‘/data/zookeeper/data’
mkdir: created directory ‘/data/zookeeper/logs’
修改配置文件zoo.cfg
[root@study62 src]# cd /opt/zookeeper
[root@study62 zookeeper]# vi /opt/zookeeper/conf/zoo.cfg
tickTime=2000
initLimit=10
syncLimit=5
dataDir=/data/zookeeper/data
dataLogDir=/data/zookeeper/logs
clientPort=2181
server.0=10.0.0.62:2888:3888
server.1=10.0.0.63:2888:3888
server.2=10.0.0.64:2888:3888
①、tickTime:基本事件单元,这个时间是作为Zookeeper服务器之间或客户端与服务器之间维持心跳的时间间隔,每隔tickTime时间就会发送一个心跳;最小 的session过期时间为2倍tickTime
②、dataDir:存储内存中数据库快照的位置,除非另有说明,否则指向数据库更新的事务日志。注意:应该谨慎的选择日志存放的位置,使用专用的日志存储设备能够大大提高系统的性能,如果将日志存储在比较繁忙的存储设备上,那么将会很大程度上影像系统性能。
③、client:监听客户端连接的端口。
④、initLimit:允许follower连接并同步到Leader的初始化连接时间,以tickTime为单位。当初始化连接时间超过该值,则表示连接失败。
⑤、syncLimit:表示Leader与Follower之间发送消息时,请求和应答时间长度。如果follower在设置时间内不能与leader通信,那么此follower将会被丢弃。
⑥、server.A=B:C:D
A:其中 A 是一个数字,表示这个是服务器的编号;
B:是这个服务器的 ip 地址或域名(生产尽量使用域名)或主机名;
C:Leader选举的端口;
D:Zookeeper服务器之间的通信端口。
我们需要修改的第一个是 dataDir ,在指定的位置处创建好目录。
第二个需要新增的是 server.A=B:C:D 配置,其中 A 对应下面我们即将介绍的myid 文件。B是集群的各个IP地址,C:D 是端口配置。
创建myid文件
[root@study62 src]# vi /data/zookeeper/data/myid
0
[root@study63 src]# vi /data/zookeeper/data/myid
1
[root@study64 src]# vi /data/zookeeper/data/myid
2
配置环境变量
[root@study62 zookeeper]# vi /etc/profile
#set zookeeper environment
export ZK_HOME=/opt/zookeeper
export PATH=$PATH:$ZK_HOME/bin
[root@study62 zookeeper]# source /etc/profile
启动zookeeper服务
- 启动命令
[root@study62 ~]# zkServer.sh start
ZooKeeper JMX enabled by default
Using config: /opt/zookeeper/bin/../conf/zoo.cfg
Starting zookeeper ... STARTED
- 停止命令
[root@study62 ~]# zkServer.sh stop
ZooKeeper JMX enabled by default
Using config: /opt/zookeeper/bin/../conf/zoo.cfg
Stopping zookeeper ... STOPPED
- 重启命令
[root@study62 ~]# zkServer.sh restart
ZooKeeper JMX enabled by default
Using config: /opt/zookeeper/bin/../conf/zoo.cfg
ZooKeeper JMX enabled by default
Using config: /opt/zookeeper/bin/../conf/zoo.cfg
Stopping zookeeper ... STOPPED
ZooKeeper JMX enabled by default
Using config: /opt/zookeeper/bin/../conf/zoo.cfg
Starting zookeeper ... STARTED
- 查看集群状态命令
[root@study62 ~]# zkServer.sh status
ZooKeeper JMX enabled by default
Using config: /opt/zookeeper/bin/../conf/zoo.cfg
Mode: follower
[root@study63 ~]# zkServer.sh status
ZooKeeper JMX enabled by default
Using config: /opt/zookeeper/bin/../conf/zoo.cfg
Mode: leader
[root@study64 ~]# zkServer.sh status
ZooKeeper JMX enabled by default
Using config: /opt/zookeeper/bin/../conf/zoo.cfg
Mode: follower
三台机器,study63 成功的通过了选举称为了leader,而剩下的两台成为了 follower。这时候,如果你将study63关掉,会发现剩下两台又会有一台变成了 leader节点。
Kafka集群安装部署
kafka下载
[root@study62 src]# wget http://mirrors.tuna.tsinghua.edu.cn/apache/kafka/2.4.0/kafka_2.13-2.4.0.tgz
安装
[root@study62 src]# tar xf kafka_2.13-2.4.0.tgz -C /opt/
[root@study62 src]# ln -s /opt/kafka_2.13-2.4.0 /opt/kafka
[root@study64 src]# ll /opt/kafka/
total 56
drwxr-xr-x 3 root root 4096 Dec 10 2019 bin
drwxr-xr-x 2 root root 4096 Dec 10 2019 config
drwxr-xr-x 2 root root 8192 Dec 9 19:23 libs
-rw-r--r-- 1 root root 32216 Dec 10 2019 LICENSE
-rw-r--r-- 1 root root 337 Dec 10 2019 NOTICE
drwxr-xr-x 2 root root 44 Dec 10 2019 site-docs
配置
broker.id=0
[root@study62 ~]# cd /opt/kafka
[root@study62 kafka]# mkdir -p /data/kafka/logs
[root@study62 kafka]# [root@study62 kafka]# vi /opt/kafka/config/server.properties
log.dirs=/data/kafka/logs
zookeeper.connect=10.0.0.62:2181,10.0.0.63:2181,10.0.0.64:2181
log.flush.interval.messages=10000
log.flush.interval.ms=1000
delete.topic.enable=true
host.name=study62
broker.id=1
[root@study63 ~]# cd /opt/kafka
[root@study63 kafka]# mkdir -p /data/kafka/logs
[root@study63 kafka]# [root@study62 kafka]# vi /opt/kafka/config/server.properties
log.dirs=/data/kafka/logs
zookeeper.connect=10.0.0.62:2181,10.0.0.63:2181,10.0.0.64:2181
log.flush.interval.messages=10000
log.flush.interval.ms=1000
delete.topic.enable=true
host.name=study63
broker.id=2
[root@study64 ~]# cd /opt/kafka
[root@study64 kafka]# mkdir -p /data/kafka/logs
[root@study64 kafka]# [root@study62 kafka]# vi /opt/kafka/config/server.properties
log.dirs=/data/kafka/logs
zookeeper.connect=10.0.0.62:2181,10.0.0.63:2181,10.0.0.64:2181
log.flush.interval.messages=10000
log.flush.interval.ms=1000
delete.topic.enable=true
host.name=study64
启动集群
[root@study62 kafka]# bin/kafka-server-start.sh -daemon config/server.properties
[root@study63 kafka]# bin/kafka-server-start.sh -daemon config/server.properties
[root@study64 kafka]# bin/kafka-server-start.sh -daemon config/server.properties
关闭集群
[root@study62 kafka]# bin/kafka-server-stop.sh stop
[root@study63 kafka]# bin/kafka-server-stop.sh stop
[root@study64 kafka]# bin/kafka-server-stop.sh stop
验证检查
[root@study62 kafka]# ps aux | grep kafka
[root@study62 kafka]# netstat -luntp | grep 9092
tcp6 0 0 10.0.0.62:9092 :::* LISTEN 11115/java
查看当前jps
[root@study62 kafka]# jps -l
8802 org.apache.zookeeper.server.quorum.QuorumPeerMain
11282 sun.tools.jps.Jps
11115 kafka.Kafka
常用命令
创建一个topic
# 创建一个名为first的topic,它由两个分区和两个副本
[root@study62 kafka]# bin/kafka-topics.sh --create --zookeeper study62:2181 --partitions 2 --replication-factor 2 --topic first
Created topic first.
查看topic
[root@study62 kafka]# bin/kafka-topics.sh --list --zookeeper study62:2181
first
启动一个producer发送一些消息
[root@study62 kafka]# bin/kafka-console-producer.sh --broker-list study62:9092 --topic first
> This is a message
> This is another message
启动一个 consumer
[root@study63 kafka]# bin/kafka-console-consumer.sh --bootstrap-server study62:9092 --topic first --from-beginning
This is a message
This is another message
topic列表
[root@study64 kafka]# bin/kafka-topics.sh --list --zookeeper study62:2181
__consumer_offsets
first
查看topic详情
[root@study64 kafka]# bin/kafka-topics.sh --zookeeper study62:2181 --describe --topic first
Topic: first PartitionCount: 2 ReplicationFactor: 2 Configs:
Topic: first Partition: 0 Leader: 0 Replicas: 0,1 Isr: 0,1
Topic: first Partition: 1 Leader: 1 Replicas: 1,2 Isr: 1,2
删除topic
[root@study62 kafka]# bin/kafka-topics.sh --zookeeper study62 --delete --topic first
Topic first is marked for deletion.
Note: This will have no impact if delete.topic.enable is not set to true.
创建不同选项的topic
[root@study62 kafka]# bin/kafka-topics.sh --create --zookeeper study62:2181 --partitions 1 --replication-factor 3 --topic first
Created topic first.
[root@study62 kafka]# ll /data/kafka/logs/
drwxr-xr-x 2 root root 141 Dec 10 13:00 first-0
kafka消费者组
[root@study63 kafka]# bin/kafka-console-consumer.sh --bootstrap-server study62:9092 --topic first --consumer-property group.id=test
附kafka配置文件详解
broker.id=0 #当前机器在集群中的唯一标识,和zookeeper的myid性质一样
port=9092 #当前kafka对外提供服务的端口默认是9092
num.network.threads=3 #这个是borker进行网络处理的线程数
num.io.threads=8 #这个是borker进行I/O处理的线程数
log.dirs=/opt/kafka/kafkalogs/ #消息存放的目录,这个目录可以配置为“,”逗号分割的表达式,上面的num.io.threads要大于这个目录的个数这个目录,如果配置多个目录,新创建的topic他把消息持久化的地方是,当前以逗号分割的目录中,那个分区数最少就放那一个
socket.send.buffer.bytes=102400 #发送缓冲区buffer大小,数据不是一下子就发送的,先回存储到缓冲区了到达一定的大小后在发送,能提高性能
socket.receive.buffer.bytes=102400 #kafka接收缓冲区大小,当数据到达一定大小后在序列化到磁盘
socket.request.max.bytes=104857600 #这个参数是向kafka请求消息或者向kafka发送消息的请请求的最大数,这个值不能超过java的堆栈大小
num.partitions=1 #默认的分区数,一个topic默认1个分区数
log.retention.hours=168 #默认消息的最大持久化时间,168小时,7天
message.max.byte=5242880 #消息保存的最大值5M
default.replication.factor=2 #kafka保存消息的副本数,如果一个副本失效了,另一个还可以继续提供服务
replica.fetch.max.bytes=5242880 #取消息的最大直接数
log.segment.bytes=1073741824 #这个参数是:因为kafka的消息是以追加的形式落地到文件,当超过这个值的时候,kafka会新起一个文件
log.retention.check.interval.ms=300000 #每隔300000毫秒去检查上面配置的log失效时间(log.retention.hours=168 ),到目录查看是否有过期的消息如果有,删除
log.cleaner.enable=false #是否启用log压缩,一般不用启用,启用的话可以提高性能
zookeeper.connect=localhost:12181#设置zookeeper的连接端口