摸鱼大数据——Kafka——Kafka核心概念二

Kafka的分片与副本机制

  • 分片:对于分布式的系统,可以将大规模的数据分开存储,比如hdfs上会把数据分成不同的block分别存储在不同的datanode上,即提高了存储能力又降低了复杂度,同时可以提高数据处理的并发能力

  • 副本:对于分布式的系统,数据分散保存出现风险的机率高,有一个节点出现问题,数据就不完整了,所以可以利用副本的机制提高容错

  • 在Kafka中一个主题可以有多个分区,分区的数量建议是不要超过broker数量的3倍,可以更好的利用硬件资源,提高并行效率

  • 一个分区可以设置多个副本,建议副本数不超过3个,即可以满足数据的容错,又不会太过影响性能

  • 副本在broker数量满足的情况下会尽量分布在不同的broker上

  • 副本之间会通过内部机制选举一个Leader副本,剩下的是follow副本,数据会首先写入,然后Leader会自动同步数据给follow副本

  • 一般情况下Kafka集群也就是3、5、7台就够了,如果数据量特别大的,还可以搭建多个Kafka集群

分区有什么用呢?

 作用:
 1- 避免单台服务器容量的限制: 每台服务器的磁盘存储空间是有上限。Topic分成多个Partition分区,可以避免单个Partition的数据大小过大,导致服务器无法存储。利用多台服务器的存储能力,提升Topic的数据存储效率。
 ​
 2- 提升Topic的吞吐量(数据读写速度): 利用多台服务器的数据读写能力、网络等资源
 ​
 ​
 分区的数量有没有限制?
 ​
 没有限制,分区数量和Kafka集群中的broker节点个数没有任何关系。在实际工作推荐Topic的分区数量不要超过Kafka集群中的broker节点个数的3倍,这只是一个推荐/经验值。

副本有什么用呢?

 作用: 通过多副本的机制,提升数据安全性。但是副本过多,会导致冗余(重复)的数据过多
 ​
 ​
 副本的数量有没有限制?
 有限制,副本数量最大不能够超过Kafka集群中的broker节点个数。在实际工作中,推荐的分区的副本数量是1-3个。具体设置多少个,根据企业的数据重要程度进行选择。如果数据重要,可以将副本数设置大一些;如果数据不太重要,可以将副本数设置小一些。

kafka如何保证数据不丢失

生产者端

 生产者端是如何保证数据不丢失的呢?
 答:生产者端将消息发送给到Kafka集群以后,broker要给生产者响应信息。最关键就是ACK机制
 ACK机制当中有3个参数配置值,分别是:0  1  -1(all)
 0:生产者生产消息给到Kafka集群,生产者不等待(不接收)broker返回的响应信息
 1:生产者生产消息给到Kafka集群,Kafka集群中的分区对应的Leader主副本所在的broker给生产者返回响应信息
 -1(all):生产者生产消息给到Kafka集群,Kafka集群中的分区对应的所有副本给生产者返回响应信息
 ​
 消息的生产效率排序(由高到低):0 > 1 > -1
 消息的安全级别排序(由高到低):-1 > 1 > 0
 ​
 ​
 在实际工作中如何选择ACK参数配置?
 答:根据数据的重要程度进行选择。如果数据重要,优先保证数据的安全性,再考虑生产效率;如果数据不重要,优先考虑生产效率,再尽可能提升安全级别。

数据写入:

  • 数据成功写入leader

  • follow成功从leader同步数据

写入的模式:

  • 同步:顺序执行,写入一条等待反馈,再写下一条

  • 异步:先将数据写入缓冲区,批量写入Kafka等待反馈

数据复制的过程,通过HW机制保证消费数据可靠性(只考虑ISR队列):

Broker端

消费者端

image-20240619112908914

在Kafka0.8以前的kafka,消费的进度(offset)是写在zk中的,所以consumer需要知道zk的地址。这个方案有性能问题,Kafka 0.9版本之后 的时候整体大改了一次,brokers 接管了消费进度,数据位移直接保存在Kafka内部主题__consumer_offsets中, consumer 不再需要和 zookeeper 通信了,这也是为什么后来使用bootstrap-server了。bootstrap-servers 会自动发现其他 broker

消费靠提交offset,记录消费数据的位置

  • 如果消费数据成功后再提交offset,可能会重复消费数据

  • 如果先提交offset再消费数据,可能会少消费数据

相关参数

 1- acks  broker节点确认机制
     默认值:1;数据类型:string
 ​
 2- buffer.memory 缓存大小
     默认值:33554432(32MB)
 ​
 3- retries 失败后重试次数
     默认值:2147483647,该值没有意义,一般是使用delivery.timeout.ms参数进行控制
 ​
 4- delivery.timeout.ms 消息传输超时时间
     默认值:120000(120秒)
 ​
 5- batch.size 每一批次的消息数据的大小
     默认值:16384(16KB)
 ​
 6- linger.ms 每一批次的间隔时间
     默认值:0

Kafka的数据存储和查询

数据存储

 为什么存储是要拆分成多个文件?
     如果所有的数据都写入一个文件的话,文件的数量会越来越多,当查询读取数据时,就需要打开一个非常大的文件,文件的打开速度会变得越来越慢,影响数据的读取速度
 ​
     kafka将数据文件进行了拆分,当前数据超过1G就会创建一个新的文件,文件的名字会使用第一条数据的偏移量作为文件名。偏移量作为文件改名也方便数据的查找, 1036000偏移量的数据
 ​
     查找是会先根据查找的偏移量会文件的名称进行比对,确认数据在哪个文件中,然后再读取对应的文件数据,可以读取所有文件
     
     1-Topic的数据存放路径是:/export/server/kafka/data。在该目录下,还有其他的目录。而且是以Topic进行划分,具体目录的命名规则是:Topic名称-分区编号
 ​
     2- Topic目录下,存放的是消息的数据文件。并且是成对出现,也就是xx.log和xx.index文件
 ​
 1-xx.log和xx.index它们的作用是什么?
 答:
 xx.log: 称之为segment片段文件,也就是一个Partition分区的数据,会被分成多个segment(log)片段文件进行存储。
 xx.index: 称之为索引文件,该文件的作用是用来加快对xx.log文件内容检索的速度
 ​
 ​
 2-xx.log和xx.index文件名称的意义?
 答: 这个数字是xx.log文件中第一条消息的offset(偏移量)。offset偏移量从0开始编号。
 ​
 ​
 3-为什么一个Partition分区的数据要分成多个xx.log(segment片段文件)文件进行存储?
 答:
   1- 如果一个文件的数据量过大,打开和关闭文件都非常消耗资源
   2- 在一个大的文件中,检索内容也会非常消耗资源
   3- Kafka只是用来临时存储消息数据。会定时将过期数据删除。如果数据放在一个文件中,删除的效率低;如果数据分成了多个segment片段文件进行存储,删除的时候只需要判断segment文件最后修改时间,如果超过了保留时间,就直接将整个segment文件删除。该保留时间是通过server.properties文件中的log.retention.hours=168进行设置,默认保留168小时(7天)
 # 具体配置在哪?以及怎么配置
 # 在config/server.properties内
 # 默认保留168小时(7天)
 log.retention.hours=168
 ​
 # 指定Kafka数据的位置
 log.dirs=/export/server/kafka/data

查询机制

 查询步骤:
 1- 首先先确定要读取哪个xx.log(segment片段)文件。368776该offset的消息在368769.log文件中
 2- 查询xx.log对应的xx.index,查询该条消息的物理偏移量范围
 3- 根据消息的物理偏移量范围去读取xx.log文件(底层是基于磁盘的顺序读取)
 4- 最终就获取到了具体的消息内容

 扩展内容: 磁盘的读写中,有两种方案:随机读写   和   顺序读写。顺序读写的速度会更快
 参考连接: https://www.cnblogs.com/yangqing/archive/2012/11/13/2767453.html
 ​
 Kafka为什么有非常高的吞吐能力/读写性能:
 https://baijiahao.baidu.com/s?id=1710624455165799096&wfr=spider&for=pc
 ​

连续索引和稀疏索引

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

困了就倒头睡

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值