Kafka学习笔记(3)----Kafka的数据复制(Replica)与Failover

1. CAP理论

  1.1 Cosistency(一致性)

  通过某个节点的写操作结果对后面通过其他节点的读操作可见。

  如果更新数据后,并发访问的情况下可立即感知该更新,称为强一致性

  如果允许之后部分或全部感知不到该更新,称为弱一致性。

  若在之后的一段时间(通常该时间不是固定的)后,一定可以感知到该更新,称为最终一致性。

  1.2 Availability(高可用性)

  即是任何一个没有发生故障的节点必须在有限的时间内返回合理的结果(不论是正确的还是错误的)。

  1.3 Partition tolerance(分区容错性)

  部分节点宕机或者是无法与其他节点通信时,各分区间还可以保持分部式系统的功能,比如上海和北京两个网络分区,当上海分区光纤或其他原因导致网络不通时,北京上海两个分区之间不可通信,但是最起码要保证北京的分区中的分布式系统功能可用。

  1.4 CAP理论

  分布式系统中,一致性,可用性,分区容忍性最多只可同时满足两个,但是一般分区容错性都是需要保障的,因此很多时候都是在可用性和一致性之间做权衡。如下一幅图讲解了CP和AP的两种模式的具体表现形式:

 

  首先看CP模式,N1和N2之间代表了网络通信,C表示客户端,X表示新写入的数据,Y表示旧数据,当C向N2发起请求时,由于N2与N1之间网络通信异常,会导致N2不能同步到N1中的x,在保证一致性的情况下,此时N2不会正常返回处理结果,要么是等待网络连接成功,将N1的Y获取过来,保证数据一致,要么系统出现错误,这样的情况是不能保证高可用的,但是保证了数据一致性。

  AP模式下,N1和N2之间代表了网络通信,C表示客户端,X表示新写入的数据,Y表示旧数据,当C向N2发起请求时,由于N2与N1之间网络通信异常,会导致N2不能同步到N1中的X,但是N2不会等待N1连接成功,或是返回错误信息,而是返回之前老的数据x,这样系统能够正常的运行,但是数据的一致性并没有保证,此时选择了系统的高可用方案。

  1.5 一致性的方案

  1.5.1 Master-slave(主从模式)

  RDBMS的读写分离即为典型的Master-slave方案

  同步复制可保证强一只性,但是会行影响性能(因为Master必须要等待所有的salve都接收到到更新才能返回)

  异步复制提高可用性,但是会降低一致性,因为Master只需要自己写操作完成,就立即返回,同时向Slave进行复制,这期间可能会出现某个或多个Slave由于网络或其他原因没有更新到数据,造成数据不一致性。

  1.5.2 WNR

  主要用于去中心化(P2P)的分布式系统中。DynamoDB与Cassandra即采用此方案,N代表副本数,W代表每次写操作要保证的最少写成功的副本数,R代表每次读至少读取的副本数,当W+R>N时,可保证每次读取的数据至少有一个副本具有最新的更新,多个写操作的顺序难以保证,可能导致多副本间的写操作顺序不一致,Dynamo通过向量时钟保证最终一致性。这里可以通过时间戳或者是自增主键之类的方式来保证过滤出读取的最新的数据。

  1.5.3 Paxos及其变种

  Google的Chubby,Zookeeper的Zab,RAFT等

2. Kafka的数据复制(Replica)

  Kafka提供了Replica保证了数据一致性

  2.1 Replica

  当某个Topic的replication-factor为N切N大于1时,每个Partition都会有N个副本(Replica),Replica的个数小于等于Broker数,即对每个Partition而言每个Broker上只会有一个Replica,因此可用Broker ID表示Replica,所有Partition的所有Replica默认情况会均匀分布到所有Broker上,如图:

  图中可以看到,Broker中存的是Topic2的Partition0和Topic2的Partition2的Replica,但是在Broker2中却存了Topic2的Partition1和Topic2的Partition0的Replica,所以默认的Partition都是分布在集群节点上的,replica也一样。这就可以保证到某个节点挂掉之后,其他的节点中保存的replica仍然可以向消费者推送或被拉取消息,保证消息不丢失。

  注意:

  假如当前我们搭建了三个Broker的集群,但是我此时指定4个Replica时,会出现org.apache.kafka.common.errors.InvalidReplicationFactorException: Replication factor: 4 larger than available brokers: 3异常,如图:

 2.2 Data Replication(数据复制)要解决的问题

  2.2.1 如何Propagate(备份)消息

  如下图:

  当producer想leader节点发送消息时,其余follower节点(个人理解跟slave类似)将会如其他mq的consumer一样去从主节点的topic中将数据拉取或被推送到自身节点中。这样当leader节点挂掉之后,consumer访问集群时,仍然可以从其他的follower中获取到最新数据,防止了数据丢失。

  2.2.2 何时Commit

  ISR: Leader会维护一个与其基本保持同步的Replica列表,该列表称为ISR(in-sync Replica),如果一个Follower比Leader落后太多,或者超过一定时间未发起数据复制请求,则Leader将其从ISR中移除,当ISR中所有Replica都向Leader发送ACK时,Leader即Commit(告诉Producer消息发送成功)。

  Commit策略

  1. 在Server中配置

  replica.lag.time.max.ms:默认100000,最大未发起数据复制请求的时间。

  replica.lag.max.messages:最大落后消息数,根据自身需要配置

  2. Topic配置

  min.insync.replicas=1: ISR列表最小个数,默认1,只有当request.required.acks为-1时才生效,如果ISR中的副本数少于min.insync.replicas配置的数量时,客户端会返回异常:org.apache.kafka.common.errors.NotEnoughReplicasExceptoin: Messages are rejected since there are fewer in-sync replicas than required。

  3. Produce配置

  request.required.acks=1,默认为1,roducer发送数据到leader,leader写本地日志成功,返回客户端成功;此时ISR中的副本还没有来得及拉取该消息,leader就宕机了,那么此次发送的消息就会丢失,当为-1时,当producer设置request.required.acks为-1时,min.insync.replicas指定replicas的最小数目(必须确认每一个repica的写数据都是成功的),如果这个数目没有达到,producer会产生异常。

  2.2.3 如何处理Replica恢复

  如图:

 

  1. 可以看到SR={A,B,C},Leader(A)节点中存在m1,m2,m3三条消息,F(B)存在m1,m2两条消息,f(c)只存在m1一消息,所以这里只会提交m1这条消息,因为m2这条消息还没有在ISR中完成复制。它只会提交三个ISR中都存在的消息。

  2. 当L(A)在将消息m2复制到B,C之后挂掉,此时ISR中只有{B,C},B被选举成为新的主节点,当m2,m1都存在于B,C节点中时,B将会提交m1,m2两条消息,不会提交m3消息。

  3. 此时消息将都会发送到B节点上,C节点同步了B节点中的新发的消息m4,m5之后,将会提交m4,m5.

  5.此时A节点连接集群成功或重启,可以使用了,它会从B节点中同步从m1,到m5的消息,直到它的消息与B和C中的一致为止,此时的Replica将会变成ISR={A,B,C},完成了Replica的恢复。这里我们发现m3并没有存在了,这里并不是丢失了,只是当没有主节点提交m3这条消息时,它将会自动反馈到Producer,Producer会重试,或做其他处理,当重试成功后可能m3消息将会append到m5的后面,所以consumer消费消息时,我们保证的顺序性不是producer发送消息的顺序,而是commit时的顺序。

  2.2.4 如何处理Replica全部宕机

  当ISR中的Replica全部宕机时,可以通过如下方式处理:

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

  缺点:等待时间较长,降低可用性(因为不能使用所有集群节点),因此或ISR中的所有Replica都无法恢复或者数据丢失,则该Partition将永不可用。

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

  缺点:并未包含所有已被之前Leader Commit过的消息(因为它不在之前的ISR中),因此会造成数据丢失,但是它提高了可用节点的范围,可用性比较高。

原文 Kafka学习笔记(3)----Kafka的数据复制(Replica)与Failover

转载于:https://www.cnblogs.com/xiaoshen666/p/10867414.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/248942.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

H5页面随机数字键盘支付页面

H5页面随机数字键盘支付页面 有个H5支付的业务需要随机数字的键盘 参考了下文:https://blog.csdn.net/Mr_Smile2014/article/details/52473351 做了一些小修改: 在原有的基础上,增加了一些按键反馈的效果。 每个按键加上边框。 最终效果&…

expressjs路由和Nodejs服务器端发送REST请求 - - ITeye博客

Nodejs创建自己的server后,我们如果需要从客户端利用ajax调用别的服务器端的数据API的接口,这时候出现了ajax跨域问题。 一种是利用在客户端解决跨域问题 这种方案大家可以去网上查查 另一种方案是在服务器端去请求别的服务器,然后将数据再…

Jmeter操作mysql数据库测试

1. 选中线程组鼠标点击右键添加-->配置元件-->JDBC Connection Configuration; 2. DataBase Connection Configuration配置 Variable Name:配置元件的的所有配置所保存的变量,自定义变量名称(不能使用mysql作为变量名,多个…

axios发送自定义请求头的跨域解决

前端发送来的axios请求信息 this.$axios.request({ url:http://127.0.0.1:8001/pay/shoppingcar/, method:post, headers:{ authenticate:a073b3dabbb140e8b9d28debb6a356a1 # 自定义的请求头部信息键值对, }, # 接上,这种key也算是一种请求头,需要加入django中间件内…

前端“智能”静态资源管理 - Onebox - 博客园

前端“智能”静态资源管理 模块化/组件化开发,仅仅描述了一种开发理念,也可以认为是一种开发规范,倘若你认可这规范,对它的分治策略产生了共鸣,那我们就可以继续聊聊它的具体实现了。 很明显,模块化/组件化…

【转】几张图看懂列式存储

几张图看懂列式存储 转载于:https://www.cnblogs.com/apeway/p/10870211.html

hive -e和hive -f的区别(转)

大家都知道,hive -f 后面指定的是一个文件,然后文件里面直接写sql,就可以运行hive的sql,hive -e 后面是直接用双引号拼接hivesql,然后就可以执行命令。 但是,有这么一个东西,我的sql当中有一个s…

我们是如何做好前端工程化和静态资源管理 - 無雄 - 博客园

我们是如何做好前端工程化和静态资源管理 随着互联网的发展,我们的业务也日益变得更加复杂且多样化起来,前端工程师也不再只是做简单的页面开发这么简单,我们需要面对的十分复杂的系统性问题,例如,业务愈来愈复杂&…

Mybatis-plus之RowBounds实现分页查询

物理分页和逻辑分页 物理分页:直接从数据库中拿出我们需要的数据,例如在Mysql中使用limit。 逻辑分页:从数据库中拿出所有符合要求的数据,然后再从这些数据中拿到我们需要的分页数据。 优缺点 物理分页每次都要访问数据库&#xf…

常见的6种JavaScript设计模式

常见的6种JavaScript设计模式 构造函数模式 /*** 构造一个动物的函数 */ function Animal(name, color){this.name name;this.color color;this.getName function(){return this.name;} } // 实例一个对象 var cat new Animal(猫, 白色); console.log( cat.getName() );工…

峰度(Kurtosis)和偏度(Skewness)

峰度(Kurtosis) 定义峰度又称峰态系数,表征概率密度分布曲线在平均值处峰值高低的特征数,即是描述总体中所有取值分布形态陡缓程度的统计量。直观看来,峰度反映了峰部的尖度。这个统计量需要与正态分布相比较。 公式定…

1.27

测试程序提出问题并解决转载于:https://www.cnblogs.com/JustinTimberlake/p/10028870.html

javascript设计模式系列 - LukeLin - 博客园

javascript设计模式系列 创建型: 1.抽象工厂模式(Abstract Factory) 2.构建者模式(Builder) 3.工厂方法模式(Factory Method) 4.原型模式(Prototype) 5.单例模式&a…

多功能嵌入式解码软件(2)

多功能嵌入式解码软件(2) 验证类库 通信协议 下面进行一个示例: 下位机需要向上位机发送3中数据帧,数据帧以功能码来识别,每种数据帧的协议如下3个表格所示,上位机需要把这些数据按照协议解码出来&#xff…

vue项目如何打包扔向服务器 - Hi-Sen - 博客园

当我们将 vue 项目完成后,面临的就是如何将项目进行打包上线,放到服务器中。我使用的是 vue-cli(simple) 脚手架,所以就讲一下如何将项目进行打包,并放到 tomcat 上。 如果是 vue-cli (非 simple 脚手架…

MySQL备份与恢复-mysqldump备份与恢复

这片博文主要用来介绍MySQL的备份与恢复: MySQL的备份形式可以分为如下几种: 热备----即不停机备份冷备----需要关闭MySQL,然后备份其数据文件。(停机备份一般是直接拷贝其datadir目录)温备----在线备份,对…

第六次实训作业异常处理

第六次实训作业异常处理 编写一个类ExceptionTest,在main方法中使用try-catch-finally语句结构实现:在try语句块中,编写两个数相除操作,相除的两个操作数要求程序运行时用户输入;在catch语句块中,捕获被0除…

k8s学习笔记-调度之Affinity

Kubernetes中的调度策略可以大致分为两种 一种是全局的调度策略,要在启动调度器时配置,包括kubernetes调度器自带的各种predicates和priorities算法,具体可以参看上一篇文章; 另一种是运行时调度策略,包括nodeAffinity…

vue-cli webpack配置分析 - chenBright - SegmentFault 思否

相信vue使用者对vue-cli都不会陌生,甚至可以说,很熟悉了,但对其webpack的配置可能知之甚少吧。 过完年回来后,我接手了公司的新项目。新项目是一个spa。很自然,我就想到了vue-cli脚手架了,当时研究一下它的…

[Xcode 实际操作]六、媒体与动画-(6)使用UIBlurEffect给图片添加模糊效果

目录:[Swift]Xcode实际操作 本文将演示如何给图像添加模糊效果。 在项目导航区,打开视图控制器的代码文件【ViewController.swift】 1 import UIKit2 3 class ViewController: UIViewController {4 5 override func viewDidLoad() {6 super.…