Kafka的集群部署实践及运维相关

上一篇 Kafka 的文章《大白话带你认识Kafka》中咱们应该已经了解了一些关于基础角色和集群架构相关的问题,这时候咱们应该很想了解一下如何构建生产中的Kafka集群或者一些相关的运维工具,因此就应运而生了下文。php

Kafka的生产集群部署html

方案背景java

假设天天集群须要承载10亿数据。一天24小时,晚上12点到凌晨8点几乎没多少数据。bootstrap

使用二八法则估计,也就是80%的数据(8亿)会在16个小时涌入,并且8亿的80%的数据(6.4亿)会在这16个小时的20%时间(3小时)涌入。安全

QPS计算公式:640000000 ÷ (3x60x60) = 60000,也就是说高峰期的时候Kafka集群要扛住每秒6万的并发。服务器

磁盘空间计算,天天10亿数据,每条50kb,也就是46T的数据。保存2个副本(在上一篇中也提到过其实两个副本会比较好,由于follower须要去leader那里同步数据,同步数据的过程须要耗费网络,并且须要磁盘空间,可是这个须要根据实际状况考虑),46 * 2 = 92T,保留最近3天的数据。故须要 92 * 3 = 276T。网络

QPS方面架构

部署Kafka,Hadoop,MySQL……等核心分布式系统,通常建议直接采用物理机,抛弃使用一些低配置的虚拟机的想法。高并发这个东西,不多是说,你须要支撑6万QPS,你的集群就恰好把这6万并发卡的死死的。加入某一天出一些活动让数据量疯狂上涨,那整个集群就会垮掉。并发

可是,假如说你只要支撑6w QPS,单台物理机自己就能扛住4~5万的并发。因此这时2台物理机绝对绝对够了。可是这里有一个问题,咱们一般是建议,公司预算充足,尽可能是让高峰QPS控制在集群能承载的总QPS的30%左右(也就是集群的处理能力是高峰期的3~4倍这个样子),因此咱们搭建的kafka集群能承载的总QPS为20万~30万才是安全的。因此大致上来讲,须要5~7台物理机来部署,基本上就很安全了,每台物理机要求吞吐量在每秒4~5万条数据就能够了,物理机的配置和性能也不须要特别高。app

磁盘方面

磁盘数量

须要5台物理机的状况,须要存储276T的数据,平均下来差很少一台56T的数据。这个具体看磁盘数和盘的大小。

SAS仍是SSD

如今咱们须要考虑一个问题:是须要SSD固态硬盘,仍是普通机械硬盘?

SSD就是固态硬盘,比机械硬盘要快,那么究竟是快在哪里呢?其实SSD的快主要是快在磁盘随机读写,就要对磁盘上的随机位置来读写的时候,SSD比机械硬盘要快。好比说MySQL这种就应该使用SSD了(MySQL须要随机读写)。好比说咱们在规划和部署线上系统的MySQL集群的时候,通常来讲必须用SSD,性能能够提升不少,这样MySQL能够承载的并发请求量也会高不少,并且SQL语句执行的性能也会提升不少。

由于写磁盘的时候Kafka是顺序写的。机械硬盘顺序写的性能机会跟内存读写的性能是差很少的,因此对于Kafka集群来讲其实使用机械硬盘就能够了。若是是须要本身创业或者是在公司成本不足的状况下,经费是可以缩减就尽可能缩减的。

内存角度

JVM很是怕出现full gc的状况。Kafka自身的JVM是用不了过多堆内存的,由于Kafka设计就是规避掉用JVM对象来保存数据,避免频繁full gc致使的问题,因此通常Kafka自身的JVM堆内存,分配个10G左右就够了,剩下的内存所有留给OS cache。

那服务器须要多少内存呢。咱们估算一下,大概有100个topic,因此要保证有100个topic的leader partition的数据在操做系统的内存里。100个topic,一个topic有5个partition。那么总共会有500个partition。每一个partition的大小是1G(在上一篇中的日志分段存储中规定了.log文件不能超过1个G),咱们有2个副本,也就是说要把100个topic的leader partition数据都驻留在内存里须要1000G的内存。

咱们如今有5台服务器,因此平均下来天天服务器须要200G的内存,可是其实partition的数据咱们不必全部的都要驻留在内存里面,只须要25%的数据在内存就行,200G * 0.25 = 50G就能够了(由于在集群中的生产者和消费者几乎也算是实时的,基本不会出现消息积压太多的状况)。因此一共须要60G(附带上刚刚的10G Kafka服务)的内存,故咱们能够挑选64G内存的服务器也行,大不了partition的数据再少一点在内存,固然若是可以提供128G内存那就更好。

CPU core

CPU规划,主要是看你的这个进程里会有多少个线程,线程主要是依托多核CPU来执行的,若是你的线程特别多,可是CPU核不多,就会致使你的CPU负载很高,会致使总体工做线程执行的效率不过高,上一篇的Kafka的网络设计中讲过Kafka的Broker的模型。acceptor线程负责去接入客户端的链接请求,可是他接入了以后其实就会把链接分配给多个processor,默认是3个,可是通常生产环境建议你们仍是多加几个,总体能够提高kafka的吞吐量好比说你能够增长到6个,或者是9个。另外就是负责处理请求的线程,是一个线程池,默认是8个线程,在生产集群里,建议你们能够把这块的线程数量稍微多加个2倍~3倍,其实都正常,好比说搞个16个工做线程,24个工做线程。

后台会有不少的其余的一些线程,好比说按期清理7天前数据的线程,Controller负责感知和管控整个集群的线程,副本同步拉取数据的线程,这样算下来每一个broker起码会有上百个线程。根据经验4个CPU core,通常来讲几十个线程,在高峰期CPU几乎都快打满了。8个CPU core,也就可以比较宽裕的支撑几十个线程繁忙的工做。因此Kafka的服务器通常是建议16核,基本上能够hold住一两百线程的工做。固然若是能够给到32 CPU core那就最好不过了。

网卡

如今的网基本就是千兆网卡(1GB / s),还有万兆网卡(10GB / s)。kafka集群之间,broker和broker之间是会作数据同步的,由于leader要同步数据到follower上去,他们是在不一样的broker机器上的,broker机器之间会进行频繁的数据同步,传输大量的数据。那每秒两台broker机器之间大概会传输多大的数据量?

高峰期每秒大概会涌入6万条数据,约天天处理10000个请求,每一个请求50kb,故每秒约进来488M数据,咱们还有副本同步数据,故高峰期的时候须要488M * 2 = 976M/s的网络带宽,因此在高峰期的时候,使用千兆带宽,网络仍是很是有压力的。

综上描述

10亿数据,6w/s的吞吐量,276T的数据,5台物理机
硬盘:11(SAS) * 7T,7200转
内存:64GB/128GB,JVM分配10G,剩余的给os cache
CPU:16核/32核
网络:千兆网卡,万兆更好

Kafka的集群搭建

进到Kafka的config文件夹下,会发现有不少不少的配置文件,但是都不须要你来修改,你仅仅须要点开一个叫做server.properties的文件就够了。

【broker.id】
每一个broker都必须本身设置的一个惟一id,能够在0~255之间

【log.dirs】
这个极为重要,Kafka的全部数据就是写入这个目录下的磁盘文件中的,若是说机器上有多块物理硬盘,那么能够把多个目录挂载到不一样的物理硬盘上,而后这里能够设置多个目录,这样Kafka能够数据分散到多块物理硬盘,多个硬盘的磁头能够并行写,这样能够提高吞吐量。ps:多个目录用英文逗号分隔

【zookeeper.connect】
链接Kafka底层的ZooKeeper集群的

【Listeners】
broker监听客户端发起请求的端口号,默认是9092

【num.network.threads】默认值为3
【num.io.threads】默认值为8
细心的朋友们应该已经发现了,这就是上一篇咱们在网络架构上提到的processor和处理线程池的线程数目。
因此说掌握Kafka网络架构显得尤其重要。
如今你看到这两个参数,就知道这就是Kafka集群性能的关键参数了

【unclean.leader.election.enable】
默认是false,意思就是只能选举ISR列表里的follower成为新的leader,1.0版本后才设为false,以前都是true,容许非ISR列表的follower选举为新的leader

【delete.topic.enable】
默认true,容许删除topic

【log.retention.hours】
能够设置一下,要保留数据多少个小时,这个就是底层的磁盘文件,默认保留7天的数据,根据本身的需求来就好了

【min.insync.replicas】
acks=-1(一条数据必须写入ISR里全部副本才算成功),你写一条数据只要写入leader就算成功了,不须要等待同步到follower才算写成功。可是此时若是一个follower宕机了,你写一条数据到leader以后,leader也宕机,会致使数据的丢失。

由于实际的集群搭建说真的没有太大难度,因此搭建的过程就不详细展开了,网上应该不少相关资料。

Kafka的简单集群操做

在操做Kafka集群的时候,不一样的Kafka版本命令的写法是不同的,因此其实若是须要了解一下,推荐直接到官网去查看。

上一篇时也有提到说Kafka在0.8版本之前存在比较大的问题,1.x的算是目前生产环境中使用较多的版本。

在quickStart就能看到相关的命令,好比:

建立主题

bin/kafka-topics.sh --create --zookeeper localhost:2181 --replication-factor 1 --partitions 1 --topic test
将该命令修改一下

zookeeper localhost:2181 --replication-factor 2 --partitions 2 --topic tellYourDream
这时候就是zookeeper的地址为localhost:2181
两个分区,两个副本,一共4个副本,topic名称为“tellYourDream”了




还得注意,通常来讲设置分区数建议是节点的倍数,这是为了让服务节点分配均衡的举措。

查看主题

bin/kafka-topics.sh --list --zookeeper localhost:2181

生产信息

bin/kafka-console-producer.sh --broker-list localhost:9092 --topic test
This is a message
This is another message

消费信息

bin/kafka-console-consumer.sh --bootstrap-server localhost:9092 --topic test --from-beginning
This is a message
This is another message

这里有个细节须要说起一下,就是咱们0.8版本的Kafka找的是ZooKeeper,ZooKeeper上确实是也存在着元数据信息。

不过这存在着一些问题,ZooKeeper自己有一个过半服务的特性,这是一个限制,过半服务是指任何的请求都须要半数节点赞成才能执行。每次有写请求,它都要投票,由于它要保持数据的强一致性,作到节点状态同步,因此高并发写的性能很差。不适合作高并发的事。ZooKeeper是Kafka存储元数据和交换集群信息的工具,主要是处理分布式一致性的问题。

集群测试

下面的命令就是生产50W条数据,每条数据200字节,这条命令一运行就会产生一条报告,能够很直观的看到集群性能,看不懂的状况搜索引擎也能够很好地帮助你解决问题。

测试生产数据
bin/kafka-producer-perf-test.sh --topic test-topic --num-records 500000 --record-size 200 --throughput -1 --producer-props bootstrap.servers=hadoop03:9092,hadoop04:9092,hadoop05:9092 acks=-1

每次消费2000条,集群没跑挂那就稳妥了。

测试消费数据
bin/kafka-consumer-perf-test.sh --broker-list hadoop03:9092,hadoop04:9092,hadoop53:9092 --fetch-size 2000 --messages 500000 --topic test-topic

KafkaManager

KafkaManager使用scala写的项目。安装步骤能够参考:https://www.cnblogs.com/dadonggg/p/8205302.html,很是不错。使用方法能够经过搜索引擎查找。

安装好了以后可使用jps命令查看一下,会多出一个名字叫作ProdServerStart的服务。

功能介绍:

  • 管理多个Kafka集群

  • 便捷的检查Kafka集群状态(topics,brokers,备份分布状况,分区分布状况)

  • 选择你要运行的副本

  • 基于当前分区情况进行

  • 能够选择topic配置并建立topic(0.8.1.1和0.8.2的配置不一样)

  • 删除topic(只支持0.8.2以上的版本而且要在broker配置中设置delete.topic.enable=true)

  • Topic list会指明哪些topic被删除(在0.8.2以上版本适用)

  • 为已存在的topic增长分区

  • 为已存在的topic更新配置

  • 在多个topic上批量重分区

  • 在多个topic上批量重分区(可选partition broker位置)

KafkaOffsetMonitor

KafkaOffsetMonitor就是一个jar包而已,是一个针对于消费者的工具。它能够用于监控消费延迟的问题,不过对于重复消费和消息丢失等就没法解决,由于以后若是须要讲解SparkStreaming,flink这些用于消费者的实践的话,会使用到这个工具,因此如今先不展开,了解一下便可。

启动命令:

java -cp KafkaOffsetMonitor-assembly-0.3.0-SNAPSHOT.jar \
 com.quantifind.kafka.offsetapp.OffsetGetterWeb \
 --offsetStorage kafka \
 --zk xx:2181,xx:2181,xx:2181/kafka_cluster \
 --port 8088 \
 --refresh 60.seconds \
 --retain 2.days

还有一些跨机房同步数据的像MirrorMaker这些,酌情使用。

文章来源:https://juejin.im/post/6844904001989771278

Kubernetes管理员认证(CKA)培训

本次CKA培训将于11月20到22日在北京开课,培训基于最新考纲,经过线下授课、考题解读、模拟演练等方式,帮助学员快速掌握Kubernetes的理论知识和专业技能,并针对考试作特别强化训练,让学员能从容面对CKA认证考试,使学员既能掌握Kubernetes相关知识,又能经过CKA认证考试,学员可屡次参加培训,直到经过认证。点击下方图片或者阅读原文连接查看详情。