文章部分知识来源千峰教育讲解的zookeeper当中!
zookeeper作为⾮常重要的分布式协调组件,需要进⾏集群部署,集群中会以⼀主多从
的形式进⾏部署。zookeeper为了保证数据的⼀致性,使⽤了ZAB
(Zookeeper Atomic Broadcast)协议,这个协议解决了Zookeeper的崩溃恢复和主从数据同步
的问题。
下图就是zk集群的结构,主节点主要负责节点的写,也能负责读,其他从节点只有读的权限。虽然从节点不负责写数据,但是他永远会在自己的内存当中保持一份和主节点一模一样的数据!假如主节点更新了数据,他会立马将数据同步到子节点。同步子节点的目的就是要防备主节点挂掉的准备,然后可以无缝切换主节点,也就是上面所说的崩溃恢复。
Linux搭建Zookeeper伪集群详解:https://blog.csdn.net/weixin_43888891/article/details/125474995
选举为主节点的条件:
以上面四台服务节点为例,其中有一台状态为Observing是不参与选举的,也就是三台需要参与选举。
当超过一半票数的节点就能成为主节点
,3台节点进行选举,也就意味着只要任意一个节点有两票就可以成为主节点。
zk怎么知道有几个节点的?
既然要求票数过半,那他怎么知道有几台节点的呢?搭建过集群的应该知道,搭建集群的时候需要在每个节点的zoo.cfg配置文件配置每个服务器的地址,这样不管哪个服务节点,都能知道当前集群一共有几台服务节点!
以下是集群下每个节点都需要配置的zoo.cfg文件:
3台节点参与竞争,那实际上几台参与选票呢?
实际上也就两台参与投票,因为就算有3台服务节点,他启动也是有先后顺序的,只有前两个启动的服务节点能够参与投票,记住这里是参与投票,而并不是参与竞争,实际上3台都有竞争机会,但是票数过半就成主节点了,也就是两票就确定主节点了,所以前两台参与投票即可,后一台既不参与投票也不可能成为主节点!
针对于这一点我亲自做了试验,当三台节点的时候,启动两台的时候已经触发选举机制,当第三台还没启动的时候,已经选好主节点了。第三台启动后,要想再次触发选举机制,除非有一台服务挂掉!
投票的依据:
会根据myid和zXid大小进行投票选举,选择出一个主节点!
投票流程详解:
通过上面了解到,三台参与选举,由于票数过半就可以成为主节点,所以在第三台服务器还没启动的时候主节点就已经诞生了。而两个节点在进行投票的时候一共需要进行两轮投票:
第一轮投票:
第二轮投票:
通过两轮的选票后,2号节点成功上任主节点!之所以要通过两轮就是为了确保选举的可靠性!
Leader建⽴完后,Leader周期性地不断向Follower发送⼼跳(ping命令,没有内容的socket)。当Leader崩溃后,Follower发现socket通道已关闭,于是Follower开始进⼊到Looking状态,重新回到上⼀节中的Leader选举过程,此时集群不能对外提供服务。
之所以选举,就是为了选择出一个数据比较新的来当主节点,一般事务id比较大,那自然他的数据要比较新。而myid无非就是开放出来的一种人为干预选举的一种方式!也就是我想让哪台当主机,我可以设置myid特别大就可以了。
zk会数据同步,难道还会出现事务id不一样的情况?
在第六步的时候,只要收到半数以上就开始同步内存数据,也就意味着假如有服务器网络延迟并没有发生ACK,但是也超过了半数,超过半数就不等他了,直接数据同步内存,而当别的服务器都同步完后,这时候网络延迟的那台服务器又好了,这时他的事务id就会和其他节点数据不一致!
2000 年 7 ⽉,加州⼤学伯克利分校的 Eric Brewer
教授在 ACM PODC
会议上提出 CAP 猜想。2年后,麻省理⼯学院的 Seth Gilbert
和 Nancy Lynch
从理论上证明了 CAP。之后,CAP 理论正式成为分布式计算领域的公认定理
。
CAP 理论为:⼀个分布式系统最多只能同时满⾜⼀致性(Consistency)
、可⽤性(Availability)
和分区容错性(Partition tolerance)
这三项中的两项。
Zookeeper追求的是CAP当中的CP
,虽然追求的是一致性,但是在数据同步时,实际上并不是强⼀致性,⽽是顺序⼀致性(事务id的单调递增)。这一点从上面的主从服务器之间的数据同步就可以看出!
这里要明白一点,假如每个节点的事务id是一致的,那他们数据一定是同步的!
通过 CAP 理论,我们知道⽆法同时满⾜⼀致性、可⽤性和分区容错性这三个特性,那要舍弃哪个呢?
对于多数⼤型互联⽹应⽤的场景,主机众多、部署分散,⽽且现在的集群规模越来越⼤,所以节点故障、⽹络故障是常态,⽽且要保证服务可⽤性达到 99.9999,即保证 P 和 A,舍弃C(退⽽求其次保证最终⼀致性)。虽然某些地⽅会影响客户体验,但没达到造成⽤户流程的严重程度。
对于涉及到钱财这样不能有⼀丝让步的场景,C 必须保证。⽹络发⽣故障宁可停⽌服务,这是保证 CA,舍弃 P。貌似这⼏年国内银⾏业发⽣了不下 10 起事故,但影响⾯不⼤,报到也不多,⼴⼤群众知道的少。
还有⼀种是保证 CP,舍弃 A。例如⽹络故障是只读不写。
eBay
的架构师 Dan Pritchett
源于对⼤规模分布式系统的实践总结,在 ACM
上发表⽂章提出BASE 理论
,BASE 理论是对 CAP 理论的延伸
,核⼼思想是
即使⽆法做到强⼀致性(Strong Consistency,CAP 的⼀致性就是强⼀致性),但应⽤可以采⽤适合的⽅式达到最终⼀致性
(Eventual Consitency)。
允许损失部分可⽤性,即保证核⼼可⽤
。电商⼤促时,为了应对访问量激增,部分⽤户可能会被引导到降级⻚⾯,服务层也可能只提供降级服务。这就是损失部分可⽤性的体现。允许不同节点间副本同步的延时就是软状态的体现
。mysql replication 的异步复制也是⼀种体现。最终能够达到⼀致的状态
。弱⼀致性和强⼀致性相反,最终⼀致性是弱⼀致性的⼀种特殊情况。通过以上了解到,我们假如是3台节点,只要有两台参加投票就能得出主节点。那也就是3台挂掉任意一台,仍然不影响使用,因为我还能选出主节点,也就是33.33%的容错率。
假如是偶数4台的话,那么票数过半需要三票的支持。那也就是4台的话需要有3台进行参与投票,同样也是只允许挂掉1台服务,但是他是4台服务,那么他的容错率就占比25%。
假如是奇数5台的话,那么票数过半同样也是需要三票的支持。那也就是意味着5台挂掉两台之后仍然可以使用,那么他的容错率就占比40%。
由此得出奇数在容错率上要比偶数容错率好。
NIO
BIO