1.9 安全认证
是不是我们的集群所有人都可以随意访问呢?当然不是,为了集群的安全,我们需要进行权限认证,屏蔽非法操作。主要包括以下几个方面需要做安全认证:
(1)生产者权限认证;(2)消费者权限认证;(3)指定数据目录迁移安全认证;
1.10 集群容灾
跨机架容灾:官网地址:http://kafka.apache.org
跨集群/机房容灾:如果有异地双活等业务场景时,可以参考Kafka2.7版本的MirrorMaker 2.0。
GitHub地址: https://github.com 精确KIP地址 : https://cwiki.apache.org
ZooKeeper集群上Kafka元数据恢复:我们会定期对ZooKeeper上的权限信息数据做备份处理,当集群元数据异常时用于恢复。
1.11 参数/配置优化
broker服务参数优化:这里我只列举部分影响性能的核心参数。
num.network.threads #创建Processor处理网络请求线程个数,建议设置为broker当CPU核心数*2,这个值太低经常出现网络空闲太低而缺失副本。 num.io.threads #创建KafkaRequestHandler处理具体请求线程个数,建议设置为broker磁盘个数*2 num.replica.fetchers #建议设置为CPU核心数/4,适当提高可以提升CPU利用率及follower同步leader数据当并行度。 compression.type #建议采用lz4压缩类型,压缩可以提升CPU利用率同时可以减少网络传输数据量。 queued.max.requests #如果是生产环境,建议配置最少500以上,默认为500。 log.flush.scheduler.interval.ms log.flush.interval.ms log.flush.interval.messages #这几个参数表示日志数据刷新到磁盘的策略,应该保持默认配置,刷盘策略让操作系统去完成,由操作系统来决定什么时候把数据刷盘; #如果设置来这个参数,可能对吞吐量影响非常大; auto.leader.rebalance.enable #表示是否开启leader自动负载均衡,默认true;我们应该把这个参数设置为false,因为自动负载均衡不可控,可能影响集群性能和稳定;
生产优化:这里我只列举部分影响性能的核心参数。
linger.ms #客户端生产消息等待多久时间才发送到服务端,单位:毫秒。和batch.size参数配合使用;适当调大可以提升吞吐量,但是如果客户端如果down机有丢失数据风险; batch.size #客户端发送到服务端消息批次大小,和linger.ms参数配合使用;适当调大可以提升吞吐量,但是如果客户端如果down机有丢失数据风险; compression.type #建议采用lz4压缩类型,具备较高的压缩比及吞吐量;由于Kafka对CPU的要求并不高,所以,可以通过压缩,充分利用CPU资源以提升网络吞吐量; buffer.memory #客户端缓冲区大小,如果topic比较大,且内存比较充足,可以适当调高这个参数,默认只为33554432(32MB) retries #生产失败后的重试次数,默认0,可以适当增加。当重试超过一定次数后,如果业务要求数据准确性较高,建议做容错处理。 retry.backoff.ms #生产失败后,重试时间间隔,默认100ms,建议不要设置太大或者太小。
除了一些核心参数优化外,我们还需要考虑比如topic的分区个数和topic保留时间;如果分区个数太少,保留时间太长,但是写入数据量非常大的话,可能造成以下问题:
1)topic分区集中落在某几个broker节点上,导致流量副本失衡;2)导致broker节点内部某几块磁盘读写超负载,存储被写爆;
1.11.1 消费优化
消费最大的问题,并且经常出现的问题就是消费延时,拉历史数据。当大量拉取历史数据时将出现大量读盘操作,污染pagecache,这个将加重磁盘的负载,影响集群性能和稳定;
可以怎样减少或者避免大量消费延时呢?
当topic数据量非常大时,建议一个分区开启一个线程去消费;对topic消费延时添加监控告警,及时发现处理;当topic数据可以丢弃时,遇到超大延时,比如单个分区延迟记录超过千万甚至数亿,那么可以重置topic的消费点位进行紧急处理;【此方案一般在极端场景才使用】避免重置topic的分区offset到很早的位置,这可能造成拉取大量历史数据;
1.11.2 Linux服务器参数优化
我们需要对Linux的文件句柄、pagecache等参数进行优化。可参考《Linux Page Cache调优在Kafka中的应用》。
1.12.硬件优化
磁盘优化在条件允许的情况下,可以采用SSD固态硬盘替换HDD机械硬盘,解决机械盘IO性能较低的问题;如果没有SSD固态硬盘,则可以对服务器上的多块硬盘做硬RAID(一般采用RAID10),让broker节点的IO负载更加均衡。如果是HDD机械硬盘,一个broker可以挂载多块硬盘,比如 12块*4TB。
内存由于Kafka属于高频读写型服务,而Linux的读写请求基本走的都是Page Cache,所以单节点内存大一些对性能会有比较明显的提升。一般选择256GB或者更高。
网络提升网络带宽:在条件允许的情况下,网络带宽越大越好。因为这样网络带宽才不会成为性能瓶颈,最少也要达到万兆网络( 10Gb,网卡为全双工)才能具备相对较高的吞吐量。如果是单通道,网络出流量与入流量之和的上限理论值是1.25GB/s;如果是双工双通道,网络出入流量理论值都可以达到1.25GB/s。
网络隔离打标:由于一个机房可能既部署有离线集群(比如HBase、Spark、Hadoop等)又部署有实时集群(如Kafka)。那么实时集群和离线集群挂载到同一个交换机下的服务器将出现竞争网络带宽的问题,离线集群可能对实时集群造成影响。所以我们需要进行交换机层面的隔离,让离线机器和实时集群不要挂载到相同的交换机下。即使有挂载到相同交换机下面的,我们也将进行网络通行优先级(金、银、铜、铁)标记,当网络带宽紧张的时候,让实时业务优先通行。
CPUKafka的瓶颈不在CPU,单节点一般有32核的CPU都足够使用。
1.13.平台化
现在问题来了,前面我们提到很多监控、优化等手段;难道我们管理员或者业务用户对集群所有的操作都需要登录集群服务器吗?答案当然是否定的,我们需要丰富的平台化功能来支持。一方面是为了提升我们操作的效率,另外一方面也是为了提升集群的稳定和降低出错的可能。
配置管理黑屏操作,每次修改broker的server.properties配置文件都没有变更记录可追溯,有时可能因为有人修改了集群配置导致一些故障,却找不到相关记录。如果我们把配置管理做到平台上,每次变更都有迹可循,同时降低了变更出错的风险。
滚动重启当我们需要做线上变更时,有时候需要对集群对多个节点做滚动重启,如果到命令行去操作,那效率将变得很低,而且需要人工去干预,浪费人力。这个时候我们就需要把这种重复性的工作进行平台化,提升我们的操作效率。
集群管理集群管理主要是把原来在命令行的一系列操作做到平台上,用户和管理员不再需要黑屏操作Kafka集群;这样做主要有以下优点:
提升操作效率;操作出错概率更小,集群更安全;所有操作有迹可循,可以追溯;
集群管理主要包括:broker管理、topic管理、生产/消费权限管理、用户管理等
1.13.1 mock功能
在平台上为用户的topic提供生产样例数据与消费抽样的功能,用户可以不用自己写代码也可以测试topic是否可以使用,权限是否正常;在平台上为用户的topic提供生产/消费权限验证功能,让用户可以明确自己的账号对某个topic有没有读写权限;
1.13.2 权限管理
把用户读/写权限管理等相关操作进行平台化。
1.13.3 扩容/缩容
把broker节点上下线做到平台上,所有的上线和下线节点不再需要操作命令行。
1.13.4 集群治理
1)无流量topic的治理,对集群中无流量topic进行清理,减少过多无用元数据对集群造成的压力;2)topic分区数据大小治理,把topic分区数据量过大的topic(如单分区数据量超过100GB/天)进行梳理,看看是否需要扩容,避免数据集中在集群部分节点上;3)topic分区数据倾斜治理,避免客户端在生产消息的时候,指定消息的key,但是key过于集中,消息只集中分布在部分分区,导致数据倾斜;4)topic分区分散性治理,让topic分区分布在集群尽可能多的broker上,这样可以避免因topic流量突增,流量只集中到少数节点上的风险,也可以避免某个broker异常对topic影响非常大; 5)topic分区消费延时治理; 一般有延时消费较多的时候有两种情况,一种是集群性能下降,另外一种是业务方的消费并发度不够,如果是消费者并发不够的话 应该与业务联系增加消费并发。
1.13.5 监控告警
1)把所有指标采集做成平台可配置,提供统一的指标采集和指标展示及告警平台,实现一体化监控;2)把上下游业务进行关联,做成全链路监控;3)用户可以配置topic或者分区流量延时、突变等监控告警;
1.13.6 业务大屏
业务大屏主要指标:集群个数、节点个数、日入流量大小、日入流量记录、日出流量大小、日出流量记录、每秒入流量大小、每秒入流量记录、每秒出流量大小、每秒出流量记录、用户个数、生产延时、消费延时、数据可靠性、服务可用性、数据存储大小、资源组个数、topic个数、分区个数、副本个数、消费组个数等指标。
1.13.7 流量限制
把用户流量现在做到平台,在平台进行智能限流处理。
1.13.8 负载均衡
把自动负载均衡功能做到平台,通过平台进行调度和管理。
1.13.9 资源预算
当集群达到一定规模,流量不断增长,那么集群扩容机器从哪里来呢?业务的资源预算,让集群里面的多个业务根据自己在集群中当流量去分摊整个集群的硬件成本;当然,独立集群与独立隔离的资源组,预算方式可以单独计算。
1.14.性能评估
1.14.1 单broker性能评估
我们做单broker性能评估的目的包括以下几方面:
1)为我们进行资源申请评估提供依据;2)让我们更了解集群的读写能力及瓶颈在哪里,针对瓶颈进行优化;3)为我们限流阈值设置提供依据;4)为我们评估什么时候应该扩容提供依据;
1.14.2 topic分区性能评估
1)为我们创建topic时,评估应该指定多少分区合理提供依据;2)为我们topic的分区扩容评估提供依据;
1.14.3 单磁盘性能评估
1)为我们了解磁盘的真正读写能力,为我们选择更合适Kafka的磁盘类型提供依据;2)为我们做磁盘流量告警阈值设置提供依据;
1.14.4 集群规模限制摸底
1)我们需要了解单个集群规模的上限或者是元数据规模的上限,探索相关信息对集群性能和稳定性的影响;2)根据摸底情况,评估集群节点规模的合理范围,及时预测风险,进行超大集群的拆分等工作;
1.15 DNS+LVS的网络架构
当我们的集群节点达到一定规模,比如单集群数百个broker节点,那么此时我们生产消费客户端指定bootstrap.servers配置时,如果指定呢?是随便选择其中几个broker配置还是全部都配上呢?
其实以上做法都不合适,如果只配置几个IP,当我们配置当几个broker节点下线后,我们当应用将无法连接到Kafka集群;如果配置所有IP,那更不现实啦,几百个IP,那么我们应该怎么做呢?
方案:采用DNS+LVS网络架构,最终生产者和消费者客户端只需要配置域名就可以啦。需要注意的是,有新节点加入集群时,需要添加映射;有节点下线时,需要从映射中踢掉,否则这批机器如果拿到其他的地方去使用,如果端口和Kafka的一样的话,原来集群部分请求将发送到这个已经下线的服务器上来,造成生产环境重点故障。