Zookeeper的使用

Zookeeper对我们的意义就像解释螺丝刀对我们的意义一样。简而言之,螺丝刀允许我们拧螺丝,但是仅仅这样说不能表达出这个工具的能力。螺丝刀允许我们组装家具和电子设备,例如在墙上挂一副画。通过给出更多的这样的例子,我们对螺丝刀能做的事情有个大致的感觉,但是这样去描述也不够完整。

Zookeeper这样的系统能为我们做什么可以归结于这一点:它在分布式系统中能提供协同任务。协同任务一个有着多个进程参与的任务。比如,一个任务以协作或者协调为目的。协作意味着参与的进程需要一起做一些事情,一些进程需要执行某种动作让其他的进程继续运行。例如,在典型的master-worker架构中,当worker可用时它会通知master,Master随后会指派任务给worker。当遇到这种情况是竞争是不一样的,比如两个进程不能并发的运行,一个进程必须等待另外一个进程。还是那个master-worker的例子,我们只想要一个master,但是多个进程可能都会尝试变成master。多进程然后需要实现互斥操作。我们实际上希望获取领导权的任务像获取锁一样:那个获取了领导权锁的进程会变成master的角色。

如果你有过多线程编程的经验,你会意识到它们之间有很多的相似的问题。实际上,有着多个进程运行在同一台计算机上或者跨越多个计算机本质上没有什么区别。同步原语在多线程上线文中非常有用,同样在分布式环境中也一样有用。然而,一个重要的区别源于这样一个事实:在典型的非共享架构中,不同的计算器除了网络不会共享任何东西。虽然有很多的消息传递算法能实现同步原语,但是如果能依赖一个提供顺序排列属性的共享存储会容易实现很多,Zookeeper就提供这样的服务。

协同并不总是采用同步原语的形式,例如领导者选举或者锁服务。