kafka系列(八)—— 数据复制&failover

Replica(副本)

1 什么是Replica

1)当某个Topic的replication-factor为N且N大于1时,每个Partition都会有N个副本(Replica )
2)Replica的个数小于等于Broker数,即对每个Partition而言每个Broker上只会有一个Replica ,因此可用Broker ID表示Replica

为何这么设置?下图中,假如Partiton0的两个副本都在Broker 1上,那么如果Broker 1挂掉就达不到提高数据可用性。

3)所有Partition的所有Replica默认情况会均匀分布到所有Broker上

在这里插入图片描述

这里说到的Replica一定是某个Partition的Replica,对某个Topic来讲,Partition副本数是一样的,说到底Replica是Topic级别的定义,复制是以Partition为单位实际上Topic也是被复制 

2 Data Replication要解决的问题

2.1 如何Propagate(传播)消息

在这里插入图片描述

kafka集群类似于master-slave,但是并不是说一个集群只有一个中心节点,而是对于每个Partition而言有一个leader而其他的副本叫做follower,可以认为这个learder是这个Partition中心节点。可以认为每个Partition是一个小的集群,都有属于自己的leader/marster,有好几个副本/slave。上图可以知晓,topic1-part1的leader在broker1上,两个副本在broker2、broker3上,写入数据只会写入broker1然后复制到broker2和broker3上;topic2-part1的leader在broker2上,两个副本在broker3、broker4上;…

注意

数据的复制是由follower周期性的从leader拉取(pull)数据
上面说到写数据是向leader上写,读数据是否像数据库读写分离那样从slave上读呢?答案是否定的,读依然是从leader上读。follower只是保证leader挂掉的时候顶上去,并不能保证自己一边复制数据一边向外提供服务。

 2.2 何时Commit

同步复制一致性高,可用性差;异步复制一致性差可用性高。kafka默认既不是同步复制也不是异步复制,而是使用IRS机制。

2.2.1 ISR(in-sync Replica )

  1. Leader爸维护一个与其基本保持同步的Replica列表,该列表称为ISR
  2. 如果一个Follower比Leader落后太多,或者超过一定时间未发起gg请求时,则Leader将其从ISR中移除
  3. 当ISR中所有Replica都向Leader发送ACK时,Leader即Commit

2.2.2 Commit策略

1、Server

follower从ISR删除策略

replica.lag.time.max.ms=10000
follower在10000/配置时间内没有向leader发送确认请求
replica.lag.max.nnessages=4000
follower和leader之间数据相差4000/配置条
follower宕机
 

当follower和leader之间的差距变小后,leader又会重新将follower重新加入到ISR中。这就在可用性和一致性之间做了动态的平衡。这是kafka和其他好多系统区别所在

2、Topic配罝,指定ISR最小值

  • min.insync.replicas=1

3、Producer配置

request.required.acks=0,是异步的不需要leader给它任何的ack,立马返回。
request.required.acks=1,必须等待leader发送ack才认为发送成功
request.required.acks=-1,不需要自己决策,交给broker进行决策
如果要使用ISR就需要将 request.required.acks的值设置为-1

2.3 如何处理Replica恢复

在这里插入图片描述

第一步:只有A、B、C同时拥有m1所以m1才会被commit
第二步:A宕机,B变成新的leader,新到达的数据m2会被commit
第三步:A依然宕机,新来的数据m4、m5被提交
第四步:A恢复,由于知道自己之前commit到m1,所以需要删除m1之后的数据,然后进行追赶B、C,直到将B、C节点commit的数据拿过去之后才被B重新添加到ISR中。 

2.4 如何处理Replica全部宕机

kafka提供以下两种方式供配置选择:

1.等待ISR中任一Replica恢复,并选它为Leader

  • 等待时间较长,降低可用性
  • 或ISR中的所有Replica都无法恢复或者数据丟失,则该Partition将永不可用

2.选择第一个恢复的Replica为新的Leader,无论它是否在ISR中

  • 并未包含所有已被之前Leader Commit过的消息,因此会造成数据丟失
  • 可用性较高

原文:https://blog.csdn.net/qwqw3333333/article/details/106133662

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
spark streaming 是基于 spark 引擎的实时数据处理框架,可以通过集成 kafka 来进行数据流的处理。然而,在使用 spark streaming 进行 kafka 数据流处理时,可能会遇到一些坑。 首先,要注意 spark streaming 和 kafka 版本的兼容性。不同版本的 spark streaming 和 kafka 可能存在一些不兼容的问题,所以在选择版本时要特别留意。建议使用相同版本的 spark streaming 和 kafka,以避免兼容性问题。 其次,要注意 spark streaming 的并行度设置。默认情况下,spark streaming 的并行度是根据 kafka 分区数来决定的,可以通过设置 spark streaming 的参数来调整并行度。如果并行度设置得过高,可能会导致任务处理过慢,甚至出现 OOM 的情况;而设置得过低,则可能无法充分利用集群资源。因此,需要根据实际情况进行合理的并行度设置。 另外,要注意 spark streaming 和 kafka 的性能调优。可以通过调整 spark streaming 缓冲区的大小、批处理时间间隔、kafka 的参数等来提高性能。同时,还可以使用 spark streaming 的 checkpoint 机制来保证数据的一致性和容错性。但是,使用 checkpoint 机制可能会对性能产生一定的影响,所以需要权衡利弊。 最后,要注意处理 kafka 的消息丢失和重复消费的问题。由于网络或其他原因,可能会导致 kafka 的消息丢失;而 spark streaming 在处理数据时可能会出现重试导致消息重复消费的情况。可以通过配置合适的参数来解决这些问题,例如设置 KafkaUtils.createDirectStream 方法的参数 enable.auto.commit,并设置适当的自动提交间隔。 总之,在使用 spark streaming 进行 kafka 数据流处理时,需要留意版本兼容性、并行度设置、性能调优和消息丢失重复消费等问题,以免踩坑。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值