kakfa集群配置

http://www.cnblogs.com/yinchengzhe/p/5123515.html kafka监控

https://blog.csdn.net/syc001/article/details/78633190 监控

http://kafka.apache.org/downloads.html kafka下载,最新的稳定版为2.1.1

https://www.apache.org/dyn/closer.cgi/zookeeper/ zookeeper官网下载,最新的稳定版为3.4.12

http://archive.apache.org/dist/zookeeper/ 历史版本

环境说明:
Zookeeper集群的工作是超过半数才能对外提供服务,3台中超过两台超过半数,允许1台挂掉,是否可以用偶数,其实没必要。如果有四台那么挂掉一台还剩下三台服务器,如果在挂掉一个就不行了,这里记住是超过半数

zook1:192.168.7.81
zook2: 192.168.9.53
zook3 192.168.4.21

一 安装jdk

解压:tar zxvf jdk-8u60-linux-i586.tar.gz
    移动 :  sudo  mv jdk1.8.0_60  /usr/local/jdk
  sudo  vim /etc/profile.d/java.sh加入这几行
JAVA_HOME=/usr/local/jdk
JAVA_BIN=/usr/local/jdk/bin
JRE_HOME=/usr/local/jdk/jre
PATH=$PATH:/usr/local/jdk/bin:/usr/local/jdk/jre/bin
CLASSPATH=/usr/local/jdk/jre/lib:/usr/local/jdk/lib:/usr/local/jdk/jre/lib/charsets.jar


初始化  source  /etc/profile.d/java.sh

最后运行:java -version 会出来版本信息

二 安装zookeeper

2.1 目录定义

#我的目录统一放在/home/yx/server/zookeeper下面
#首先创建Zookeeper项目目录

mkdir zkdata #存放快照日志
mkdir zkdatalog#存放事物日志

2.2 解压 zookeeper并更改配置文件

zoo_sample.cfg这个文件是官方给我们的zookeeper的样板文件。我们需要复制一份名为zoo.cfg的文件,zoo.cfg是zookeeper官方指定的文件命名规则。我们以在第一台虚拟机上的操作为例(上面的操作都是在第一台虚拟机上,你需要在每台虚拟机上都执行上述以及本次操作):

yx@zook-1:~/server/zookeeper/conf$ grep -v '^#' zoo.cfg 
tickTime=2000
initLimit=10
syncLimit=5
dataDir=/home/yx/server/zk/zkdata
dataLogDir=/home/yx/server/zk/zklog

clientPort=2181
server.1=192.168.2.71:12888:13888
server.2=192.168.2.72:12888:13888
server.3=192.168.2.73:12888:13888

配置文件解释

\#server.1
这个1是服务器的标识也可以是其他的数字, 表示这个是第几号服务器,用来标识服务器,这个标识要写到快照目录下面myid文件里
\#192.168.7.81为集群里的IP地址,第一个端口是master和slave之间的通信端口,默认是2888,第二个端口是leader选举的端口,集群刚启动的时候选举或者leader挂掉之后进行新的选举的端口默认是3888

\#tickTime:
这个时间是作为 Zookeeper 服务器之间或客户端与服务器之间维持心跳的时间间隔,也就是每个 tickTime 时间就会发送一个心跳。

\#initLimit:

这个配置项是用来配置 Zookeeper 接受客户端(这里所说的客户端不是用户连接 Zookeeper 服务器的客户端,而是 Zookeeper 服务器集群中连接到 Leader 的 Follower 服务器)初始化连接时最长能忍受多少个心跳时间间隔数。当已经超过 5个心跳的时间(也就是 tickTime)长度后 Zookeeper 服务器还没有收到客户端的返回信息,那么表明这个客户端连接失败。总的时间长度就是 5\*2000=10 秒

\#syncLimit:

这个配置项标识 Leader 与Follower 之间发送消息,请求和应答时间长度,最长不能超过多少个 tickTime 的时间长度,总的时间长度就是5\*2000=10秒

\#dataDir:

快照日志的存储路径
\#dataLogDir:
事物日志的存储路径,如果不配置这个那么事物日志会默认存储到dataDir制定的目录,这样会严重影响zk的性能,当zk吞吐量较大的时候,产生的事物日志、快照日志太多

\#clientPort:

这个端口就是客户端连接 Zookeeper 服务器的端口,Zookeeper 会监听这个端口,接受客户端的访问请求。修改他的端口改大点

2.3 创建myid文件

在每台机器上面要都创建这个,写上自己对应的id
创建myid文件。以现在所在的第一台虚拟机192.168.172.10为例,对应server.1,通过上边的配置信息可以查到。创建myid文件的目的是为了让zookeeper知道自己在哪台服务器上,例如现在所在的虚拟机是192.168.172.10,它对应的id是1,那么就在myid文件中写入1.

第一台:

echo "1" > /home/yx/server/zk/zkdata/myid

第二台

echo "2" > /home/yx/server/zk/zkdata/myid

第三台

echo "3" > /home/yx/server/zk/zkdata/myid

2.4 三台服务器都启动服务

/home/yx/server/zookeeper/bin/zkServer.sh  start  # 启动

/home/yx/server/zookeeper/bin/zkServer.sh  status # 查看状态,三个服务器必须都启动起来,才可以查看状态
ZooKeeper JMX enabled by default
Using config: /home/yx/server/zookeeper/bin/../conf/zoo.cfg
Mode: follower  # 从

启动遇到的错误:
Error contacting service. It is probably not running.
解决办法,去查看bin目录下面的zookeeper.out

/home/yx/server/zookeeper/bin/zkServer.sh stop  # 停止

ZooKeeper JMX enabled by default
Using config: /home/yx/server/zookeeper/bin/../conf/zoo.cfg
Stopping zookeeper ... STOPPED

2.5 查看运行状态

可以用“jps”查看zk的进程,这个是zk的整个工程的main


yx@zook-2:~/server/zookeeper/bin$ jps
9190 QuorumPeerMain
9559 Jps

2.6 登陆zookeeper

/home/yx/server/zookeeper/bin/zkCli.sh -server 192.168.2.250:2181

2.7  更改zookeeper日志路径

https://blog.csdn.net/dehu_zhou/article/details/81939965
vim zkEnv.sh  56行
ZOO_LOG_DIR="/home/yx/server/zookeeper/zkdatalog"

然后重启zookeeper,zookeeper.out就默认存到这个目录里面了

三 kafka安装

http://kafka.apache.org/documentation/#configuration 配置文件详解

https://www.cnblogs.com/doubletree/p/4264969.html 处理大消息

3.1 下载解压

http://kafka.apache.org/downloads

3.2 更改配置文件

mkdir -p /home/yx/server/kafka/kafka-logs
yx@zook-1:~/server/kafka/bin$ grep -v "^#" ../config/server.properties |grep -v "^$"
broker.id=1
listeners=PLAINTEXT://192.168.2.71:9092
advertised.listeners=PLAINTEXT://192.168.2.71:9092
num.network.threads=3
num.io.threads=8
socket.send.buffer.bytes=102400
socket.receive.buffer.bytes=102400
socket.request.max.bytes=104857600
log.dirs=/home/yx/server/kafka/kafka-logs  # 这个是数据目录,并不是日志目录
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.connect=192.168.2.250:2181,192.168.2.71:2181,192.168.2.72:2181,192.168.2.73:2181
zookeeper.connection.timeout.ms=6000
group.initial.rebalance.delay.ms=0
message.max.bytess=5242880 
default.replication.factor=2 
replica.fetch.max.bytes=5242880 
delete.topic.enable=true

##############################################默认的配置文件

broker.id=0
num.network.threads=3
num.io.threads=8
socket.send.buffer.bytes=102400
socket.receive.buffer.bytes=102400
socket.request.max.bytes=104857600
log.dirs=/tmp/kafka-logs
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.connect=localhost:2181
zookeeper.connection.timeout.ms=6000
group.initial.rebalance.delay.ms=0

###################################################和lvs集群结合配置

broker.id=2
listeners=PLAINTEXT://192.168.2.73:9092,CLIENT2://192.168.2.250:9093
listener.security.protocol.map=PLAINTEXT:PLAINTEXT,CLIENT2:PLAINTEXT
num.network.threads=3
num.io.threads=8
socket.send.buffer.bytes=102400
socket.receive.buffer.bytes=102400
socket.request.max.bytes=104857600
log.dirs=/home/yx/server/kafka/kafka-logs
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.connect=192.168.2.250:2181 #  2.250是vip
zookeeper.connection.timeout.ms=6000
group.initial.rebalance.delay.ms=0
message.max.bytes=5242880 
default.replication.factor=2 
replica.fetch.max.bytes=5242880

##########################老版本配置文件

broker.id=1
listeners=PLAINTEXT://192.168.2.228:19092
advertised.listeners=PLAINTEXT://192.168.2.228:19092
num.network.threads=3
num.io.threads=8
socket.send.buffer.bytes=102400
socket.receive.buffer.bytes=102400
socket.request.max.bytes=104857600
log.dirs=/home/yx/server/kafka2/kafka-logs
num.partitions=1
num.recovery.threads.per.data.dir=1
log.retention.hours=168
log.segment.bytes=1073741824
log.retention.check.interval.ms=300000
zookeeper.connect=192.168.2.228:12181
zookeeper.connection.timeout.ms=6000
group.initial.rebalance.delay.ms=0
message.max.bytes=10485760
default.replication.factor=2
replica.fetch.max.bytes=10485760
delete.topic.enable=true

配置文件解释

broker.id=0  #当前机器在集群中的唯一标识,和zookeeper的myid性质一样
port=19092 #当前kafka对外提供服务的端口默认是9092
host.name=192.168.7.83 #这个参数默认是关闭的,在0.8.1有个bug,DNS解析问题,失败率的问题。废弃的
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天
# 下面两行是设置kafka接收消息的参数
message.max.bytes=5242880  #消息保存的最大值5M
replica.fetch.max.bytes=5242880  #取消息的最大直接数 
#################

default.replication.factor=2  #kafka保存消息的副本数,如果一个副本失效了,另一个还可以继续提供服务

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=192.168.7.100:12181,192.168.7.101:12181,192.168.7.107:1218 #设置zookeeper的连接端口

2.3 拷贝安装目录直接到其他机器上面,省了安装和配置

scp -r  kafka/ yx@192.168.4.21:/home/yx/server
需要更改的地方
broker.id=2
listeners=PLAINTEXT://本机ip:9092

2.4 启动kafka集群并测试

2.4.1 启动服务

#从后台启动Kafka集群(3台都需要启动)

cd /home/yx/server/kafka/bin  #进入到kafka的bin目录 
./kafka-server-start.sh -daemon ../config/server.properties

2.4.2 检查服务是否启动

#执行命令jps
20348 Jps
4233 QuorumPeerMain
18991 Kafka

kafka的默认启动端口是9092 ,可以在配置文件中自定义port=xxxx

2.4.3 停止服务的时候,用自带的脚本不行

./kafka-server-stop.sh
No kafka server to stop

ps aux | grep kafka ,然后kill

2.4.4 测试

创建topic
yx@zook-1:~/server/kafka/bin$ ./kafka-topics.sh --create --zookeeper 192.168.7.81:2181 --replication-factor 2 --partitions 1 --topic test1


./kafka-topics.sh --create --zookeeper 192.168.7.81:2181,192.168.4.21:2181,192.168.9.53:2181 --replication-factor 3 --partitions 1 --topic my-test


### 解释:
partitions指定topic分区数,replication-factor指定topic每个分区的副本数

partitions分区数:
partitions :分区数,控制topic将分片成多少个log。可以显示指定,如果不指定则会使用broker(server.properties)中的num.partitions配置的数量
虽然增加分区数可以提供kafka集群的吞吐量、但是过多的分区数或者或是单台服务器上的分区数过多,会增加不可用及延迟的风险。因为多的分区数,意味着需要打开更多的文件句柄、增加点到点的延时、增加客户端的内存消耗。
分区数也限制了consumer的并行度,即限制了并行consumer消息的线程数不能大于分区数
分区数也限制了producer发送消息是指定的分区。如创建topic时分区设置为1,producer发送消息时通过自定义的分区方法指定分区为2或以上的数都会出错的;这种情况可以通过alter –partitions 来增加分区数。
replication-factor副本
replication factor 控制消息保存在几个broker(服务器)上,一般情况下等于broker的个数。
如果没有在创建时显示指定或通过API向一个不存在的topic生产消息时会使用broker(server.properties)中的default.replication.factor配置的数量

删除topic

删除topic
./kafka-topics.sh -delete -zookeeper 192.168.7.81:2181,192.168.4.21:2181,192.168.9.53:2181 -topic test

查看topic

./kafka-topics.sh --list --zookeeper 192.168.7.81:2181,192.168.4.21:2181,192.168.9.53:2181
test - marked for deletion
test1

查看主题详细信息

./kafka-topics.sh --describe 192.168.7.81:2181,192.168.4.21:2181,192.168.9.53:2181 --topic my-test

查看my-test详细信息:
从第一排可以看到topic的名称,partition数量,副本数量。使用3份副本,就是保证数据的可用性,即使有两台broker服务器挂了,也能保证kafka的正常运行。从第二排开始,表格包含了五列,显示partition的情况,分别表示:topic名称、partition编号,此partions的leader broker编号,副本存放的broker编号,同步broker编号。因为我们开启了三个broker服务,对应的broker.id分别为0、1、2,而每个partion有三个副本,所以就有把所有的broker都使用了,只不过每个partition的leader不同。

生产者命令

./kafka-console-producer.sh --broker-list 192.168.4.21:9092 --topic my-test    #

这个ip地址可以指定zookeeper集群当中的任意一个ip
生产者启动完毕之后,会卡在哪里,等你输入信息
如下图:

消费者命令

这个命令可以在其他zookeeper节点上面启动,

./kafka-console-consumer.sh --bootstrap-server 192.168.9.53:9092 --topic my-test

--from-beginning # 网上一些教程这里写的是2181端口,根本不行

#启动zookeeper

/home/yx/server/zookeeper/bin/zkServer.sh  start

#启动kafka

cd  /home/yx/server/kafka/bin/ && ./kafka-server-start.sh -daemon ../config/server.properties

2.5 kafka修改日志目录

https://blog.csdn.net/chengyuqiang/article/details/80063588

先停止kafka服务
然后  修改$KAFKA_HOME/bin/kafka-run-class.sh
定位到LOG_DIR
# Log directory to use
if [ "x$LOG_DIR" = "x" ]; then
  LOG_DIR="$base_dir/logs"
fi

# 修改为如下
LOG_DIR=/data/kafka/log
# Log directory to use
if [ "x$LOG_DIR" = "x" ]; then
  LOG_DIR="$base_dir/log"
fi

然后重启kafka,就可以了

四  kafka监控

https://www.cnblogs.com/dadonggg/p/8242682.html

4.1 下载一个软件-KafkaOffsetMonitor

KafkaOffsetMonitor是Kafka的一款客户端消费监控工具,用来实时监控Kafka服务的Consumer以及它们所在的Partition中的Offset,我们可以浏览当前的消费者组,并且每个Topic的所有Partition的消费情况都可以一目了然。

KafkaOffsetMonitor托管在Github上,可以通过Github下载。
下载地址:https://github.com/quantifind/KafkaOffsetMonitor/releases

4.2 写一个脚本

java -cp KafkaOffsetMonitor-assembly-0.2.0.jar \
com.quantifind.kafka.offsetapp.OffsetGetterWeb \
\--zk 192.168.7.81:2181,192.168.9.53:2181,192.168.4.21:2181 \
\--port 8089 \
\--refresh 10.seconds \
\--retain 1.days

4.3 运行脚本,去浏览器访问

192.168.7.81:8089
image

posted @ 2023-02-15 15:12  huningfei  阅读(45)  评论(0编辑  收藏  举报
levels of contents