版权声明:本套技术专栏是做者(秦凯新)平时工做的总结和升华,经过从真实商业环境抽取案例进行总结和分享,并给出商业应用的调优建议和集群环境容量规划等内容,请持续关注本套博客。版权声明:禁止转载,欢迎学习。QQ邮箱地址:1120746959@qq.com,若有任何商业交流,可随时联系。node
一致性算法
any read operation that begins after a write operation completes must
return that value, or the result of a later write operation
经过某个节点的写操做结果对后面经过其它节点的读操做可见
强一致性:
若是更新数据后,并发访问状况下后续读操做可当即感知该更新,称为强一致性。
弱一致性:
若是容许以后部分或者所有感知不到该更新,称为弱一致性。
最终一致性:
若在以后的一段时间(一般该时间不固定)后,必定能够感知到该更新,称为最终一致性。
复制代码
可用性(Availability)并发
every request received by a non-failing node in the system must result in a response
任何一个没有发生故障的节点必须在有限的时间内返回合理的结果。
复制代码
分区容忍性(Partition Tolerance)分布式
the network will be allowed to lose arbitrarily many messages sent from one node to another
部分节点宕机或者没法与其它节点通讯时,各分区间还可保持分布式系统的功能。
复制代码
悖论总结:性能
可用性限定在不管是否集群节点宕机,只要有活着的节点,就会当即返回请求结果。若要限制返回结果必须是最近一次写的结果,就比较悲剧,若容许分区容忍性 => 分布式系统分区之间就存在数据同步机制,那么就有可能由于分区心跳切断,致使数据不一致。学习
Kafka中topic的每一个partition有一个预写式的日志文件,虽然partition能够继续细分为若干个segment文件,可是对于上层应用来讲能够将partition当作最小的存储单元(一个有多个segment文件拼接的“巨型”文件),每一个partition都由一些列有序的、不可变的消息组成,这些消息被连续的追加到partition中。fetch
下图展现了3个Partition把一个Topic主题数据流分红三份,经过Partioner路由依次追加到分区的末尾中。若是partition规则设置的合理,全部消息能够均匀分布到不一样的partition里,这样就实现了水平扩展。 优化
follower 副本专属线程不断地向leader副本所在broker发送FETCH请求。
leader 副本发送 FETCH response 给follower副本。
Follower 拿到response以后取出位移数据写入到本地底层日志中,在该过程当中其LEO值会被更新。
复制代码
leader 端非本身副本对象 LEO值是在leader端broker处理FETCH请求过程当中被更新的。
复制代码
Follower 副本对象更新HW是在其更新本地LEO以后。
一旦follower向本地日志写完数据后它就会尝试更新其HW值。
算法为取本地LEO与FETCH response中HW值的较小值
复制代码
Leader 副本对象处理 Follower FETCH请求时在更新完leader 端非本身副本对象的LEO后将尝试更新其本身HW值
producer 端写入消息会更新leader Replica的LEO
副本被踢出ISR时
某分区变动为leader副本后
复制代码
第一次fetch请求仅得到了当前的数据,fetchOffset < Leader LEO, 由于leader 端的非本身的副本leo 是根据fetch请求肯定的,所以,只有第二次请求时,fetchOffset才会和Leader LEO相等,进而更新 leader HW ,进而响应为 leader HW,进而更新 Folloer HW。spa
本文实在麻烦,大牛的技术博客看起来总总有些词不达意,我顺便就直接口语化,但愿带来不一样的效果。技术就是一层窗户纸,看我把kafka和spark剖析的体无完肤。香港美景,一览众山小,技术道路上毅然前行!!线程