前言

分布式系统概念

百度百科上介绍说


分布式系统是建立在网络之上的软件系统,拥有软件特性,所以分布式系统具有高度内聚性,和透明性。是建设于网络之上的高层软件,而不是硬件。


是不是很难理解,也很拗口,简单的说:


分布式系统是同时跨域多个本地物理主机,独立运行多个软件所组成的系统,同时解决系统之间的通信问题。换种更简单的说法,分布式系统就是一个团体集中力量干一件事情,就是人多力量大。在项目中,每个服务器的运算能力是有上限的,但是通过分布式系统将 n 个服务器组成一个集群,那整个集群的运算能有很大的提升,如果 n 可以无限扩张,则集群的运算能力也可以无限提升的。


分布式系统的特点

既然上面已经知道了分布式系统的概念,那么就很容易理解分布式系统的特点。

  • 分布性:分布式由多台计算机组成,在地域上是独立分散的,可以分散在一个单位,一个城市,一个国家,或是全球范围内。整个系统的统一功能是分散在多个节点上实现的,因而分布式系统具有数据处理的分布式特性。
  • 自治性:分布式系统各个节点包含自己独有的cpu和内存,具备独立的处理数据能力。一般来说每个节点是对等的,没有主次之分,可以自治的进行任务处理,还可以通过网络传输信息,协同完成任务处理。
  • 并行性:一个大的任务可以按规则划分到多个计算节点上进行独立的子任务支持,体现了并行性。
  • 全局性:分布式系统必须存在一个单一的,全局的通信机制,使得任何一个进程都能和其他进程通信,并且不区分本地通信和远程通信。在一个分布式集群中,往往所有机器具有统一的系统调用能力。

分布式遇到的问题

分布式系统既然有那么多特点,当然也会有缺点。就拿一个5人软件开发团队来当作分布式系统。

团队中会遇到很多问题。

  • 谁来当团队 leader ?
  • 开发过程后团队如何分配任务?
  • leader 如何了解项目的进度?
  • 开发过程中,组员离职,如何进行交接?
  • 开发过程中,leader 离职后,谁来当 leader ?
  • 开发工期紧,需要增派人手,如何添加到项目组中?

在现实开发中这些问题都是不可避免的问题,造成这些问题的原因有很多,比如项目中沟通不及时,导致任务分配有歧义、出现信息遗漏。

即使是在现实生活中,出现这些问题,可以去协调、人工补错等方法来进行补救,但是在程序,一切都要有严格的流程要求,一定要保证流程的严瑾,才尽可能的避免上述问题的发生。因此,分布式系统必须采⽤合理的⽅式解决掉以上的问题。

分布式如何解决上述问题

分布式系统的协调各个系统之间的工作就是通过某一个方式,让每个节点的信息都能同步和共享,从而达到数据的一致性。这种情况依赖于服务进程之间的通信。

  • 通过⽹络进⾏信息共享

这就像现实中,开发leader在会上把任务传达下去,组员通过听leader命令或者看leader的邮件知道⾃⼰要⼲什么。当任务分配有变化时,leader会单ᇿ告诉组员,或者再次召开会议。信息通过⼈与⼈之间的直接沟通,完成传递。

  • 通过共享存储

这就好⽐开发leader按照约定的时间和路径,把任务分配表放到了svn上,组员每天去svn上拉取最新的任务分配表,然后⼲活。其中svn就是共享存储。更好⼀点的做法是,当svn⽂件版本更新时,触发邮件通知,每个组员再去拉取最新的任务分配表。这样做更好,因为每次更新,组员都能第⼀时间得到消息,从⽽让⾃⼰⼿中的任务分配表永远是最新的。此种⽅式依赖于中央存储。

简单聊一聊什么是 Zookeeper ?_分布式系统

Zookeeper

Zookeeper定义

通过前言了解到分布式系统的概念和解决的问题,那么 Zookeper 是如何进行解决这些问题的。首先了解 Zookeeper 的基本定义。

Zookeeper 是一个开源的分布式协调服务,主要目标是将复杂并且容易出错的分布式一致性服务封装起来,构成一个高效可靠的原语集,并提供一些简单的接口给用户使用。分布式系统可以基于 Zookeeper 实现数据订阅/发布、负载均衡、命名服务、集群管理、分布式锁等功能。

Zookeeper 概念

集群角色

一般情况下,分布式系统中每台机器都会有自己的角色。最常见的集群就是 Master/Slave 模式,主从复制模式是把写操作的机器称为 Master 机器,把所有通过异步复制方式从 Master 机器中获取数据并提供读服务的机器为 Slave 机器。

在 Zookeeper 中,没有沿用 Master/Slave 模式,而是引入了 Leader、Follower、Observer三种角色。

Zookeeper集群通过共同选举的方式来确定一台机器为 Leader,Leader 机器主要为客户端提供读和写服务。其他机器可能是 Follower 和Observer。Follower 和 Observer 的机器只提供读服务。

Observer 不参加 Leader 的选举过程,只有 Follower 参加选举过程,相当于 Observer 在选举中只是一个第三方旁观者角色。因此 Observer 可以在不影响写性能的情况下提升集群的性能。

Session 会话

Session 会话是指客户端的连接,一个客户端连接是指客户端和服务端之间建立的一个 TCP 长连接。同时 Zookeeper 对外开放的端口是 2181 ,这个端口号可以在 Zookeeper 的配置文件中更改。

客户端启动时,首先会与服务器建立一个 TCP 连接,从第一次连接建立开始,客户端的生命周期也被创建开始,通过 TCP 连接,客户端可以进行心跳检测来跟服务端保持有效的会话,也能够向 Zookeeper 服务器发送请求并接受相应,同时还能够通过 TCP 连接接受来自服务端的 Watch 监听事件的通知。

Znode 数据节点

在分布式系统中,一个节点一般代表集群中的一台机器。但是在 Zookeeper 中,节点分为两类。

第一类一般是指构建汲取的机器或者服务器,这种统称为机器节点。

第二类是指数据模型中的数据单元,这种一般称为数据节点 Znode 。ZooKeeper 将所有数据存储在内存中,数据模型是⼀棵树( ZNode Tree),由斜杠(/)进⾏分割的路径,就是⼀个 Znode ,例如 /app/path。每个 ZNode 上都会保存⾃⼰的数据内容,同时还会保存⼀系列属性信息。

版本

既然 Zookeeper 的每个 Znode 节点都会存储数据,那么对于 Znode,Zookeeper 都会维护一个 Stat的技术结构。Stat记录了 Znode 的三个数据版本,一个是 Version 主要是当前 Znode 的版本,一个时是Cversion 主要是当前子节点的版本,一个是 Aversion 主要是当前 Znode 的 ACL 版本。

Watcher 事件监听器

Watcher 是 Zookeeper 中非常重要的一个特点。 Zookeeper 允许用户在指定的节点上注册一些事件监听器,并且在特殊事件中进行触发,Zookeeper 会将事件通知到感兴趣的客户端中。Watcher 是 Zookeeper 实现分布式协调服务的重要特性。

ACL 权限控制

Zookeeper 采⽤ ACL(Access Control Lists)策略来进⾏权限控制。定义了 五种权限:

  • CREATE : 创建子节点的权限。
  • READ : 获取节点数据和子节点列表的权限
  • WRITE : 更新节点数据的权限
  • DELETE : 删除子节点的权限
  • ADMIN : 设置节点的 ACL 权限

总结

通过上述对于 Zookeeper 的介绍,大体上知道了 Zookeeper 是做什么的,有哪些特性,同时也对 Zookeeper 有一个初步的整体认识。后续会将 Zookeeper 的安装和基本Api使用都分享出来。