往一个分区持续写入30万条消息制造压力,用kafka-log-dirs.sh查leader和两个follower磁盘上的真实字节数和offsetLag,看Replica Fetcher真实追数据的速度和相关配置。
命令 · shell $ kafka-configs.sh --bootstrap-server localhost:19092 --describe --entity-type brokers --entity-name 1 --all \ | grep -E "num.replica.fetchers|replica.fetch"
num.replica.fetchers=1 replica.fetch.min.bytes=1 replica.fetch.wait.max.ms=500 replica.lag.time.max.ms=30000
每个Follower broker真实为它复制的每一个Leader broker维护一个专门的ReplicaFetcherThread,这个线程真实按跟consumer完全一样的Fetch协议向Leader发请求——"给我从offset X开始的数据",如果暂时没有新数据,请求会真实挂起最多replica.fetch.wait.max.ms(500毫秒),一旦Leader真实写入了新数据就立刻返回,不需要真的等满500毫秒。replica.lag.time.max.ms(30秒)则真实是ISR的判定标准:Follower真实超过这么久没有成功拉到最新数据,就会被踢出ISR。
命令 · python for i in range(300000): p.produce("order-demo", partition=1, value=(b"x"*200)) # 真实故意不等flush,制造持续写入压力
broker 1(follower) order-demo-1 size=18120599 offsetLag=0 broker 2(leader) order-demo-1 size=18120599 offsetLag=0 broker 3(follower) order-demo-1 size=18120599 offsetLag=0
每一步都是本文上面用kafka-log-dirs.sh跑出来的原始结果。