首页  

zookeeper内部原理     所属分类 zookeeper 浏览量 1249
集群 
群首(leader)    负责处理更新请求 并保证更新顺序 
追随者(follower) 处理群首的更新操作请求 
观察者(observer) 不参与决策,只观察决策结果 

事务ID zxid
zxid为一个long型(64位)整数,分为两部分,时间戳(epoch)和计数器(counter)

leader选举
脑裂 split brain 
仲裁 quorum

每个ZK服务器启动时,进入LOOKING状态,如果leader已经存在,那么其他服务器会告知这个服务器哪个是leader,新的服务器将会与leader建立连接并同步状态。
如果集群中所有服务器均处于LOOKING状态,这些服务器之间就会进行通信来选举一个leader,
选举过程中胜出的服务器将会进入LEADING状态,其他服务器则进入FOLLOWING状态。

选举协议

每个服务器发送投票(vote)消息到其他服务器
投票中包含服务器标识符(sid)和其最新执行的事务ID(zxid)

假设收到的投票为voteId和voteZxid,而本身的标识符为mySid和myZxid;
如果(voteZxid > myZxid)或者(voteZxid = myZxid 且 voteId > mySid),那么服务器更新投票信息
否则不变。

最新的服务器会赢得选举,如果多个服务器拥有相同的zxid那么sid值最大的赢得选举。

当一个服务器收到仲裁数量的服务器发来相同的投票时,该服务器会声明群首选举成功,
如果被选举的群首为某个服务器自己,那么该服务器将会行使群首角色,否则就成为一个追随者连接群首进行同步。


Zab 状态更新的广播协议
原子广播协议(Zookeeper Atomic Broadcast protocol)
接收到一个写请求后,追随者将该请求转发给群首,群首将尝试执行该请求,并且将执行结果以事务的方式广播给所有追随者。

群首向所有追随者发送一个PROPOSAL消息p;
当追随者接收到消息p后,会响应一个ACK消息,通知群首其已接受该提案(proposal);
当收到仲裁数量的确认消息后(群首也可以属于仲裁数量的一员),群首就会发送消息通知追随者进行提交(COMMIT)操作。


事务顺序保证

如果群首按顺序广播了事务T和T’,那么每个服务器在提交T’前保证事务T已经提交完成;
如果某个服务器按照事务T、T’的顺序提交事务,所有其他服务器也必然会在提交事务T’前提交事务T。

观察者

服务器请求处理
请求处理器流水线

RequestProcessor接口  

public interface RequestProcessor {
    void processRequest(Request request) throws RequestProcessorException;
    void shutdown();
}


void processRequest(Request request) throws RequestProcessorException


独立部署模式

PrepRequestProcessor
SyncRequestProcessor
FinalRequestProcessor


PrepRequestProcessor 
生成一个事务,这个事务是请求操作的结果,它需要作用在数据树上。
事务信息会以头部信息和事务记录的方式添加到Request对象中。 
只有写操作才会产生事务,对于读请求,Request对象中的事务属性为null。

SyncRequestProcessor
负责将事务持久化到磁盘上,将事务追加到事务日志中,并定期生成快照。

FinalRequestProcessor
如果Request中包含事务则将事务应用到数据树中,否则只是读取数据树的数据并返回。




仲裁模式

leader 

PrepRequestProcessor

ProposalRequestProcessor

该处理器会准备一个提议,并将提议发送给追随者。
ProposalRequestProcessor会将所有的请求传给CommitRequestProcessor,另外也会将写请求传给SyncRequestProcessor。

SyncRequestProcessor与独立服务器的一样,即将事务持久化到磁盘上。
它执行完之后会触发AckRequestProcessor处理器,这个处理器仅仅生成确认消息返回给自己。

在仲裁模式下,群首需要收到每个服务器的确认消息,包括自己的,而AckRequestProcessor负责这个确认消息。
在ProposalRequestProcessor之后是CommitRequestProcessor,它会将收到足够多的确认消息的提议进行提交。
最后一个处理器是FinalRequestProcessor,它的作用和独立服务器的一样,执行更新以及返回读请求的数据。



追随者
FollowerRequestProcessor
FollowerRequestProcessor会将所有请求都传给CommitRequestProcessor,同时也会将写请求传给群首服务器。
对于读请求,CommitRequestProcessor直接传给FinalRequestProcessor,
对于写请求,CommitRequestProcessor在传给FinalRequestProcessor之前会等待提交事务。


当群首服务器收到写请求时,会生成一个提议发送给追随者。
当追随者收到提议时,会把这个提议传给SyncRequestProcessor。
SyncRequestProcessor持久化提议,并传给SendAckRequestProcessor,SendAckRequestProcessor返回提议确认消息给群首服务器。

当群首服务器收到足够的确认消息,就会发送提交消息来提交这个提议。
当接收到提交消息时,追随者就通过CommitRequestProcessor处理器进行处理。

为了保证顺序性,CommitRequestProcessor收到一个写请求后会暂停后续的请求处理,直该到写请求通过了CommitRequestProcessor。



观察者
不需要确认提议消息
不需要持久化事务到硬盘

上一篇     下一篇
arthas watch 使用

arthas tt 使用

arthas OGNL 使用

httpclient post 请求返回400

使用jmx监控jvm

jvm参数查看