zookeeper是一个分布式数据一致性的解决方案。我们先来了解一下他的协议原理。
zookeeper使用的协议是ZAB(Zookeeper Atomic Broadcast)一致性协议,在ZAB协议之前可以先了解以下几个协议
ZAB协议:
zab是一种支持崩溃恢复的原子广播协议。
zab协议下,主要分为两种角色:leader和follower。
zab协议下,所有的事物请求都会转发给全局唯一的leader,由leader统一处理,leader将请求包装成一个提议广播给集群中的follower,当有半数以上的follower正确返回后,leader会发送commit的广播要求follower进行提交。
ZAB协议分为三步:发现、同步、广播
发现(准leader确认自己的新epoch和最完整的事物集合):
1、follower会将自己的接受的最后一个提议(proposal)的epoch值e发送个准leader。
2、准leader在收到超过半数的epoch值后,选出最大的epoch值并加1作为自己最新的epoch e',然后将e'广播给所有follower。
3、follower在收到准leader发送的e'后,如果大于自己本身的epoch,则更新为自己的新epoch,并将自己处理过的事物(proposal)集合c和e'返回给准leader。
4、准leader在收到半数以上的反馈消息后,会选出epoch最大且拥有最大提议id的事物集合c'作为用来进行同步的基础集合。
同步(准leader同步事物给follower,同步完成后,准leader才能正式上任):
1、准leader将e'和c'广播给所有的follower
2、follower收到该广播后,如果自己的epoch=e',则会接受c'中的事物,并反馈给准leader。
3、准leader收到半数的反馈后,会发送commit消息。
4、follower收到commit消息后会依次将c'中的事物进行提交。
广播:
1、leader将事物请求生成新的提议,将提议按照提议(proposal)的id的顺序发送给follower。
2、follower收到消息后,会按照提议id的顺序进行处理,并记录到自己接受过的事物集合c中,然后反馈给leader。
3、leader在收到超过半数的反馈后,会发送commit消息。
4、follower在收到commit消息后,会按照提议顺序提交事务。