皇冠体育寻求亚洲战略合作伙伴,皇冠代理招募中,皇冠平台开放会员注册、充值、提现、电脑版下载、APP下载。

首页快讯正文

usdt不用实名(www.caibao.it):Apache Kafka 集群部署指南

admin2021-03-0289

USDT自动充值

菜宝钱包(caibao.it)是使用TRC-20协议的Usdt第三方支付平台,Usdt收款平台、Usdt自动充提平台、usdt跑分平台。免费提供入金通道、Usdt钱包支付接口、Usdt自动充值接口、Usdt无需实名寄售回收。菜宝Usdt钱包一键生成Usdt钱包、一键调用API接口、一键无实名出售Usdt。

原题目:Apache Kafka 集群部署指南

Kafka基础

新闻系统的作用

应该大部门小伙伴都清晰,用机油装箱举个例子。

以是新闻系统就是如上图我们所说的堆栈,能在中心历程作为缓存,而且实现解耦合的作用。

引入一个场景,我们知道中国移动,中国联通,中国电信的日志处置,是交给外包去做大数据剖析的,假设现在它们的日志都交给了你做的系统去做用户画像剖析。

凭据刚刚前面提到的新闻系统的作用,我们知道了新闻系统实在就是一个模拟缓存,且仅仅是起到了缓存的作用而并不是真正的缓存,数据仍然是存储在磁盘上面而不是内存。

Topic主题

Kafka学习了数据库内里的设计,在内里设计了topic(主题),这个器械类似于关系型数据库的表。

此时我需要获取中国移动的数据,那就直接监听TopicA即可。

Partition分区

kafka另有一个观点叫Partition(分区),分区详细在服务器上面显示早先就是一个目录,一个主题下面有多个分区,这些分区会存储到差别的服务器上面,或者说,实在就是在差别的主机上建了差别的目录。这些分区主要的信息就存在了.log文件内里。跟数据库内里的分区差不多,是为了提高性能。

至于为什么提高了性能,很简朴,多个分区多个线程,多个线程并行处置一定会比单线程好得多。

Topic和partition像是HBASE里的table和region的观点,table只是一个逻辑上的观点,真正存储数据的是region,这些region会漫衍式地存储在各个服务器上面,对应于Kafka,也是一样,Topic也是逻辑观点,而partition就是漫衍式存储单元。这个设计是保证了海量数据处置的基础。我们可以对比一下,若是HDFS没有block的设计,一个100T的文件也只能单独放在一个服务器上面,那就直接占满整个服务器了,引入block后,大文件可以涣散存储在差别的服务器上。

注重:

Producer - 生产者

往新闻系统内里发送数据的就是生产者。

Consumer - 消费者

从Kafka里读取数据的就是消费者。

Message - 新闻

Kafka内里的我们处置的数据叫做新闻。

Kafka的集群架构

确立一个TopicA的主题,3个分区划分存储在差别的服务器,也就是broker下面。Topic是一个逻辑上的观点,并不能直接在图中把Topic的相关单元画出。

需要注重:Kafka在0.8版本以前是没有副本机制的,以是在面临服务器宕机的突 *** 形时会丢失数据,以是只管制止使用这个版本之前的Kafka。

Replica - 副本

Kafka中的partition为了保证数据平安,以是每个partition可以设置多个副本。

此时我们对分区0,1,2划分设置3个副本(实在设置两个副本是对照合适的)。

而且实在每个副本都是有角色之分的,它们会选取一个副本作为leader,而其余的作为follower,我们的生产者在发送数据的时刻,是直接发送到leader partition内里,然后follower partition会去leader那里自行同步数据,消费者消费数据的时刻,也是从leader那去消费数据的。

Consumer Group - 消费者组

我们在消费数据时会在代码内里指定一个group.id,这个id代表的是消费组的名字,而且这个group.id就算不设置,系统也会默认设置。

conf.setProperty( , )

我们所熟知的一些新闻系统一样平常来说会这样设计,就是只要有一个消费者去消费了新闻系统内里的数据,那么其余所有的消费者都不能再去消费这个数据。可是Kafka并不是这样,好比现在consumerA去消费了一个topicA内里的数据。

consumerA:

group.id = a

consumerB:

group.id = a

consumerC:

group.id = b

consumerD:

group.id = b

再让consumerB也去消费TopicA的数据,它是消费不到了,然则我们在consumerC中重新指定一个另外的group.id,consumerC是可以消费到topicA的数据的。而consumerD也是消费不到的,以是在Kafka中,差别组可有唯一的一个消费者去消费统一主题的数据。

以是消费者组就是让多个消费者并行消费信息而存在的,而且它们不会消费到统一个新闻,如下,consumerA,B,C是不会相互滋扰的。

consumer group:a

consumerA

consumerB

consumerC

如图,由于前面提到过了消费者会直接和leader确立联系,以是它们划分消费了三个leader,以是一个分区不会让消费者组内里的多个消费者去消费,然则在消费者不饱和的情形下,一个消费者是可以去消费多个分区的数据的。

Controller

熟知一个纪律:在大数据漫衍式文件系统内里,95%的都是主从式的架构,个别是对等式的架构,好比ElasticSearch。

Kafka也是主从式的架构,主节点就叫controller,其余的为从节点,controller是需要和ZooKeeper举行配合治理整个Kafka集群。

Kafka和ZooKeeper若何配合事情

Kafka严重依赖于ZooKeeper集群。所有的broker在启动的时刻都市往ZooKeeper举行注册,目的就是选举出一个controller,这个选举历程异常简朴粗暴,就是一个谁先谁当的历程,不涉及什么算法问题

那成为controller之后要做啥呢,它会监听ZooKeeper内里的多个目录,例如有一个目录/brokers/,其他从节点往这个目录上注册(就是往这个目录上确立属于自己的子目录而已)自己,这时命名规则一样平常是它们的id编号,好比/brokers/0,1,2。

注册时各个节点必定会露出自己的主机名,端口号等等的信息,此时controller就要去读取注册上来的从节点的数据(通过监听机制),天生集群的元数据信息,之后把这些信息都分发给其他的服务器,让其他服务器能感知到集群中其它成员的存在。

此时模拟一个场景,我们确立一个主题(实在就是在ZooKeeper上/topics/topicA这样确立一个目录而已),Kafka会把分区方案天生在这个目录中,此时controller就监听到了这一改变,它会去同步这个目录的元信息,然后同样下放给它的从节点,通过这个方式让整个集群都得知这个分区方案,此时从节点就各自确立好目录守候确立分区副本即可。这也是整个集群的治理机制。

加餐时间

Kafka性能幸亏什么地方?

操作系统每次从磁盘读写数据的时刻,需要先寻址,也就是先要找到数据在磁盘上的物理位置,然后再举行数据读写,若是是机械硬盘,寻址就需要较长的时间。

Kafka的设计中,数据实在是存储在磁盘上面,一样平常来说,会把数据存储在内存上面性能才会好。然则Kafka用的是顺序写,追加数据是追加到末尾,磁盘顺序写的性能极高,在磁盘个数一定,转数到达一定的情形下,基本和内存速率一致。

随机写的话是在文件的某个位置修改数据,性能会较低。

先来看看非零拷贝的情形。

可以看到数据的拷贝从内存拷贝到Kafka服务历程那块,又拷贝到socket缓存那块,整个历程花费的时间对照高,Kafka利用了Linux的sendFile手艺(NIO),省去了历程切换和一次数据拷贝,让性能变得更好。

日志分段存储

Kafka划定了一个分区内的.log文件最大为1G,做这个限制目的是为了方便把.log加载到内存去操作。

这个9936472之类的数字,就是代表了这个日志段文件里包罗的起始offset,也就说明这个分区里至少都写入了靠近1000万条数据了。Kafka broker有一个参数,log.segment.bytes,限制了每个日志段文件的巨细,最大就是1GB,一个日志段文件满了,就自动开一个新的日志段文件来写入,制止单个文件过大,影响文件的读写性能,这个历程叫做log rolling,正在被写入的谁人日志段文件,叫做active log segment。

若是人人有看前面的两篇有关于HDFS的文章时,就会发现NameNode的edits log也会做出限制,以是这些框架都是会思量到这些问题。

Kafka的网络设计

Kafka的网络设计和Kafka的调优有关,这也是为什么它能支持高并发的缘故原由。

首先客户端发送请求所有会先发送给一个Acceptor,broker内里会存在3个线程(默认是3个),这3个线程都是叫做processor,Acceptor不会对客户端的请求做任何的处置,直接封装成一个个socketChannel发送给这些processor形成一个行列,发送的方式是轮询,就是先给第一个processor发送,然后再给第二个,第三个,然后又回到第一个。消费者线程去消费这些socketChannel时,会获取一个个request请求,这些request请求中就会伴随着数据。

线程池内里默认有8个线程,这些线程是用来处置request的,剖析请求,若是request是写请求,就写到磁盘里。读的话返回效果。

processor会从response中读取响应数据,然后再返回给客户端。这就是Kafka的网络三层架构。

以是若是我们需要对Kafka举行增强调优,增添processor并增添线程池内里的处置线程,就可以到达效果。request和response那一块部门实在就是起到了一个缓存的效果,是思量到processor们天生请求太快,线程数不够不能及时处置的问题。

以是这就是一个加强版的reactor网络线程模子。

Kafka的生产集群部署

方案靠山

假设天天集群需要承载10亿数据。一天24小时,晚上12点到破晓8点险些没若干数据。

使用二八规则估量,也就是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方面

,

Usdt第三方支付接口

菜宝钱包(caibao.it)是使用TRC-20协议的Usdt第三方支付平台,Usdt收款平台、Usdt自动充提平台、usdt跑分平台。免费提供入金通道、Usdt钱包支付接口、Usdt自动充值接口、Usdt无需实名寄售回收。菜宝Usdt钱包一键生成Usdt钱包、一键调用API接口、一键无实名出售Usdt。

,

部署Kafka,Hadoop,MySQL……等焦点漫衍式系统,一样平常建议直接接纳物理机,甩掉使用一些低设置的虚拟机的想法。高并发这个器械,不可能是说,你需要支持6万QPS,你的集群就刚好把这6万并发卡的死死的。如果某一天出一些流动让数据量疯狂上涨,那整个集群就会垮掉。

然则,如果说你只要支持6w QPS,单台物理机自己就能扛住4~5万的并发。以是这时2台物理机绝对绝对够了。然则这里有一个问题,我们通常是建议,公司预算足够,只管是让岑岭QPS控制在集群能承载的总QPS的30%左右(也就是集群的处置能力是岑岭期的3~4倍这个样子),以是我们搭建的kafka集群能承载的总QPS为20万~30万才是平安的。以是大体上来说,需要5~7台物理机来部署,基本上就很平安了,每台物理机要求吞吐量在每秒4~5万条数据就可以了,物理机的设置和性能也不需要稀奇高。

磁盘方面

需要5台物理机的情形,需要存储276T的数据,平均下来差不多一台56T的数据。这个详细看磁盘数和盘的巨细。

现在我们需要思量一个问题:是需要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】

默认是 ,意思就是只能选举ISR列内外的follower成为新的leader,1.0版本后才设为 ,之前都是 ,允许非ISR列表的follower选举为新的leader

【delete.topic.enable】

默认 ,允许删除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

将该下令修改一下

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

This is a message

This is another message

消费信息

bin/kafka-console-consumer.sh --bootstrap-server localhost:9092 --topic --from-beginning

This is a message

This is another message

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

不外这存在着一些问题,ZooKeeper自己有一个过半服务的特征,这是一个限制,过半服务是指任何的请求都需要半数节点赞成才气执行。每次有写请求,它都要投票,由于它要保持数据的强一致性,做到节点状态同步,以是高并发写的性能欠好。不适合做高并发的事。ZooKeeper是Kafka存储元数据和交流集群信息的工具,主要是处置漫衍式一致性的问题。

集群测试

下面的下令就是生产50W条数据,每条数据200字节,这条下令一运行就会发生一条讲述,可以很直观的看到集群性能,看不懂的情形搜索引擎也可以很好地辅助你解决问题。

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

KafkaManager

KafkaManager使用scala写的项目,异常不错。使用方式可以通过搜索引擎查找。

安装步骤可以参考:https://www.cnblogs.com/dadonggg/p/8205302.html

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

功效先容:

  • 便捷的检查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这些,酌情使用。

网友评论