Kafka:Broker Config 配置

Broker Configs

配置文件config/server.properties

属性描述类型默认值
broker.id每一个broker在集群中的唯一表示,要求是正数int-1
zookeeper.connect指定zk连接,[hostname:port]以逗号分隔string
advertised.listeners若没配置就就使用listeners的配置通告给消息的生产者和消费者,这个过程是在生产者和消费者获取源数据(metadata)。格式:PLAINTEXT://your.host.name:9092,可选的值有PLAINTEXT和SSLstringnull
auto.create.topics.enable是否允许自动创建topic,若是false,就需要通过命令创建topicbooleantrue
auto.leader.rebalance.enable是否自动平衡broker之间的分配策略booleantrue
delete.topic.enable是否开启topic可以被删除booleanfalse
listenerslisteners = PLAINTEXT://your.host.name:9092stringnull
log.dirskafka持久化数据存储的路径,可以指定多个,以逗号分隔stringnull
message.max.bytesserver能接收的消息体最大大小,单位是字节,消费端的最大拉取大小需要略大于该值int1000012
min.insync.replicas当 ack=”all” 或 -1 时,指定最小确认成功的副本数,如果没满足,producer会抛出 NotEnoughReplicas or NotEnoughReplicasAfterAppend 异常int1
num.io.threadsbroker处理磁盘IO的线程数,数值应该大于你的硬盘数int8
num.network.threadsbroker处理消息的最大线程数int3
num.replica.fetchers从source broker进行复制的线程数,增大这个数值会增加follower的IOint1
queued.max.requests等待IO线程处理的请求队列最大数,若是等待IO的请求超过这个数值,那么会停止接受外部消息,应该是一种自我保护机制。int500
request.timeout.ms从发送请求到收到ACK确认等待的最长时间(超时时间)int30000
socket.receive.buffer.bytessocket的接受缓冲区,socket的调优参数SO_RCVBUFFint102400
socket.request.max.bytessocket请求的最大数值,防止serverOOM,message.max.bytes必然要小于socket.request.max.bytes,会被topic创建时的指定参数覆盖int104857600
socket.send.buffer.bytessocket的发送缓冲区,socket的调优参数SO_SNDBUFFint102400
zookeeper.connection.timeout.msZooKeeper的连接超时时间intnull
zookeeper.session.timeout.msZooKeeper的最大超时时间,就是心跳的间隔,若是没有反映,那么认为已经死了,不宜过大int6000
connections.max.idle.ms空闲连接超时,超时则关闭long600000



其余参数(注:以下均为默认值)

# zk follower落后于zk leader的最长时间
zookeeper.sync.time.ms=2000

# metrics系统维护可配置的样本数量,在一个可修正的window  size。这项配置配置了窗口大小,例如。我们可能在30s的期间维护两个样本。当一个窗口推出后,我们会擦除并重写最老的窗口
metrics.sample.window.ms=30000

# 用于维护metrics的样本数
metrics.num.samples=2

# 类的列表,用于衡量指标。实现MetricReporter接口,将允许增加一些类,这些类在新的衡量指标产生时就会改变。JmxReporter总会包含用于注册JMX统计
metric.reporters=[]

# broker id最大值
reserved.broker.max.id=1000

# 期望的整个fetch response最大大小
replica.fetch.response.max.bytes=10485760

# 备份时每次fetch的最大值
replica.fetch.max.bytes=1048576

# 当 fetch partition error时的sleep时间
replica.fetch.backoff.ms=1000

# producer请求清除时的清除间隔
producer.purgatory.purge.interval.requests=1000

# 每个topic的分区个数,若是在topic创建时候没有指定的话会被topic创建时的指定参数覆盖
num.partitions=1

# 每个ip或者hostname默认的连接的最大覆盖
max.connections.per.ip.overrides=""

# 每个ip地址上每个broker可以被连接的最大数目
max.connections.per.ip=2147483647

# 检查日志分段文件的间隔时间,以确定是否文件属性是否到达删除要求。
log.retention.check.interval.ms=300000

# 创建新segment的时候是否需要预分配,windows上需要设置为true
log.preallocate=false

# timestamp 类型,[CreateTime, LogAppendTime]
log.message.timestamp.type=CreateTime

# 在 log.message.timestamp.type=CreateTime 时,所允许的broker收到消息的timestamp和消息中指定的timestamp最大差值
log.message.timestamp.difference.max.ms=9223372036854775807

# 对于segment日志的索引文件大小限制,会被topic创建时的指定参数覆盖
log.index.size.max.bytes=10485760

# 当执行一次fetch后,需要一定的空间扫描最近的offset,设置的越大越好,一般使用默认值就可以
log.index.interval.bytes=4096

# 日志清理策略选择有:delete和compact主要针对过期数据的处理,或是日志文件达到限制的额度,会被 topic创建时的指定参数覆盖,[compact, delete]
log.cleanup.policy=delete

# 日志压缩运行的线程数
log.cleaner.threads=1

# 这项配置控制log  compactor试图清理日志的频率(假定log compaction是打开的)
log.cleaner.min.cleanable.ratio=0.5

# log cleaner 最大IO平均速度
log.cleaner.io.max.bytes.per.second=1.7976931348623157E308

#日志清理时候用到的IO块大小一般不需要修改
log.cleaner.io.buffer.size=524288

# log cleaning中所使用的hash表的负载因子;你不需要更改这个选项。
log.cleaner.io.buffer.load.factor=0.9

# 当这个属性设置为false时,一旦日志的保存时间或者大小达到上限时,就会被删除;如果设置为true,则当保存属性达到上限时,就会进行log compaction。
log.cleaner.enable=true

# delete record 保留时间
log.cleaner.delete.retention.ms=86400000

# 日志压缩去重时候的缓存空间,在空间允许的情况下,越大越好
log.cleaner.dedupe.buffer.size=134217728

# 检查是否处罚日志清理的间隔
log.cleaner.backoff.ms=15000

# The minimum allowed session timeout for registered consumers.
group.min.session.timeout.ms=6000

# The maximum allowed session timeout for registered consumers.
group.max.session.timeout.ms=300000

# partition默认的备份因子
default.replication.factor=1

# partition leader与replicas之间通讯时,socket的超时时间
controller.socket.timeout.ms=30000

# 每次关闭尝试的时间间隔
controlled.shutdown.retry.backoff.ms=5000

# 控制器关闭的尝试次数
controlled.shutdown.max.retries=3

# 是否允许控制器关闭broker ,若是设置为true,会关闭所有在这个broker上的leader,并转移到其他broker
controlled.shutdown.enable=true

# 是否允许不在 isr 的副本选为leader
unclean.leader.election.enable=true

# follower与leader之间的socket超时时间
replica.socket.timeout.ms=30000

# leader复制时候的socket缓存大小
replica.socket.receive.buffer.bytes=65536

# 如果这个时间内follower没有发起fetch请求,被认为dead,从ISR移除
replica.lag.time.max.ms=10000

# 每个replica检查是否将最高水位进行固化的频率
replica.high.watermark.checkpoint.interval.ms=5000

# replicas同leader之间通信的最大等待时间,失败了会重试
replica.fetch.wait.max.ms=500

# fetch的最小数据尺寸,如果leader中尚未同步的数据不足此值,将会阻塞,直到满足条件
replica.fetch.min.bytes=1

# The offsets topic segment bytes should be kept relatively small in order to facilitate faster log compaction and cache loads
offsets.topic.segment.bytes=104857600

# offset topic 副本数量
offsets.topic.replication.factor=3

# offset commit topic 的partition数量
offsets.topic.num.partitions=50

# 客户端保留offset信息的最大空间大小
offset.metadata.max.bytes=4096

# 每个 data 目录用于log恢复(启动时)和flushing(关闭时)的线程数
num.recovery.threads.per.data.dir=1

# topic的分区是以一堆segment文件存储的,这个控制每个segment的大小,会被topic创建时的指定参数覆盖
log.segment.bytes=1073741824

# 这个参数会在日志segment没有达到log.segment.bytes设置的大小,也会强制新建一个segment 会被 topic创建时的指定参数覆盖
log.roll.hours=168
log.roll.ms=

# 数据存储的最大时间 超过这个时间 会根据log.cleanup.policy设置的策略处理数据,也就是消费端能够多久去消费数据
log.retention.hours=168
log.retention.minutes=
log.retention.ms

# topic每个分区的最大文件大小,一个topic的大小限制 = 分区数*log.retention.bytes
log.retention.bytes=-1

# 检查是否需要固化到硬盘的时间间隔
log.flush.scheduler.interval.ms=9223372036854775807

# 控制上次固化硬盘的时间点,以便于数据恢复一般不需要去修改
log.flush.offset.checkpoint.interval.ms=60000

# 控制"fsync"的时间间隔,如果消息量始终没有达到阀值,但是离上一次磁盘同步的时间间隔达到阀值,也将触发
log.flush.interval.ms=

# log文件 sync 到磁盘之前累积的消息条数,因为磁盘IO操作是一个慢操作,需要在"数据可靠性"与"性能"之间做必要的权衡.如果此值过大,将会导致每次"fsync"的时间较长(IO阻塞),如果此值过小,将会导致"fsync"的次数较多,这也意味着整体的client请求有一定的延迟.物理server故障,将会导致没有fsync的消息丢失.
log.flush.interval.messages=9223372036854775807

# 一些后台任务处理的线程数,例如过期消息文件的删除等,一般情况下不需要去做修改
background.threads=10

# 对发送的消息采取的压缩编码方式 ('gzip', 'snappy', 'lz4'), 'uncompressed' 不压缩, 'producer' 保持producer设置的压缩编码
compression.type=producer

# 检查leader是否不平衡的时间间隔
leader.imbalance.check.interval.seconds=300

# leader的不平衡比例,若是超过这个数值,会对分区进行重新的平衡
leader.imbalance.per.broker.percentage=10
[root@localhost apps]# cat kafka1.yml version: "3.6" services: kafka1: container_name: kafka1 image: 'bitnami/kafka:3.6.1' mem_limit: 4g ulimits: nproc: 65535 nofile: 65535 user: root ports: - '19092:9092' - '19093:9093' environment: - KAFKA_CFG_NODE_ID=1 - KAFKA_ENABLE_KRAFT=yes - KAFKA_CFG_PROCESS_ROLES=broker,controller - KAFKA_CFG_CONTROLLER_LISTENER_NAMES=CONTROLLER - KAFKA_CFG_LISTENERS=PLAINTEXT://:9092,CONTROLLER://:9093 - KAFKA_CFG_LISTENER_SECURITY_PROTOCOL_MAP=CONTROLLER:PLAINTEXT,PLAINTEXT:PLAINTEXT - KAFKA_CFG_ADVERTISED_LISTENERS=PLAINTEXT://kd.suufood.com:19092 - KAFKA_BROKER_ID=1 - KAFKA_KRAFT_CLUSTER_ID=iZWRiSqjZAlYwlKEqHFQWI - KAFKA_CFG_CONTROLLER_QUORUM_VOTERS=1@172.23.0.11:9093,2@172.23.0.12:9093,3@172.23.0.13:9093 - ALLOW_PLAINTEXT_LISTENER=yes - KAFKA_HEAP_OPTS=-Xmx2G -Xms1G - KAFKA_JVM_PERFORMANCE_OPTS="-Xss256k" volumes: - /data/new_public/kafka/broker01:/bitnami/kafka:rw networks: netkafka: ipv4_address: 172.23.0.11 kafka2: container_name: kafka2 image: 'bitnami/kafka:3.6.1' user: root ports: - '29092:9092' - '29093:9093' environment: - KAFKA_CFG_NODE_ID=2 - KAFKA_ENABLE_KRAFT=yes - KAFKA_CFG_PROCESS_ROLES=broker,controller - KAFKA_CFG_CONTROLLER_LISTENER_NAMES=CONTROLLER - KAFKA_CFG_LISTENERS=PLAINTEXT://:9092,CONTROLLER://:9093 - KAFKA_CFG_LISTENER_SECURITY_PROTOCOL_MAP=CONTROLLER:PLAINTEXT,PLAINTEXT:PLAINTEXT - KAFKA_CFG_ADVERTISED_LISTENERS=PLAINTEXT://kd.suufood.com:29092 - KAFKA_BROKER_ID=2 - KAFKA_KRAFT_CLUSTER_ID=iZWRiSqjZAlYwlKEqHFQWI - KAFKA_CFG_CONTROLLER_QUORUM_VOTERS=1@172.23.0.11:9093,2@172.23.0.12:9093,3@172.23.0.13:9093 - ALLOW_PLAINTEXT_LISTENER=yes - KAFKA_HEAP_OPTS=-Xmx512M -Xms256M volumes: - /data/new_public/kafka/broker02:/bitnami/kafka:rw networks: netkafka: ipv4_address: 172.23.0.12 kafka3: container_name: kafka3 image: 'bitnami/kafka:3.6.1' user: root ports: - '59092:9092' - '59093:9093' environment: - KAFKA_CFG_NODE_ID=3 - KAFKA_ENABLE_KRAFT=yes - KAFKA_CFG_PROCESS_ROLES=broker,controller - KAFKA_CFG_CONTROLLER_LISTENER_NAMES=CONTROLLER - KAFKA_CFG_LISTENERS=PLAINTEXT://:9092,CONTROLLER://:9093 - KAFKA_CFG_LISTENER_SECURITY_PROTOCOL_MAP=CONTROLLER:PLAINTEXT,PLAINTEXT:PLAINTEXT - KAFKA_CFG_ADVERTISED_LISTENERS=PLAINTEXT://kd.suufood.com:39092 - KAFKA_BROKER_ID=3 - KAFKA_KRAFT_CLUSTER_ID=iZWRiSqjZAlYwlKEqHFQWI - KAFKA_CFG_CONTROLLER_QUORUM_VOTERS=1@172.23.0.11:9093,2@172.23.0.12:9093,3@172.23.0.13:9093 - ALLOW_PLAINTEXT_LISTENER=yes - KAFKA_HEAP_OPTS=-Xmx512M -Xms256M volumes: - /data/new_public/kafka/broker03:/bitnami/kafka:rw networks: netkafka: ipv4_address: 172.23.0.13 networks: netkafka: driver: bridge ipam: config: - subnet: 172.23.0.0/25
最新发布
03-19
<think>嗯,用户给了一个Docker Compose文件,想要我帮忙解释或者分析一下。首先,我需要仔细看看这个文件的结构和内容。看起来这是一个配置了三个Kafka节点的集群,使用KRaft模式运行,也就是去除了ZooKeeper的依赖。用户可能是在搭建Kafka集群时遇到了问题,或者想要确认配置是否正确。 首先,文件里用了Docker Compose版本3.6,定义了一个服务,包含kafka1、kafka2、kafka3三个服务。每个服务都用了bitnami/kafka:3.6.1镜像,这应该是官方的一个镜像版本。接下来,每个容器都有不同的端口映射,比如kafka1的19092映射到宿主机的9092,这可能是因为在同一台机器上运行多个实例,避免端口冲突。 然后看环境变量部分,这里有很多Kafka配置参数。比如KAFKA_ENABLE_KRAFT=yes,说明启用了KRaft模式。KAFKA_CFG_PROCESS_ROLES设置了broker和controller,这意味着每个节点同时充当broker和controller角色,这是KRaft架构的特点。不过,注意到kafka1的内存限制是4g,而其他两个是较小的内存,这可能影响性能,用户是否知道这点? 再看网络配置,每个容器都有一个静态的IPv4地址,属于同一个子网netkafka。这有助于节点之间的通信。但是检查KAFKA_CFG_CONTROLLER_QUORUM_VOTERS,里面列出了三个节点的IP和端口,都是9093。看起来是正确的,但需要确认这些IP是否真的能互通,以及端口是否开放。 另外,每个服务的advertised.listeners配置了不同的外部端口,比如19092、29092、39092,对应的域名是kd.suufood.com。这里可能需要确认该域名是否解析到宿主机的正确IP,否则客户端可能无法连接。 还有,volumes部分挂载了宿主机的目录到容器内,确保数据持久化。路径是否正确?权限是否足够,因为容器以root用户运行,可能需要检查宿主机的目录权限。 用户可能的问题包括:集群是否配置正确,节点能否正常通信,客户端连接是否成功,或者是否有配置错误导致服务启动失败。比如,KRaft模式下controller的配置是否正确,quorum voters的IP是否正确,端口是否开放,以及内存分配是否合理。 需要指出可能的错误点,比如kafka3的端口映射是59092和59093,但advertised.listeners配置的是39092,这会导致客户端连接失败,因为宿主机端口59092映射到容器9092,但广告地址是39092,端口不匹配。用户可能需要将advertised.listeners的端口改为59092,或者调整宿主机端口映射,确保内外端口一致。 另外,检查KAFKA_BROKER_ID是否应该和NODE_ID一致?在KRaft模式下,NODE_ID应该唯一,而BROKER_ID可能已经被弃用,或者需要保持一致。需要确认当前版本的Kafka是否还使用BROKER_ID,或者是否由NODE_ID代替。如果配置BROKER_ID,可能会引起混淆或错误。 最后,建议用户检查日志,确认每个节点是否成功加入集群,网络是否通畅,以及客户端配置是否正确使用广告地址和端口。</think>以下是对您提供的Kafka集群Docker Compose文件的逐层解析: --- ### 一、基础配置分析 1. **版本声明** `version: "3.6"` 表示使用Docker Compose v3.6语法,支持较新的配置特性 2. **网络架构** - 自定义桥接网络`netkafka`,子网`172.23.0.0/25` - 每个Kafka节点分配**静态IP**(如`172.23.0.11`),确保固定通信地址 --- ### 二、核心服务配置(以kafka1为例) #### 1. 容器基础参数 ```yaml container_name: kafka1 image: 'bitnami/kafka:3.6.1' # 使用KRaft模式的官方镜像 mem_limit: 4g # 容器内存限制(注意kafka2/3配置不同) ports: - '19092:9092' # 客户端通信端口映射 - '19093:9093' # Controller通信端口 volumes: - /data/.../broker01:/bitnami/kafka:rw # 数据持久化目录 ``` #### 2. KRaft模式关键配置 | 环境变量 | 作用说明 | |---------|---------| | `KAFKA_ENABLE_KRAFT=yes` | 启用KRaft模式(去ZooKeeper化) | | `KAFKA_CFG_PROCESS_ROLES=broker,controller` | 节点同时承担Broker和Controller角色 | | `KAFKA_CFG_CONTROLLER_QUORUM_VOTERS` | 集群控制器节点列表(需与所有节点一致) | #### 3. 监听器配置解析 ```bash KAFKA_CFG_LISTENERS=PLAINTEXT://:9092,CONTROLLER://:9093 KAFKA_CFG_ADVERTISED_LISTENERS=PLAINTEXT://kd.suufood.com:19092 ``` - `PLAINTEXT`:客户端通信协议 - `CONTROLLER`:集群内部控制器通信 - **注意**:`advertised.listeners`中的端口需与宿主机映射端口一致(如`19092`对应`9092`) --- ### 三、潜在问题排查点 1. **端口映射一致性** kafka3配置中: ```yaml ports: - '59092:9092' # 宿主机59092 → 容器9092 environment: - KAFKA_CFG_ADVERTISED_LISTENERS=PLAINTEXT://kd.suufood.com:39092 ``` **矛盾点**:广告地址端口`39092`与映射端口`59092`不一致,客户端将无法连接 2. **内存分配差异** - kafka1分配`4G`内存,kafka2/3仅`512M`,可能影响集群稳定性 - 建议通过`KAFKA_HEAP_OPTS`统一调整堆内存 3. **网络连通性验证** 需确保: ```bash # 测试节点间通信 docker exec kafka1 nc -zv 172.23.0.12 9093 docker exec kafka2 nc -zv 172.23.0.13 9093 ``` --- ### 四、操作建议 1. **修改kafka3广告地址** ```yaml KAFKA_CFG_ADVERTISED_LISTENERS=PLAINTEXT://kd.suufood.com:59092 ``` 2. **日志检查命令** ```bash docker logs -f kafka1 | grep -i 'Registered Broker' ``` 3. **集群状态验证** ```bash # 进入任意容器执行 kafka-metadata-shell.sh \ --snapshot /bitnami/kafka/data/__cluster_metadata-0/quorum/00000000000000000000.log ``` 通过以上配置调整和验证步骤,可确保KRaft模式集群正常运作。建议使用`docker-compose up -d`启动服务后,持续监控节点日志确认选举状态。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值