Kafka最佳实践
一、硬件考量
1.1、内存
不建议为kafka分配超过5g的heap,因为会消耗28-30g的文件系统缓存,而是考虑为kafka的读写预留充足的buffer。Buffer大小的快速计算方法是平均磁盘写入数量的30倍。推荐使用64GB及以上内存的服务器,低于32GB内存的机器可能会适得其反,导致不断依赖堆积机器来应付需求增长。(我们在生产环境使用的机器是64G内存的,但也看到LinkedIn用了大量28G内存的服务器。)
1.2、CPU
kafka不算是CPU消耗型服务,在主频和CPU核数之间,选择后者,将会获得多核带来的更好的并发处理性能。
1.3、磁盘
毋庸置疑,RAID是优先推荐的,它在底层实现了物理磁盘的负载均衡和冗余,虽然会牺牲一些磁盘空间和写入性能。更进一步,我们推荐在配置中使用多目录,每个目录挂在在不同的磁盘(或者RAID)上。需要注意的是,NAS是不可取的,无论供应商如何吹嘘他们的NAS的卓越性能。另外,我们经常看到用户咨询kafka是否一定要采用SSD,答案是没有必要。
1.4网络
分布式系统中,网络的速度和可靠性异常重要,千兆甚至万兆网络现在应该成为数据中心的标配。避免kafka集群出现跨数据中心的情况,更要避免有很大的物理空间跨度,尤其中国还有诡异的联通电信问题。kafka集群中各个节点地位均等,一旦因为延时导致分布式集群不稳定,排错尤其困难。
1.5、文件系统
ext4是最佳选择。
1.6、其它
在硬件越来越强大和云计算如火如荼的今天,你需要在超高配置的服务器和IaaS供应商的数百个虚拟机之间做取舍。我们建议使用中等配置的服务器,因为集群规模越大,单台超高配置的服务器运行的节点越多,集群稳定性随之下降,复杂度则会上升。
二、JVM的考虑
对于java应用,jvm和gc是绕不过去的坎。实践表明,官方JDK1.7u51会是一个不错的选择,配合以G1来做垃圾回收。推荐配置可参考:
-Xms4g -Xmx4g -XX:PermSize=48m -XX:MaxPermSize=48m -XX:+UseG1GC-XX:MaxGCPauseMillis=20 -XX:InitiatingHeapOccupancyPercent=35
注:kafka版本更新会带来变化。请随时关注。我们现在的版本是kafka_2.11-0.8.2.1
三、File descriptors
kafka会使用大量文件和网络socket,所以,我们需要把file descriptors的默认配置改为100000。修改方法如下:
#vi /etc/sysctl.conf
fs.file-max = 32000
#vi /etc/security/limits.conf
yourusersoftnofile10000
youruserhardnofile30000
四、关键配置项解读
尽管默认配置已经很不错,但出于性能和实际集群部署情况,我们还是需要讲解一些重要的配置项。除此之外,如果对某个默认参数存在质疑,在详细了解改参数的作用前,建议采用默认配置。
4.1、zookeeper.connect
必配参数,建议在kafka集群的每天机器都配置所有zk。
4.2、broker.id
必配参数。集群节点的标示符,不得重复。取值范围0~n。
4.3、log.dirs
建议参照文章前面描述的磁盘配置,不要使用默认的“/tmp/kafka-logs”
4.4、advertised.host.name
注册到zk供用户使用的主机名。内网环境通常无需配置,而IaaS一般需要配置为公网地址。默认为“host.name”,可以通过java.net.InetAddress.getCanonicalHostName()接口获取该值。
4.5、advertised.port
注册到zk供用户使用的服务端口,通常在IaaS环境需要额外配置。
4.6、num.partitions
自动创建topic的默认partition数量。默认是1,为了获得更好的性能,建议修改为更大。最优取值参考后文。
4.7、default.replication.factor
自动创建topic的默认副本数量,官方建议修改为2;但通常一个副本就足够了。
4.8、min.insync.replicas
ISR提交生成者请求的最小副本数。
4.9、unclean.leader.election.enable
是否允许不具备ISR资格的replicas选举为leader作为不得已的措施,甚至不惜牺牲部分数据。默认允许。建议允许。数据异常重要的情况例外。
4.10、controlled.shutdown.enable
在kafka收到stop命令或者异常终止时,允许自动同步数据。建议开启。
五、动态调整配置
大部分kafka配置是写死在properties文件里的。然而,许多关于topic的参数我们可以动态调配,kafka-topic.sh工具提供了该功能,更改将一直生效直到服务器重启。可以调整的参数如下:
unclean.leader.election.enable:不严格的leader选举,有助于集群健壮,但是存在数据丢失风险。
min.insync.replicas:如果同步状态的副本小于该值,服务器将不再接受request.required.acks为-1或all的写入请求。
max.message.bytes:单条消息的最大长度。如果修改了该值,那么replica.fetch.max.bytes和消费者的fetch.message.max.bytes也要跟着修改。
cleanup.policy:生命周期终结数据的处理,默认删除。
flush.messages:强制刷新写入的最大缓存消息数。
flust.ms:强制刷新写入的最大等待时长。
还有segment.bytes、segment.ms、retention.bytes、retention.ms和segment.jitter.ms。详见官方解释。
六、性能优化技巧
6.1、配置合适的partitons数量。
这似乎是kafka新手必问得问题。首先,我们必须理解,partiton是kafka的并行单元。从producer和broker的视角看,向不同的partition写入是完全并行的;而对于consumer,并发数完全取决于partition的数量,即,如果consumer数量大于partition数量,则必有consumer闲置。所以,我们可以认为kafka的吞吐与partition时线性关系。partition的数量要根据吞吐来推断,假定p代表生产者写入单个partition的最大吞吐,c代表消费者从单个partition消费的最大吞吐,我们的目标吞吐是t,那么partition的数量应该是t/p和t/c中较大的那一个。实际情况中,p的影响因素有批处理的规模,压缩算法,确认机制和副本数等,然而,多次benchmark的结果表明,单个partition的最大写入吞吐在10MB/sec左右;c的影响因素是逻辑算法,需要在不同场景下实测得出。
这个结论似乎太书生气和不实用。我们通常建议partition的数量一定要大于等于消费者的数量来实现最大并发。官方曾测试过1万个partition的情况,所以不需要太担心partition过多的问题。下面的知识会有助于读者在生产环境做出最佳的选择:
a、一个partition就是一个存储kafka-log的目录。
b、一个partition只能寄宿在一个broker上。
c、单个partition是可以实现消息的顺序写入的。
d、单个partition只能被单个消费者进程消费,与该消费者所属于的消费组无关。这样做,有助于实现顺序消费。
e、单个消费者进程可同时消费多个partition,即partition限制了消费端的并发能力。
f、partition越多则file和memory消耗越大,要在服务器承受服务器设置。
g、每个partition信息都存在所有的zk节点中。
h、partition越多则失败选举耗时越长。
k、offset是对每个partition而言的,partition越多,查询offset就越耗时。
i、partition的数量是可以动态增加的(只能加不能减)。
我们建议的做法是,如果是3个broker的集群,有5个消费者,那么建议partition的数量是15,也就是broker和consumer数量的最小公倍数。当然,也可以是一个大于消费者的broker数量的倍数,比如6或者9,还请读者自行根据实际环境裁定。
本文摘自:http://www.jianshu.com/p/8689901720fd
Kafka最佳实践的更多相关文章
- 【译】Kafka最佳实践 / Kafka Best Practices
本文来自于DataWorks Summit/Hadoop Summit上的<Apache Kafka最佳实践>分享,里面给出了很多关于Kafka的使用心得,非常值得一看,今推荐给大家. 硬 ...
- window下Kafka最佳实践
Kafka的介绍和入门请看这里kafka入门:简介.使用场景.设计原理.主要配置及集群搭建(转) 当前文章从实践的角度为大家规避window下使用的坑. 1.要求: java 6+ 2.下载kafka ...
- 大规模使用 Apache Kafka 的20个最佳实践
必读 | 大规模使用 Apache Kafka 的20个最佳实践 配图来源:书籍<深入理解Kafka> Apache Kafka是一款流行的分布式数据流平台,它已经广泛地被诸如New Re ...
- Apache Kafka: 优化部署的10个最佳实践
原文作者:Ben Bromhead 译者:江玮 原文地址:https://www.infoq.com/articles/apache-kafka-best-practices-to-opti ...
- Kafka在大型应用中的 20 项最佳实践
原标题:Kafka如何做到1秒处理1500万条消息? Apache Kafka 是一款流行的分布式数据流平台,它已经广泛地被诸如 New Relic(数据智能平台).Uber.Square(移动支付公 ...
- Spring Boot 自定义kafka 消费者配置 ContainerFactory最佳实践
Spring Boot 自定义kafka 消费者配置 ContainerFactory最佳实践 本篇博文主要提供一个在 SpringBoot 中自定义 kafka配置的实践,想象这样一个场景:你的系统 ...
- Ubuntu14.04+RabbitMQ3.6.3+Golang的最佳实践
目录 [TOC] 1.RabbitMQ介绍 1.1.什么是RabbitMQ? RabbitMQ 是由 LShift 提供的一个 Advanced Message Queuing Protocol ...
- Rocketmq原理&最佳实践
MQ背景&选型 消息队列作为高并发系统的核心组件之一,能够帮助业务系统解构提升开发效率和系统稳定性.主要具有以下优势: 削峰填谷(主要解决瞬时写压力大于应用服务能力导致消息丢失.系统奔溃等问题 ...
- 结合异步模型,再次总结Netty多线程编码最佳实践
更多技术分享可关注我 前言 本文重点总结Netty多线程的一些编码最佳实践和注意事项,并且顺便对Netty的线程调度模型,和异步模型做了一个汇总.原文:结合异步模型,再次总结Netty多线程编码最 ...
随机推荐
- intellij idea maven springmvc 环境搭建
1. 新建maven 工程 intellij idea 默认已经集成了maven, 直接点击下一步 2. 配置文件修改 pom.xml 文件 <?xml version="1. ...
- Selenium常用方法及函数、txt参数化
常用方法及函数: 1.表单的提交方法:submit解释:查找到表单(from)直接调用submit即可实例:driver.find_element_by_id("form1").s ...
- Java 面向对象三大特征之一: 多态
多态与类型转换 子类重写父类方法 1)位置:子类和父类中有同名的方法 2)方法名相同,返回类型和修饰符相同,参数列表相同 方法体不同 多态的优势和应用场合 多态:同一个引用类型,使用不同的 ...
- shell 颜色控制系列
shell脚本里,经常用的颜色控制,如下 格式:echo -e "\033[字背景颜色:文字颜色m字符串\033[0m" eg:echo -e "\033[41;36m ...
- linux中权限对文件和目录的作用
chmod 755 a.txt 文件: r:读取文件内容(cat more head tail) w:编辑,新增,修改文件的内容(vi,echo) 不包括删除文件:原因是只能对文件内容进行修改,而在l ...
- Yii2 Restful Api 401
采用Yii2 Restful Api方式为APP提供数据,默认你已经做好了所有的编码和配置工作.采用Postman测试接口: 出现这个画面的一个可能原因是:access_token的写法有误,如果你使 ...
- nginx笔记2-负载均衡
负载均衡实现方式分为两类:1硬件类,2软件类. 硬件类:F5(这是一种硬件,并不是刷新啊,不要误解) 优点:非常快,可靠性高,并发量大.缺点:太贵,成本高,不方便,最致命的是不能将动态请求和静态请求 ...
- ubuntu配置
首先就是Ubuntu的更新源问题,需要更改,否则更新不了. 其次就是Securecrt的远程登陆问题,windows主机和ubuntu虚拟机如果能通信,要求在同一网段上,而ubuntu是动态加载,需要 ...
- 我的Java设计模式-单例模式
就算不懂设计模式的兄弟姐妹们,想必也听说过单例模式,并且在项目中也会用上.但是,真正理解和熟悉单例模式的人有几个呢?接下来我们一起来学习设计模式中最简单的模式之一--单例模式 一.为什么叫单例模式? ...
- linux下ffmpeg安装
1.ffmpeg下载地址: http://www.ffmpeg.org/download.html 2.解压 1 $ tar zvfj ffmpeg.tar.bz2 这里作者假设已经重命名为ffmpe ...