Kafka设计理念

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/lzx_victory/article/details/80797697

前言

Kafka的定位:分布式流平台.
Kafka已经被广泛的用于商业生产活动,它的高性能与可靠性,保证了其消费生产的能力.

关键概念

事件流:无边界,有序,不可变,可重播.
流式处理:实时地处理一个或多个事件流.

kafka支持批次处理(一组消息).
kafka支持多种消息模式:JSON,XML等

主题和分区:主题类似于数据库的表,可以分为若干个分区,分区可以分布在不同的服务器上,消息通过分部到不同分区当中.

消费者:每个分区里的一个消息,只能被一个消费者消费,并保证整个群组对每个给定的消息只处理一次.
消费者群组:每个消费者都属于消费者群组,每个消费者群组有自己的群组协调器.
群组协调器:用来管理消费者消费情况以及消费者之间的关系.如果群组内的消费者发生崩溃,那么会将对于

偏移量:分区当前的位置,消费者用于检查是否为读取过的消息
提交:更新分区当前的位置

集群里的第一个启动broker:集群控制器,是集群的组成部分
broker:一个独立的kafka服务器
broker接收来自生产者的消息,为消息设置偏移量;为消费者提供服务,对读取分区的请求做出响应.
一个分区从属于一个broker,该broker称为首领.

分区复制:一个分区可以复制到多个broker,为消息提供冗余,提高可用性.消息复制机制只能在单个集群里运行

主题可以配置消息的保留策略.

kafka设计要点

1.Kafka作为一个消息系统,对消息的顺序性有强有力的保证,对于每个分区而言只能有一个消费者消费消息,这样简单的保证了每个消费者拿到的消息是这个分区的顺序的消息.相较于传统消息队列,每个消费队列有多个消费者,消费者收到消息可能是异步的,这样会导致每个消费者接收到的消息顺序可能会不一致.
2.Kafka作为一个存储系统,kafka可以做一个存储系统将消息存储到磁盘,以及进行备份.
3.消费者群组的出现并不对于单个分区消费能力有太大提升,但是提供了一种广播形式的消费模式.
4.Kafka使用零复制技术,直接把消息从Linux文件缓存当中发送到网络通道,不需要经过任何的缓冲区,避免了字节复制,提升了性能.
5.Kafka重要的性能能提升还有一点就是顺序写,将多条消息封装压缩发送并存储,减少了网络通信消耗,对文件追加写,这种方式要比数据库的随机写要快很多.

生产者

分区

消息中包含了:目标主题,键和值.
键的主要用途是:决定消息写入到那个分区,如果键不为null,kafka进行hash算法生成一个值,根据该值分配分区.
如果键值为空将会把消息随机分配分区,默认的分区器使用的是轮询算法.

分区是否可以新增?

之前已经说明了,分区是根据键的hash生成.如果新增分区,就不能保证同样的键分配到相同的分区.(ElasticSearch当中的分区也是一样) 所以设置好了分区的数量就不能改变.

消息发送的三种模式

发送并忘记:当发送以后,不关心消息是否到达
同步发送:通等待发送结果
异步发送:发送后等待回调函数.

这个可以根据业务的需要定制不同的消息发送模式.

消费者

消费者属于消费者群组.

一个消费者可以接收多个分区,一个分区不能分配于多个消费者.
一个消费者群组中消费者的数量大于分区数量,那么多余的消费者会被闲置.

一个主题可以被多个消费者群组进行消费.
不同的消费者群组会收到相同的消息,但是最终被消费者群组内的一个消费者消费.

群组协调器的broker 发送心跳来维持消费者和群组的从属关系以及消费者对分区所有权的关系.
群组协调器使用心跳检测的方式确保消费者正常工作,当其中一个消费者发生崩溃,会触发一次再均衡,当前消费者群组内每个消费者会被重新分配分区.

独立消费者

独立消费者存在的意义:订阅一个主题的所有分区或者一个分区消息.
这样做会使消费者不需要消费者群组也不再受到再均衡的影响.

broker

先介绍一下broker Controller选举机制,当控制器发生故障后,其它的broker节点会受到通知,其它的broker会试图让自己成为控制器.第一个在zookeeper里创建控制器节点的broker会成为控制器.
每次选举更新zookeeper 的epoch信息,通过epoch信息判断当前的控制器,也可防止脑裂的发生(两个broker都认为自己是控制器).

物理存储

Kafka基本存储单元是分区.
分区分配:随机选出一个broker,然后使用轮询的方式给每个broker分配分区的首领.如broker4是分区0的首领,broker5是分区1的首领.副本跟随者的分配在首领的下一个broker上. 如broker5分配分区0的跟随者.

每个分区被分成了若干个片段.默认情况下每个片段的大小是1G或者是一周的数据.
Kafka为每个分区维护了一个索引片段.索引把偏移量映射到片段文件和偏移量在文件的位置.索引也被分成多个片段,删除消息时也可以删除对应的片段.

可靠性保证

Kafka本身不支持”仅一次传递”,但是结合具有事务模型或者唯一键特性的外部存储系统,Kafka也可以实现”仅一次传递”.

同步副本充要条件:
1.与zookeeper之间有活跃的会话.
2.10s内从首领获取过消息
3.几乎零延迟.
如果不满足以上条件那么该副本称为不同步的.

broker配置

replication.factor 复制系数,决定了该主题会被复制N次,保证N-1broker失效情况下还能向主题中写入数据.
unclean.leader.election 不完全首领选举.跟随副本都是不同步的,如果这个时候首领发生崩溃且该参数为true,那么允许发生消息丢失的风险,将不同步的跟随者选举为首领.设置为false,那么会一直等待首领恢复,不会将不同步的副本选举为首领.
min.insync.replicas (主题或者broker级别) 最小同步副本,确保消息被写入的副本数.如果可以写入的副本数小于该配置,那么生成者无法将消息写入Kafka.

生产者配置

三种模式
1.acks=0 生产者发出的消息被就会被认为写入成功
2.acks=1 只需首领收到消息并把他写入到分区当中
3.acks=all 必须等待所有同步副本收到消息

我们也可以定生产者的重试次数,如果需要的话,消费者也需要从业务层级保证消息的幂等性.

消费者的配置

1.group.id 消费者群组的id,是指当前的消费者是否属于统一个群组
2.auto.offset.reset 偏移量不存在或者是没有偏移量可以提交时 earliest从最早的消息开始消费 lastest从最后的消息进行消费.
3.enable.auto.commit 开启自动提交偏移量,简化了偏移量处理的逻辑,但无法控制重复处理消息的问题
4.auto.commit.interval.ms 自动提交偏移量的频率

KafkaConnect

Connect:Kafka和外部数据存储系统之间移动提供了一种可靠且可伸缩的的方式.
例如我们可以将mysql的数据导入到ElasticSearch,我们不需要编写任何代码,只需要更改一些配置可以通过KafkaConnect将数据导入或者导出.

核心概念:
1.连接器和任务 连接器实现了ConnectAPI,决定执行多少个任务,从worker进程获取任务配置并传递下去.
2.任务负责将数据移入或者移出Kafka.
3.worker进程是连接器和人物的容器,负责REST API,配置管理,可靠性,高可用,伸缩性和负载均衡.
4.转化器:用于将数据保存到Kafka当中

重要参数设置

broker配置

1.broker.id broker的唯一标识符
2.port 端口
3.zookeeper.connect 指定zookeeper节点配置,可以配置多组 hostname:port/path;
4.logrids 存放消息的目录

topic配置

1.num.partitions 分区数量
2.log.retenion.ms 数据保留多长时间
3.log.retenion.bytes 设定字节大小判断消息是否过期 (log.retenion.ms和log.retenion.bytes任一个条件满足,日志就会被删除)
4.log.segment.bytes 日志片段的大小,如果超出指定大小当前日志片段会被关闭,新的日志片段会被打开
5.message.max.byte 单个消息最大字节数

生产者配置

1.acks 有多少个副本消息确认才会被认为写入成功,请见可靠性
2.buffer.memory 生产者缓冲区的大小
3.compression.type 压缩类型 snappy,gzip,lz4
4.retries 重试次数
5.batch.size 同一批次可发送消息的大小
6.linger.ms 只消息等待多长时间会被发送配合batch,size使用
7.client.id 用于标识消息的来源
8.timeout.ms 超时时间限制
9.max.request.size 单个请求的大小
10.receive.buffer.bytes & send.buffer.bytes TCP发送和接收缓冲区大小
11.max.in.flight.request.per.connection 生产者收到服务器相应之前可以发送多少个消息 如果设置为1那么确保消息是顺序写入

消费者的配置

1.fetch.min.bytes 最小获取记录的字节数
2.fetch.max wait.ms 最大等待时间
3.max.partition.fetch 每个分区返回给消费者最大的字节数
4.receive.buffer.bytes & send.buffer.bytes TCP发送和接收缓冲区大小
5.partition.assignment.strategy Range|Roudbin 默认的两个策略指定分配给消费者分区的方式
6.session.time.out 用于指定消费者允许最大断开的连接时间,如果超出就会被认定为死亡
7.client.id 用于标识客户端发送的消息
8.max.poll.records 最大拉取的数据量

内核参数调优

1.vm.swappniess 设置为1,防止发生内存溢出的情况导致OOM(Out of Memory Killer)
2.vm.dirty_background_ratio 刷新进程将脏页写入到磁盘,该值指的是系统内存的百分比,一般小于10,不能设置为0
3.vm.dirty_ratio 参数可以增加被内核进程刷新到磁盘脏页的数量,参数也是内存百分比 60-80是合理的区间
4.XFS 是推荐的文件系统,为挂载点设置noatime参数可以提高性能
5.net.core.wmem_default和net.core.rmem_default scoket读写缓存区 推荐 131072(128KB)
6.net.core.wmem_max和net.core.rmem_max 读写缓存区的最大值推荐 2097152(2MB)
7.net.ipv4.tcp_wmem与net.ipv4.tcp_rmem TCP socket读写缓冲区的参数由三个整数组成 (4096 65536 2048000) 分别表示最小值 默认值 最大值
8.net.ipv4.tcp_window_scaling 设置为1 开启TCP时间窗口
9.net.ipv4.tcp_max_syn_back_log 设置比1024更大的值,可接受更多的连接
10.net.core.netdev_max_backlog 设置为比1000更大的值,更好的应对网络流量爆发

猜你喜欢

转载自blog.csdn.net/lzx_victory/article/details/80797697