分布式概念:集中式架构(Mesos、Kubernets)与非集中式结构(Redis)

集中式结构

由一台或多台服务器组成*服务器,系统内所有的业务也均先由*服务器处理。多个节点服务器与*服务器连接,并将自己的信息汇报给*服务器,由*服务器统一进行资源和任务调度:*服务器根据这些信息,将任务下达给节点服务器;节点服务器执行任务,并将结果反馈给*服务器。

Google Borg
Borg 是 Google 内部使用的集群管理系统,采用了典型的集中式结构,负责提交、调度、开始、重启和管理 Google 运行在其上的所有应用。
 

Kubernetes是Borg的一个开源版本
Kubernetes 是用于自动部署、扩展和管理容器化应用程序的开源系统。其核心是,在集群的节点上运行容器化应用,可以进行自动化容器操作,包括部署、调度和在节点间弹性伸缩等
 Master 节点。它运行在中心服务器上,Master 节点由 API Server、Scheduler、Cluster State Store 和 Control Manger Server 组成,负责对集群进行调度管理。
 API Server:是所有 REST 命令的入口,负责处理 REST 的操作,确保它们生效,并执行相关业务逻辑。

Scheduler:根据容器需要的资源以及当前 Worker 节点所在节点服务器的资源信息,自动为容器选择合适的节点服务器。
 Cluster State Store:集群状态存储,默认采用 etcd,etcd 是一个分布式 key-value 存储,主要用来做共享配置和服务发现。
 Control Manager:用于执行大部分的集群层次的功能,比如执行生命周期功能(命名空间创建和生命周期、事件垃圾收集、已终止垃圾收集、级联删除垃圾收集等)和 API 业务逻辑。

Worker 节点。真正的工作节点,运行在从节点服务器,包括 kubelet 和 kube-proxy 核心组件,负责运行业务应用的容器。

kubelet:用于通过命令行与 API Server 进行交互,根据接收到的请求对 Worker 节点进行操作。通过与 API Server 进行通信,接收 Master 节点根据调度策略发出的请求或命令,在 Worker 节点上管控容器(Pod),并管控容器的运行状态(比如,重新启动出现故障的 Pod。

kube-proxy:负责为容器(Pod)创建网络代理 / 负载平衡服务,从 API Server 获取所有 Server 信息,并根据 Server 信息创建代理服务,这种代理服务称之为 Service。

分布式概念:集中式架构(Mesos、Kubernets)与非集中式结构(Redis)

Mesos

Mesos 只负责底层资源的管理和分配,并不涉及存储、 任务调度等功能,因此 Mesos Master 对接的是 Spark、Hadoop、Marathon 等框架,用户的任务需要提交到这些框架上。也正因为此,Mesos 的任务调度框架是双层结构。

Mesos Master 负责收集和管理所有 Agent 所在服务器的资源和状态,并且对接 Spark、Hadoop 等框架,将集群中服务器的资源信息告知给这些框架,以便这些框架进行任务资源匹配和调度。

Mesos Agent 负责任务的拉起、停止、重启等,并负责收集所在服务器的资源 (比如 CPU、内存等) 信息和状态,上报给 Mesos Master。

分布式概念:集中式架构(Mesos、Kubernets)与非集中式结构(Redis)

非集中式架构

服务的执行和数据的存储被分散到不同的服务器集群,服务器集群间通过消息传递进行通信和协调

在非集中式结构中,没有*服务器和节点服务器之分,所有的服务器地位都是平等(对等)的,这降低了某一个或者某一簇计算机集群的压力,在解决了单点瓶颈和单点故障问题的同时,还提升了系统的并发度,比较适合大规模集群的管理。

Redis 是一个开源的高性能分布式 key-value 数据库,数据可分片存储在不同的 Redis 节点上,多个 Redis 节点间可共享数据,而提供这项能力的就是 Redis 集群。

 Redis 集群中不存在*节点,是典型的去中心化结构,每个节点均可与其他节点通信。所有节点均可负责存储数据、记录集群的状态(包括键值到正确节点的映射),客户端可以访问或连接到任一节点上。

集群节点同样能自动发现其他节点,检测故障的节点,并在需要的时候在从节点中推选出主节点。

Redis 集群中的节点用于数据存储,所以在设计时,需要考虑数据的可靠性和分片存储问题。

对于可靠性的问题,集群中每个节点均存在主备,也就是说每台服务器上都运行两个 Redis 服务,分别为主备,主故障后,备升主。

对于数据的分片存储问题,Redis 集群引入了哈希槽的概念。Redis 集群内置了 16384 个哈希槽,每个节点负责一部分哈希槽。当客户端要存储一个数据或对象时,对该对象的 key 通过 CRC16 校验后对 16384 取模,也就是 HASH_SLOT = CRC16(key) mod 16384 来决定哈希槽,从而确定存储在哪个节点上。

Redis 集群采用集群分片方式实现了数据的分片存储,从而将 Redis 的写操作分摊到了多个节点上,提高了写并发能力。

 

Gossip 是一种谣言传播协议,每个节点周期性地从节点列表中选择 k 个节点,将本节点存储的信息传播出去,直到所有节点信息一致,即算法收敛了。

每个节点记录当前传输的消息且还未达到收敛的时候,已经发送给了哪些节点,然后每次选择时从没有发送过的节点列表中随机选择 k 个节点,直到所有节点均被传输或集群收敛为止。这样,一方面减少了重复消息量,另一方面加快了收敛速度。