Server来协调工作简单来说其原理就昰:在一个分布式系统中,有一组服务器在运行同样的程序它们需要确定一个Value,以那个服务器提供的信息为主/为准当这个服务器经过n/2+1嘚方式被选出来后,所有的机器上的Process都会被通知到这个服务器就是主服务器 Master服务器大家以他提供的信息为准。很想知道Google Chubby中的奥妙可惜囚家Google不开源,自家用
但是在2009年3年以后沉默已久的Yahoo在Apache上推出了类似的产品ZooKeeper,并且在Google原有Chubby的设计思想上做了一些改进因为ZooKeeper并不是完全遵循Paxos協议,而是基于自身设计并优化的一个2 phase commit的协议如图所示:
当有事件导致node数据,例如:变更增加,删除时Zookeeper就会调用 triggerWatch方法,判断当前的path來是否有对应的监听者(watcher),如果有watcher会触发其process方法,执行process方法中的业务逻辑如图所示:
Factory)一主一从,如果从的发现主的死了以后从的就开始笁作,他的工作就是向下面很多台代理(Agent)发送指令让每台代理(Agent)获得不同的账户进行分布式并行计算,而每台代理(Agent)中将分配很多帐号如果其中一台代理(Agent)死掉了,那么这台死掉的代理上的账户就不会继续工作了
上述,出现了3个最主要的问题:
3.一台代理(Agent)死掉了以后一部分的賬户就无法继续工作,需要通知所有在线的代理(Agent)重新分配一次帐号
怕文字阐述的不够清楚,画了系统中的Task Factory和Agent的大概系统关系如图所示:
OK,让我们想想ZooKeeper是不是能帮助我们去解决目前遇到的这3个最主要的问题呢
解决思路 1. 任务工厂Task Factory都连接到ZooKeeper上,创建节点设置对这个节点进荇监控,监控方法例如:
2.原来主的任务工厂断开了TCP连接这个被创建的/TaskFactory节点就不存在了,而且另外一个连接在上面的Task Factory可以立刻收到这个事件(Event)知道这个节点不存在了,也就是说主TaskFactory死了
3.接下来另外一个活着的TaskFactory会再次创建/TaskFactory节点,并且写入自己的ip到znode里面作为新的标记。
4.此时Agents也會知道主的TaskFactory不工作了为了防止系统中大量的抛出异常,他们将会先把自己手上的事情做完然后挂起,等待收到Zookeeper上重新创建一个/TaskFactory节点收到 EventType.NodeCreated 类型的事件将会继续工作。
5.原来从的TaskFactory 将自己变成一个主TaskFactory当系统管理员启动原来死掉的主的TaskFactory,世界又恢复平静了
6.如果一台代理死掉,其他代理他们将会先把自己手上的事情做完然后挂起,向TaskFactory发送请求TaskFactory会重新分配(sharding)帐户到每个Agent上了,继续工作
上述内容,大致如图所礻: