一、分区副本数设置
由于分区副本仅提供数据冗余的功能,且分区副本数量与集群吐吞量负相关,故冗余度在满足安全要求基础上设置为最小即可。
故我们不妨将分区副本数设置为2.
二、kafka分区数设置
通过对单个分区的topic进行消费者和生产者的压力测试,得出单个分区所能提供的消费和生产的最大峰值吐吞量。
1、创建只有一个分区的topic。
kafka-topics.sh --create \
--zookeeper Linux001:2181 \
--partitions 1 \
--replication-factor 2 \
--topic test
2、测试该topic的producer峰值吞吐量Tp
kafka-producer-pref-test.sh \
--producer-props bootstrap.servers=${bootstrap.servers} \
--producer.config ${KAFKA_HOME}/config/producer.properties \
--topic test \
--record-size 900000 \ (根据你们的业务进行配置)
--num-records 10000000 \
--throughput -1
--producer-prop参数下还可以额外指定其他键值对,如"acks=1"
--throughput 代表每秒发多少条消息,-1代表不限流
测试环境测得约为Tp=80MB/s。
3、测试该topic的consumer峰值吞吐量Tc
kafka-consumer-pref-test.sh \
--broker-list ${bootstrap.servers} \
--consumer.config=${KAFKA_HOME}/config/consumer.properties \
--topic test \
--messages 10000000 \
--reporting-interval 1000 \
--show-detailed-stats
测试环境测得约为Tc=90MB/s。
4、计算所需要的topic分区数
假设你需要的目标吞吐量为T,则分区数num=T/min(Tp,Tc)。
分母取最小值表明即使取消费者额生产者的最小吞吐量,只要设置为num的分区数,仍能达到目标吐吞量要求。
假设我们需要的吐吞量为100MB/s,则分区数num=100/min(80,90)=2
由于消费者Flink数量为3台,为保证充分利用flink计算资源,避免flink消费者空转,我们不妨将Kafka的topic分区设置为3。
后续若业务升级再动态扩容topic分区到6个、9个、12个...保持与flink消费者数n:1的关系。
动态扩容topic分区命令:
kafka-topics.sh --alter \
--zookeeper ${zookeeper.url} \
--partitions 6 \
--topic t001
三、kafka生产者性能优化测试
我们设置好topic的分区数、分区副本数后,可以使用控制变量的方式来测试,寻找公司集群上各参数的最佳值。
会影响生产端吞吐量的参数:batch.size\longer.ms\acks\,这些参数都可以在--producer-props参数后。
其他参数还有:压缩格式、网络带宽。
四、kafka消费者性能优化测试
我们设置好topic的分区数、分区副本数后,可以使用控制变量的方式来测试,寻找公司集群上各参数的最佳值。
会影响消费端吞吐量的参数:--fetch-size\--threads
其他参数还有:压缩格式、网络带宽。
五、kafka机器节点数量设置
n=2*(峰值生产速度*副本数/100)+1
更关注峰值生产速度是为了避免数据在业务层积压。