Zookeeper学习笔记一之简介
Zookeeper学习笔记一之简介
2018-08-23 22:29 by 莲池, … 阅读, … 评论, 收藏, 编辑
一 Zookeeper使命
关于Zookeeper的讨论都围绕着一条主线,它可以在分布式系统中协作多个任务。一个协作任务是指包含多个进程的任务。这个任务可以是为了协作或者是为了管理竞争。协作意味着多个进程需要一同处理某些事情,一些进程采取某些行动使得其他进程可以继续工作。比如典型的主-从(master-worker)工作模式中,从节点处于空闲状态时会通知主节点可以接受工作,于是主节点就会分配任务给从节点。竞争则不同,它指的是两个进程不能同时工作的情况,一个进程必须等待另外一个进程。同样在主-从工作模式中的例子中,我们想有一个主节点,但是很多进程也许都想成为主节点,因此我们需要实现互斥排他锁(mutual exclusion)。实际上,我们可以认为获取主节点身份的过程其实就是获取锁的过程,获得主节点控制权锁的进程即主节点进程。
在一台计算机上运行的多个进程和跨计算机运行的多个进程从概念上区分并不大。在多线程情况下有用的同步原语在分布式系统中也同样有效。一个重要的区别在于,在典型的不共享环境下不同的计算机之间不共享除了网络之外的其他任何信息。虽然许多消息传递算法可以实现同步原语,但是使用一个提供某种有序共享存储的组件往往更加简便,这正是Zookeeper所采用的方式。
协作并不总是采取像群首选举或者加锁等同步原语的形式。配置元数据也是一个进程通知其他进程需要做什么的一种常用方式。比如,在一个主-从系统中,从节点需要知道任务已经分配给它们。即使在主节点发生崩溃的情况下,这些信息也需要有效。典型ZooKeeper使用实例有Apache Kafka,Kafka是一个基于发布-订阅(pub-sub)模型的消息系统。其中Zookeeper用于检测崩溃,实现主题(topic)的发现,并保持主题的生产和消费状态。
当开发人员使用Zookeeper进行开发时,开发人员设计的那些应用往往可以看成一组连接到Zookeeper服务器端的客户端,它们通过Zookeeper的客户端API连接到ZK服务器端进行相应的操作,ZK的客户端API功能强大,其中包括(1)保障强一致性,有序性和持久性 (2)实现通用的同步原语的能力 (3)在实际分布式系统中,并发往往导致不正确的行为,Zookeeper提供了一种简单的并发处理机制。
二 Zookeeper不适用场景
整个ZK的服务器集群管理着应用协作的关键数据。ZK不适合做海量数据存储。对于需要存储海量应用数据的情况,有其他的备选方案,比如说数据库和分布式文件系统等。因为不同的应用有不同的需求,如对一致性和持久性的不同需求,所以在设计应用时,最佳实践还是应该将应用数据和协同数据独立开。
三 通过Zookeeper构建分布式系统
分布式系统的定义:分布式系统是同时跨越多个物理主机,独立运行的多个软件组件所组成的程序。采用分布式设计的原因很多,能够利用多处理器的运算能力来运行组件,比如并行复制任务。一个系统也许由于战略原因,需要分布在不同地点。对于分布式系统使用独立的协调组件有几个重要的好处(1)可以独立的设计和实现该组件。这样独立的组件可以跨多个应用共享(2)系统架构师可以简化协作方面的工作(3)可以独立的运行和协作这些组件。
软件组件以操作系统进程的方式运行,很多时候还涉及到多线程的执行。因此ZK的服务端和客户端也是以进程的方式运行,一个单独的物理机上运行一个单独的应用进程,以便利用现代处理器的多核处理能力。分布式系统中进程通信有两种选择:直接通过网络进行信息交换,或读写某些共享存储。ZK使用共享存储模型来实现应用间的协作和同步原语。对于共享存储本身,又需要在进程和存储间进行通信。因此网络通信是分布式中并发设计的基础。