想要弄清楚集群与分布式的区别,可以先看网络上的一个具体例子:
小饭店原来只有一个厨师,负责切菜、洗菜、备料、炒菜。后来顾客增多,饭店又请了一个厨师,两个厨师能炒一样的菜,这两个厨师的关系就是集群。为了让厨师专心炒菜,饭店又聘请了一位配菜师负责切菜、备菜、备料,那么厨师和配菜师的关系就是分布式。如果一个配菜师忙不过来,饭店又请来一个配菜师,那么两个配菜师的关系也是集群。
我们再来看另一个例子:
一个任务由10个子任务组成,每个子任务单独执行需要1小时,在一台服务器上执行该任务则需要10小时。采用分布式方案,提供10台服务器,每台服务器只负责处理一个子任务,不考虑子任务间的依赖关系,执行完这个任务只需要一个小时。而采用集群方案,同样提供10台服务器,每台服务器都能独立处理这个任务。假设有10个任务同时到达,10台服务器将同时工作,10小时后,10个任务同时完成。
从以上实例中可以看出,分布式主要是指将不同的业务分布到不同的地方;而集群主要是指将几台服务器集中在一起,实现同一个业务。同时,分布式是以缩短单个任务的执行时间来提升效率的,解决高并发问题;而集群主要是通过提高单位时间内执行的任务数来提升效率的,提高系统的可用性。所以集群是保证系统高可用的重要手段之一。
最后,集群可能运行着一个或多个分布式系统,也可能根本没有运行分布式系统。分布式系统可能运行在一个集群上,也可能运行在不属于一个集群的多台机器上。分布式中的每一个节点都可以做集群,而集群并不一定就是分布式的。从图1-5和图1-6可以清楚地看出集群架构和分布式架构的区别。
图1-5 集群架构
图1-6 分布式架构
分布式架构可以简单分为集中式架构和非集中式架构。
在很多场景下,我们的请求都会汇总到一台服务器上,由这台服务器统一协调我们的请求和其他服务器之间的关系。这种由一台服务器统一管理其他服务器的方式就是分布式体系结构中的集中式架构(也称为Master/Slave架构),如图1-7所示,其中统一管理其他服务器的服务器是主,其他服务器是从。
图1-7 集中式架构
系统内所有的业务都先由Master处理,多个Slave与Master连接,并将自己的信息汇报给Master,由Master统一进行资源和任务调度并存储集群节点的状态,然后Master根据这些信息将任务下达给Slave。Slave执行任务并将结果反馈给Master。
集中式结构最大的特点就是部署结构简单。这是因为集中式系统的中央服务器往往是多个具有较强计算能力和存储能力的计算机,为此中央服务器进行统一管理和任务调度时,无须考虑对任务的多节点部署,而节点服务器之间无须通信和协作,只要与中央服务器通信协作即可。
集中式架构的应用场景非常多,比如SVN、Borg、Kubernetes的集群管理机制都是这样的。
下面介绍Kubernates的集群管理机制。
Kubernetes(常简称为k8s)是用于自动部署、扩展和管理容器化(Containerized)应用程序的开源系统,它旨在提供跨主机集群的自动部署、扩展以及运行应用程序容器的平台,支持一系列容器工具,包括Docker等。Kubernetes架构如图1-8所示。
图1-8 Kubernetes集中式架构
Kubernetes也是典型的集中式结构,一个Kubernetes集群主要由Master节点和Worker节点组成,以及客户端命令行工具Kubectl和其他附加项。
集中式结构对中心服务器性能的要求很高,而且存在单点瓶颈和单点故障问题。为了解决这个问题,分布式领域中又出现了另一个经典的系统结构,即非集中式结构,也叫作分布式结构,如图1-9所示。
图1-9 非集中式架构
在非集中式结构中,没有中央服务器和节点服务器之分,所有的服务器地位都是平等(对等)的。相比于集中式结构,非集中式结构降低了某一个或者某一簇计算机集群的压力,在解决了单点瓶颈和单点故障问题的同时,还提升了系统的并发度,比较适合大规模集群的管理。
比较典型的非集中式架构系统有Akka集群、Redis集群和Cassandra集群等。Redis集群在后续的章节会深入讲解,这里我们讲一下Cassandra集群架构。
Cassandra的名称来源于希腊神话,是特洛伊的一位悲剧性的女先知的名字,因此项目的Logo是一只放光的眼睛。
Cassandra的系统架构是基于一致性哈希的完全P2P架构,每行数据通过哈希来决定应该存在哪个或哪些节点中。集群没有Master的概念,所有节点都是同样的角色,彻底避免了整个系统的单点问题导致的不稳定性,集群间的状态同步通过Gossip协议来进行P2P的通信。每个节点都把数据存储在本地,每个节点都接受来自客户端的请求。每次客户端随机选择集群中的一个节点来请求数据,对应接受请求的节点将对应的key在一致性哈希的环上定位由哪些节点存储这个数据,将请求转发到对应的节点上,并将对应若干节点的查询反馈返回给客户端,具体如图1-10所示。
图1-10 Cassandra系统架构图