Kafka是分布式发布-订阅消息系统,最初由LinkedIn公司开发,之后成为Apache项目的一部分。Kafka是一种快速、可扩展的、分布式的、分区的和可复制的提交日志服务。目前在互联网公司使用非常广泛,已经成为大数据分析的基础服务。
Kafka部署配置包含三个部分,分别是操作系统、ZooKeeper、Kafka。
操作系统
常见的操作系统是CentOS或RedHat,版本号有6.4、7.2、7.4等,集群起始机器配置一般是3台或者5台,Kafka与ZooKeeper分别部署在不同的机器上。
为避免Kafka报”Too many open files”错误,Kafka的limits文件配置“kafka.conf”,部署在路径“/etc/security/limits.d”下,Kafka服务必须配置完后启动才能生效。
kafka.conf
=====================
kafka hard nofile 100000
kafka soft nofile 100000
=====================
为了提高Kafka的性能,/etc/sysctl.conf文件需增加以下配置:
=====================
vm.swappiness=1//物理内存使用率超过99%时,使用swap分区,这样避免使用swap分区,否则影响性能。
vm.dirty_background_ratio=5//脏页达到系统内存5%时,后台刷新页面
vm.dirty_ratio=70//脏页占到系统内存70%时,刷新进磁盘
vm.max_map_count=262144//允许一个进程在虚拟内存区域的最大数量
net.core.wmen_default=131072//socket写缓冲区
net.core.rmem_default=131072//socket读缓冲区
net.core.wmen_max=2097152//socket最大写缓冲区
net.core.rmem_max=2097152//socket最大读缓冲区
=====================
ZooKeeper的limits文件配置如附件“zookeeper.conf”, 部署在路径“/etc/security/limits.d”下,ZooKeeper服务必须配置完后启动才能生效。
zookeeper.conf
=======================
zookeeper hard nofile 81920
zookeeper soft nofile 81920
=======================
ZooKeeper
目前ZooKeeper的稳定版本是3.4.13,对应的配置文件如文件“zookeeper.cfg”,一般部署在/etc/zookeeper路径下。
zookeeper.cfg
=========================
tickTime=2000 //最小时间单元,单位毫秒
initLimit=10//Follower启动,与Leader同步的时间倍数
syncLimit=5//Leader与Follower之间进行心跳检测的最大延时时间倍数
dataDir=$dir1/zookeeper//快照文件存储路径
dataLogDir=$dir2/zookeeper//事务日志文件存储路径
clientPort=2181//客户端端口
maxClientCnxns=60//单个客户端IP最大连接数
autopurge.snapRetainCount=10//自动清理快照文件保存个数
autopurge.purgeInterval=24//自动清理时间间隔,单位小时
server.1=zoo1.example.com:2888:3888//机器名:节点通信端口:选举端口
server.2=zoo2.example.com:2888:3888
server.3=zoo3.example.com:2888:3888
server.4=zoo4.example.com:2888:3888
server.5=zoo5.example.com:2888:3888
=========================
Kafka
Kafka使用的版本以0.10.2为例,对应的配置文件如附件“server.properties”,一般部署在/etc/kafka路径下。
server.properties
==========================
broker.id=$id //Broker的标识符
delete.topic.enable=true //打开删除Topic
auto.create.topics.enable=false //关闭自动创建Topic
listeners=PLAINTEXT://$ip:9092 //使用的协议及监听端口
advertised.listeners=PLAINTEXT://$ip:9092//使用的协议及监听端口
num.network.threads=3 //处理网络请求的网络线程数
num.io.threads=8 //处理网络请求的IO线程数
num.replica.fetchers=4 //Follower复制Leader消息的线程数
socket.send.buffer.bytes=102400 //Socket发送Buffer大小
socket.receive.buffer.bytes=102400 //网络请求Socket接受Buffer大小
socket.request.max.bytes=104857600 //Socket请求的最大大小
message.max.bytes=20000000 //消息的最大大小,默认1M,调整为20M,有些日志会很大
log.dirs=$dir/kafka //日志存放的路径
num.partitions=$broker_num * 2 //Topic的分区数,两倍的Broker数量
num.recovery.threads.per.data.dir=1 //服务器启动和关闭时,打开和关闭日志片段的线程数
log.retention.hours=72 //日志的保存时间,单位小时,历史配置
log.segment.bytes=1073741824 //日志分段的大小,默认1G
log.retention.check.interval.ms=300000 //日志保存时间的检查间隔
log.cleaner.enable=true //打开日志清理进程
log.retention.bytes=26843545600 //日志保留大小,25G
zookeeper.connect=$ip1:2181,$ip2:2181,$ip3:2181,$ip4:2181,$ip5:2181/$chroot//连接的ZooKeeper及根路径
zookeeper.connection.timeout.ms=15000//ZooKeeper连接超时时间
zookeeper.session.timeout.ms=30000 //ZooKeeper会话超时时间
default.replication.factor=2 //Topic副本数,默认为1,对数据可用性要求高可设为3,节省磁盘使用2
replica.lag.time.max.ms=10000 //Leader从ISR中移除Follower的时间(Follower没有发送同步Leader请求或者没有同步完Leader的日志)
replica.fetch.wait.max.ms=500 //Follower同步Leader的最大等待时间
replica.socket.receive.buffer.bytes=65536//Socket接受网络请求的Buffer
replica.fetch.max.bytes=20000000 //Follower同步Leader的最大消息大小
replica.socket.timeout.ms=30000 //副本Socket超时时间
unclean.leader.election.enable=true //允许不在ISR中的Follower被选举为Leader
min.insync.replicas=1//最少与Leader同步的副本数
============================
如果有疑问或者不同观点,请在评论区留言,欢迎交流!