赞
踩
例如 zk1:2181,zk2:2181,zk3:2181(2181是zookeeper默认的端口)
如果多个Kafka集群使用一个zookeeper集群,这样设置,zk1:2181,zk2:2181,zk3:2181/kafka1和zk1:2181,zk2:2181,zk3:2181/kafka2
listerers(监听器)告诉外部连接者要通过什么协议访问指定主机名和端口开发的Kafka服务
advertised.listeners,这组监听器是Broker用于对外发布的
建议射程false,不允许随便创建topic
kafka有多副本策略,设置成false,剑指不能让数据落后太多的副本竞选leader,这样做的后果是这个分区就不可用了,因为没有leader了。反之如果是true,那么kafka允许从那些“跑的慢”的副本中选一个出来当leader,这样做的后果是数据有可能丢失。建议设置成false。
建议设置成false。如果设置成true,有可能一段时间leader A被强制换成leader B,换一次leader代价很高的,而且这种换leader本质上没有任何性能收益。
log.retention.{hours|minutes|ms}:控制一条消息数据被保存多长时间,优先级上来说ms设置最高、minutes辞职、hours最低。
log.retention.bytes:指定Broker为消息保存可以占用的磁盘容量大小
这个默认值是-1,表示想在这台Broker保存多少数据都可以
默认值不到1MB,建议根据实际来,可以设置成稍微大一点。
说起 Topic 级别的参数,你可能会有这样的疑问:如果同时设置了 Topic 级别参数和全局 Broker 参数,到底听谁的呢?哪个说了算呢?答案就是 Topic 级别参数会覆盖全局 Broker 参数的值,而每个 Topic 都能设置自己的参数值,这就是所谓的 Topic 级别参数。
retention.ms:规定了该topic消息被保存的时长,默认为7天。
retention.bytes:规定了要为该topic预留多大的磁盘空间,默认值为-1,表示可以无限使用磁盘空间。
max.message.bytes:它决定了Kafka Broker能够正常接收该Topic的最大消息大小
Kafka 服务器端代码是用 Scala 语言编写的,但终归还是编译成 Class 文件在 JVM 上运行,因此 JVM 参数设置对于 Kafka 集群的重要性不言而喻。另外 Kafka 自 2.0.0 版本开始,已经正式摒弃对 Java 7 的支持了,所以有条件的话至少使用 Java 8 吧。
KAFKA_HEAP_OPTS:指定堆大小。JVM 堆大小设置成 6GB 吧,这是目前业界比较公认的一个合理值。
KAFKA_JVM_PERFORMANCE_OPTS:指定GC参数
如果 Broker 所在机器的 CPU 资源非常充裕,建议使用 CMS 收集器。启用方法是指定–
-XX:+UseCurrentMarkSweepGC。否则,使用吞吐量收集器。开启方法是指定-XX:+UseParallelGC。
用默认的 G1 收集器就好了。在没有任何调优的情况下,G1 表现得要比 CMS 出色,主要体现在更少的 Full GC,需要调整的参数更少等,所以使用 G1 就好了。
文件描述符限制:通常情况下将它设置成一个超大的值是合理的做法,比如ulimit -n 1000000。通常情况下将它设置成一个超大的值是合理的做法,比如ulimit -n 1000000。
文件系统类型:这里所说的文件系统指的是如 ext3、ext4 或 XFS 这样的日志型文件系统。根据官网的测试报告,XFS 的性能要强于 ext4,所以生产环境最好还是使用 XFS。对了,最近有个 Kafka 使用 ZFS 的数据报告,貌似性能更加强劲。
Swappiness:网上很多文章都提到设置其为 0,将 swap 完全禁掉以防止 Kafka 进程使用 swap 空间。我个人反倒觉得还是不要设置成 0 比较好,我们可以设置成一个较小的值。为什么呢?因为一旦设置成 0,当物理内存耗尽时,操作系统会触发 OOM killer 这个组件,它会随机挑选一个进程然后 kill 掉,即根本不给用户任何的预警。但如果设置成一个比较小的值,当开始使用 swap 空间时,你至少能够观测到 Broker 性能开始出现急剧下降,从而给你进一步调优和诊断问题的时间。基于这个考虑,我个人建议将 swappniess 配置成一个接近 0 但不为 0 的值,比如 1。
提交时间:或者说是Flush落盘时间。。向 Kafka 发送数据并不是真要等数据被写入磁盘才会认为成功,而是只要数据被写入到操作系统的页缓存(Page Cache)上就可以了,随后操作系统根据 LRU 算法会定期将页缓存上的“脏”数据落盘到物理磁盘上。这个定期就是由提交时间来确定的,
在使用Apache Kafka生产和消费消息的时候,肯定希望能够将数据均匀地分配到所有服务器上,如果将大数据量均****匀地分配到Kafka的哥哥Broker上,成为一个非常重要的问题。
为什么分区?
其实分区的作用就是提供负载均衡的能力,或者说对数据进行分区的主要原因,就是为了实现系统的高伸缩性(Scalability)。
值得注意的是,不同的分布式系统对分区的叫法也不尽相同,比如在Kafka中叫分区,在MongoDB和Elasticsearch中就叫分片Shard,而在HBase中则叫Region,在Cassandra中又叫vnode。
分区策略有哪些?
分区策略也就是决定生产者将消息发送到哪个分区的算法,分区策略常见分类:
也称Round-robin策略,即顺序分配。如果一个主题下有3个分区,那么第一条消息被发送到分区0,第二条被发送到分区1,第三条被发送到分区2,以此类推。当生产第4条消息又会重新开始,即将其分配到分区0 。
也称Randomness策略。所谓随机策略就是我们随意地将消息放知道任意一个分区上。但从实际上来看,它要逊于轮询策略。
也称Key-ordering策略。Kafka允许为每条消息定义消息键,简称为key。由于每个分区下的消息处理都是有顺序的,故这个策略被称为按消息键保存策略。
Kafka在什么情况下才能保证消息不丢失?
Kafka支队"已提交"的消息(committed message)做有限度的持久化保证。
当 Kafka 的若干个 Broker 成功地接收到一条消息并写入到日志文件后,它们会告诉生产者程序这条消息已成功提交。此时,这条消息在 Kafka 看来就正式变为“已提交”消息了。
这里的若干个可以设置为只要有一个Broker成功保存该消息就算是已提交,也可以是令所有Broker都车更难过保存该消息才算是已提交。
Kafka不丢失消息是有前提条件的,假如你的消息包存在N个Kafka Broker上,前提条件就是这个N个Broker中至少有一个存活。
a. 生产者程序丢失数据
目前 Kafka Producer 是异步发送消息的,也就是说如果你调用的是 producer.send(msg) 这个 API,那么它通常会立即返回,但此时你不能认为消息发送已成功完成。
这种发送方式有个有趣的名字,叫“fire and forget”,翻译一下就是“发射后不管”。如果用这个方式,可能有很多原因导致消息压根久没哟欧发送到Broker端,或者消息本身不合格导致Broker拒绝接收。
实际上,解决此问题的方法非常简单:Producer 永远要使用带有回调通知的发送 API,也就是说不要使用 producer.send(msg),而要使用 producer.send(msg, callback)。
b. 消费者程序丢失数据
消费消息与更新位移的顺序不对。
小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。
深知大多数初中级Java工程师,想要提升技能,往往是自己摸索成长,但自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!
因此收集整理了一份《2024年最新Java开发全套学习资料》送给大家,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。
由于文件比较大,这里只是将部分目录截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频
如果你觉得这些内容对你有帮助,可以添加下面V无偿领取!(备注Java)
我个人觉得面试也像是一场全新的征程,失败和胜利都是平常之事。所以,劝各位不要因为面试失败而灰心、丧失斗志。也不要因为面试通过而沾沾自喜,等待你的将是更美好的未来,继续加油!
以上面试专题的答小编案整理成面试文档了,文档里有答案详解,以及其他一些大厂面试题目
领导或公司里技术强的人在学什么。
我个人觉得面试也像是一场全新的征程,失败和胜利都是平常之事。所以,劝各位不要因为面试失败而灰心、丧失斗志。也不要因为面试通过而沾沾自喜,等待你的将是更美好的未来,继续加油!
以上面试专题的答小编案整理成面试文档了,文档里有答案详解,以及其他一些大厂面试题目
[外链图片转存中…(img-xw81lYXc-1711145435976)]
[外链图片转存中…(img-hlHlNV5x-1711145435977)]
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。