《Kafka权威指南》学习笔记
kafka安装配置
broker配置
broker.id
:每个broker都需要有一个标识符,使用broker.id来表示。它的默认值是0,也可以被设置成其他任意整数。这个值在整个Kafka集群里必须是唯一的。potr
:默认9092,可以指定任意端口号。(如果需要1024以下端口号,需要root权限)broker.rack
:机架信息。broker所在机架。zookeeper.connect
:hostname:port/path,hostname2:port/path...
,path可以不指定,默认为根路径/
。log.dirs
:Kafka把所有消息都保存在磁盘上,存放这些日志片段的目录是通过log.dirs指定的。它是一组用逗号分隔的本地文件系统路径。
如果指定了多个路径,那么broker会根据“最少使用”原则,把同一个分区的日志片段保存到同一个路径下。要注意,
broker会往拥有最少数目分区的路径新增分区,而不是往拥有最小磁盘空间的路径新增分区。
num.recovery.threads.per.data.dir
:对于如下3种情况,Kafka会使用可配置的钱程池来处理日志片段- 服务器正常启动,用于打开每个分区的日志片段
- 服务器崩愤后重启,用于检查和截短每个分区的日志片段:
- 服务器正常关闭,用于关闭日志片段。
默认情况下,每个日志目录只使用一个线程。因为这些线程只是在服务器启动和关闭时会用到,所以完全可以设置大量的线程来达到井行操作的目的。特别是对于包含大量分区的服务器来说,一旦发生奔溃,在进行恢复时使用井行操作可能会省下数小时的时间。设置此参数时需要注意,所配置的数字对应的是log.dirs指定的单个日志目录。也就是说,如果设置为8,井且
log.dir
指定了3个路径,那么总共需要24个线程。
auto.create.topics.enable
:Kafka会在如下几种情形下自动创建主题:- 当一个生产者开始往主题写入消息时。
- 当一个消费者开始从主题读取消息时。
- 当任意一个客户端向主题发送元数据请求时。
主题的默认配置
-
num.partitions
:参数指定了新创建的主题将包含多少个分区。 -
log.retention.ms
:根据时间来决定数据可以被保留多久。默认使用log.retention.hours
参数来配置时间,默认值为168小时,也就是一周。
还有其他两个参数:log.retention.minutes
和log.retention.ms
,推荐使用log.retention.ms
,若三个配置存在多项,则取值最小的那个。 -
log.retention.bytes
:根据保留消息字节数来判断消息是否过期,作用在每一个分区上。。 -
log.segment.bytes
和log.segment.ms
:控制日志片段大小或存活时间。 -
message.max.bytes
:参数来限制单个消息的大小默认值是l000000,也就是lMB。
Kafka命令
启动服务
# 设置变量,开启JMX
> export JMX_PORT=9988
> ./kafka-server-start.sh -daemon ../config/server.properties
进入zk,查看启动的代理
>ls /brokers/ids
主题
#创建topic
> ./kafka-topics.sh --create --zookeeper s159:2181,s162:2181,s163:2181 --replication-factor 1 --partitions 1 --topic test
#列出topic
> ./kafka-topics.sh --list --zookeeper s159:2181,s162:2181,s163:2181
#描述主题
> ./kafka-topics.sh --describe --zookeeper s159:2181,s162:2181,s163:2181
#删除主题,
a.必须配置 delete.topic.enable=true
b.> ./kafka-topics.sh --delete --zookeeper s159:2181,s162:2181,s163:2181 --topic test
进入zk,
c. > rmr /brokers/topics/{topic_name}';
> rmr /config/topics/{topic_name}';
批量删除topic指令:
./kafka-topics.sh --list --zookeeper s159:2181,s162:2181,s163:2181|grep 'test*' | xargs -n1 ./kafka-topics.sh --delete --zookeeper s159:2181,s162:2181,s163:2181 --topic
主题增加分区
假设有主题scada
仅有一个分区,现需要扩展为8个分区,则使用如下命令,
./kafka-topics.sh --alter --zookeeper s159:2181,s162:2181,s163:2181 --topic scada --partitions 8
,后查看topic分区详情:
修改分区复制系数
从上图看,目前分区的复制系数为1,现需要扩展为3,针对每一个分区都要做如下配置。
{"partitions" : [
{
"topic" : "scada",
"partition": 0 ,
"replicas":[0,1,2]
},
{
"topic" : "scada",
"partition": 1 ,
"replicas":[1,0,2]
},
{
"topic" : "scada",
"partition": 2 ,
"replicas":[2,0,1]
},
{
"topic" : "scada",
"partition": 3 ,
"replicas":[0,1,2]
},
{
"topic" : "scada",
"partition": 4 ,
"replicas":[1,2,0]
},
{
"topic" : "scada",
"partition": 5 ,
"replicas":[2,1,0]
},
{
"topic" : "scada",
"partition": 6 ,
"replicas":[0,2,1]
},
{
"topic" : "scada",
"partition": 7 ,
"replicas":[1,0,2]
}
],
"version" : 1
}
另存为a.json,
使用--verify
命令校验json配置:
./kafka-reassign-partitions.sh --zookeeper s159:2181 --verify --reassignment-json-file a.json
可能会出现如下提示:如下图:
ERROR: Assigned replicas (0) don't match the list of replicas for reassignment (0,2,1) for partition scada-0
这类问题可直接忽略。
直接执行--execute
执行配置即可:
./kafka-reassign-partitions.sh --zookeeper s159:2181 --execute --reassignment-json-file a.json
执行成功后,topic的分区信息如下:
kafka客户端
#发送消息(Provider)
./kafka-console-producer.sh --broker-list s159:9092 --topic test
---host:port 指的是具体kafka服务
#消费消息(Consumer)
> ./kafka-console-consumer.sh --bootstrap-server s159:9092 --topic test --from-beginning