zookeeper内部原理
所属分类 zookeeper
浏览量 1394
集群
群首(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参数查看