作者回复: 常超您好,又看到了您的留言!其实归根结底P属性还是说当Network Partition发生后,无论后面网络分区是否会恢复,分离出来的子系统都可以正常运行。您所说这几个例子确实是讲到了在Kafka Replication中,有的节点在分区后就无法再使用了,所以设计的时候并没有考虑P属性。另外还多加一句,并不是Kafka没有P属性,而是Intra-cluster Kafka Replication没有P属性。
谢谢你的参考资料,这对我和其他读者们来说都非常有帮助!
作者回复: 谢谢你的留言!你的理解非常正确,A就是指集群中即便挂掉几个机器但是集群对外还是正常运行的,P就是指即便机器间无法通讯了但是集群对外还是正常运行。
我对于Kafka Replication pick CA这种设计的理解是,设计师只考虑了在Replication的集群里对CA的保证而放弃了对P的保证。所以当发生Network Partition的时候,系统有可能可以工作,有可能不能继续工作。例如说C的保证是因为Kafka Replication要求了领导者节点的数据一定要同步数据副本节点上,否则不会返回这个数据;A的保证是因为无论有多少数据副本节点挂了,只要领导者节点不挂,这个Replication集群都可以返回数据,但是当领导者挂了,这整个Replication集群就不能再用了,而没了这个集群也就没有CAP属性可言了。希望这能帮助你理解,如果有不明确的地方也欢迎你继续留言提问,一起学习进步。
作者回复: 常超您好,感谢您的提问!
关于这个问题我是这么看的。当我们在分布式环境中讨论CAP属性的时候,P属性可以说是当任意节点断开后,系统还是可以正常的运行。对于整个Kafka系统来说,P当然是必须要保留的。可当你只从Kafka Replication来看的时候,如果一个cluster里面领导者挂掉了,单单就这个cluster来说有再多的副本存在也是无法运行了,所以就Kafka Replication来说,它没有保留P属性。
而在Kafka Replication的设计中为什么说P被放弃了呢,引用Kafka的作者之一Jun Rao在设计Kafka Replication的说法,是因为“All distributed systems must make trade-offs between guaranteeing consistency, availability, and partition tolerance. Our goal was to support replication in a Kafka cluster within a single datacenter, where network partitioning is rare, so our design focuses on maintaining highly available and strongly consistent replicas.”,这一点是在Linkedin的Engineering官方文档上publish的。而在2013年的Apachecon上,Kafka Replication的技术演讲上也明确说明了“Kafka Replication: Pick CA”。
不知道我的解释能否让您更好地理解,也欢迎您继续留言提问,我们一起学习进步!
作者回复: 谢谢你的答案。
关于疑问一:MongoDB的设计默认是希望读写有strong consistency的。当然MongoDB也有自身的Replica Set来保证可用性:https://docs.mongodb.com/manual/replication/#replication-in-mongodb
关于疑问二:你说的没有错,作为多个data clusters来说,Kafka系统是不可能放弃P的,不然一旦leader挂掉系统就没有任何结果可以返回了。但是我在这一讲中所讲述的Intra-cluster Kafka Replication Design是对于一个cluster来说。就像我回答其他有同样疑问的读者一样,之所以我在文中说Kafka Replication选择了CA,是因为Kafka的作者之一Jun Rao在设计Kafka Replication的时候,明确说明了“All distributed systems must make trade-offs between guaranteeing consistency, availability, and partition tolerance. Our goal was to support replication in a Kafka cluster within a single datacenter, where network partitioning is rare, so our design focuses on maintaining highly available and strongly consistent replicas.”,这一点是在Linkedin的官方文档上publish的。而在2013年的Apachecon上,Kafka Replication的技术演讲上也明确说明了“Kafka Replication: Pick CA”。
学习之后提出疑问是一个很好的习惯,也希望后面继续看到你的留言!
作者回复: 谢谢你的留言!你的理解非常正确,就是因为这样Kafka Replication的设计中不需要考虑到P的存在,让整个Replication Design成为CA系统。
作者回复: 谢谢你的支持,哈哈!
作者回复: 谢谢你的提问!我的理解是如果仅仅就一个Kafka Replication cluster来说,如果领导者挂了我们就不会再从这个cluster拿到内容了,所以在Intra-cluster Replication这个设计点上,他们是不考虑P的。
之所以我在文中说Kafka Replication选择了CA,是因为Kafka的作者之一Jun Rao在设计Kafka Replication的时候,明确说明了“All distributed systems must make trade-offs between guaranteeing consistency, availability, and partition tolerance. Our goal was to support replication in a Kafka cluster within a single datacenter, where network partitioning is rare, so our design focuses on maintaining highly available and strongly consistent replicas.”,这一点是在Linkedin的官方文档上publish的。而在2013年的Apachecon上,Kafka Replication的技术演讲上也明确说明了“Kafka Replication: Pick CA”。
所以你会发现,他们的设计思路是仅仅就Intra-cluster的data replication出发的。当然,如果从整个Kafka系统来说,是不可能放弃P的。
作者回复: 是有一定道理
作者回复: 谢谢你的再次留言!是的,理解正确!既然replication1对于集群来说现在以及以后都不可用了,也就相对于集群没有了这个replication1,那也就不存在说网络分区后replication1还是否在集群正常运行的问题了。
作者回复: 谢谢你的留言!P属性的好处是在分布式环境下,无论网络发不发生分区,整个系统都可以照常运行。不管分区后用户读到的是stale data,还是up-to-date data。像常超同学的留言中举了几个例子,如果系统设计上没有了P属性,很多时候network partition发生了, 那剩下的一些节点可能就无法再用了,最坏的情况下可能整个系统都无法运行下去。
作者回复: 谢谢你的总结!非常棒!
作者回复: 谢谢你的留言!其实选择CA的系统是少之又少,你的问题里面提到了一个关键点,当机子挂掉的时候或者当网络分区出现的时候,系统会直接将这个机子从集群中剔除掉了,也就是说无论以后这个机子处于什么状态都不会再出现在这个集群中,在集群中剩下的机子数据一直都是同步的,所以就有了有CA却不存在P的说法了。不知道这个解释你觉得怎么样,同时也欢迎你不理解的话继续提问。
作者回复: 谢谢你的留言!现在来说还没有专门介绍Apache Beam的书籍,不过如果你想了解底层思想的还,可以看Tyler Akidau写的Streaming Systems。
作者回复: 谢谢你的留言!
1. 是的呢,Kafka Replication的设计思想就是因为一个数据中心中很少会出现Network Partition所以主攻高可用和强一致性。你的理解是对的,不过感觉很多其他读者误会了我所说的Kafka Replication,理解成整个Kafka系统都是CA系统了,哈哈。
2. 我也学习受教了,谢谢!
作者回复: 谢谢你的留言!仅对这个cluster的Replication而言,这个理解是正确的。
作者回复: 谢谢你的留言!如果选择CP的话就要考虑到如果用户访问不到微博了会有很多不满哦。
作者回复: 谢谢你的提问!感觉很多读者都有同样的问题。
我的理解是如果仅仅就一个Kafka Replication cluster来说,如果领导者挂了我们就不会再从这个cluster拿到内容了,所以在Intra-cluster Replication这个设计点上,他们是不考虑P的。
之所以我在文中说Kafka Replication选择了CA,是因为Kafka的作者之一Jun Rao在设计Kafka Replication的时候,明确说明了“All distributed systems must make trade-offs between guaranteeing consistency, availability, and partition tolerance. Our goal was to support replication in a Kafka cluster within a single datacenter, where network partitioning is rare, so our design focuses on maintaining highly available and strongly consistent replicas.”,这一点是在Linkedin的官方文档上publish的。而在2013年的Apachecon上,Kafka Replication的技术演讲上也明确说明了“Kafka Replication: Pick CA”。
所以你会发现,他们的设计思路是仅仅就Intra-cluster的data replication出发的。当然,如果从整个Kafka系统来说,是不可能放弃P的。
作者回复: 谢谢你的提问!对于整个Kafka系统来说,你的理解是正确的!