BLOG

Record, summarize, and improve.

集群、分布式、容器

简介

集群

集群就是逻辑上处理同一任务的机器集合,可以属于同一机房,也可分属不同的机房。

分布式计算

分布式这个概念可以运行在某个集群里面,某个集群也可作为分布式概念的一个节点。

分布式是指将不同的业务分布在不同的地方。而集群指的是将几台服务器集中在一起,实现同一业务

集群是相同功能体的复制,例如一个支付系统的集群,由3台服务器组成,则每个服务器运行的程序完全相同,功能相同,集群的目的是与负载均衡器配合,分摊运行压力。

Physical Model 物理模型

Nodes

节点 – 节点是具有处理数据、执行任务和与其他节点通信能力的终端设备。这些终端设备通常是用户端的计算机,也可以是服务器、工作站等。节点在表示层中为分布式系统提供接口,使用户能够与其他后端设备或节点进行交互,这些设备或节点可用于存储和数据库服务,或处理、Web 浏览等。每个节点都有一个操作系统、执行环境和不同的中间件要求,以促进通信和其他重要任务。

Links

链路 – 链路是不同节点和中间设备之间的通信通道。这些可以是有线的,也可以是无线的。有线链路或物理介质使用铜线、光纤电缆等实现。介质的选择取决于环境条件和要求。通常,高性能和实时计算需要物理链路。可以实现的不同连接类型如下:

  • Point-to-point links

    点对点链路 – 它建立连接并仅允许在两个节点之间传输数据

  • Broadcast links

    广播链路 – 它使单个节点能够同时向多个节点传输数据

  • Multi-Access links

    多接入链路 – 多个节点共享相同的通信通道以传输数据。需要协议来避免传输时的干扰

Middleware

中间件 – 这些是在节点上安装和执行的软件。通过在每个节点上运行中间件,分布式计算系统实现了去中心化的控制和决策。它处理各种任务,如与其他节点的通信、资源管理、容错、不同节点的同步和安全性,以防止恶意和未经授权的访问

Network Topology

网络拓扑 – 这定义了分布式计算系统中节点和链路的排列。最常见的网络拓扑是总线、星形、网状、环形或混合。拓扑的选择是通过确定确切的用例和要求来完成的。

Communication Protocols

通信协议 – 通信协议是从链路中传输数据的固定规则和程序。这些协议的示例包括 TCP、UDP、HTTPS、MQTT 等。这些允许节点通信和解释数据。

Architectural Model 建筑模型

Client-Server model

客户端-服务器模型 – 这是一种集中式方法,其中客户端发起服务请求,服务器通过提供这些服务进行响应。它主要工作在请求-响应模型上,客户端向服务器发送请求,服务器对其进行处理,并相应地响应客户端。它可以通过在传输层上使用 TCP/IP、HTTP 协议来实现。这主要用于 Web 服务、云计算、数据库管理系统等。

Peer-to-peer model

点对点模型 – 这是一种去中心化的方法,其中所有分布式计算节点(称为对等节点)在计算能力方面都是相同的,并且既可以请求其他节点,也可以向其他节点提供服务。这是一个高度可扩展的模型,因为对等方可以动态地加入和离开系统,这使其成为一种临时形式的网络。资源是分布式的,对等方需要在需要时寻找所需的资源。根据 P2P 网络中定义的一些既定规则和程序,通信在对等方之间直接完成,无需任何中介。这种计算方式的最好例子是 BitTorrent

Layered model

分层模型 – 它涉及将系统组织成多个层,其中每一层将提供特定的服务。每一层都使用某些定义明确的协议与相邻层进行通信,而不会影响系统的完整性。获得一个分层结构,其中每一层都抽象出较低层的底层复杂性

Micro-services model

微服务模型 – 在这个系统中,一个复杂的应用程序或任务被分解成多个独立的任务,这些服务在不同的服务器上运行。每个服务仅执行单个功能,并专注于特定的业务功能。这使得整个系统更易于维护、可扩展且更易于理解。服务可以自主开发、部署和扩展,而不会影响正在进行的服务。

Fundamental Model 基本模型

分布式计算系统中的基本模型是一个广泛的概念框架,有助于理解分布式系统的关键方面。这些涉及对属性的更正式描述,这些属性通常在所有体系结构模型中都很常见。它代表了理解分布式系统行为所需的基本组件。三个基本模型如下:

Interaction Model

交互模型 – 分布式计算系统充满了许多进程,这些进程以高度复杂的方式相互交互。交互模型提供了一个框架来理解用于各种流程之间的通信和协调的机制和模式。在此模型中重要的不同组件是:

  • Message Passing

    这些消息可能包含数据、指令、服务请求或不同计算节点之间的进程同步。它可以是同步的,也可以是异步的,具体取决于任务和进程的类型。

  • Publish/Subscribe Systems

    发布/订阅系统 – 也称为发布/订阅系统。在这种情况下,发布进程可以在主题上发布消息,订阅该主题的进程可以自行处理该消息并执行该进程。在事件驱动的体系结构中,它更为重要

Remote Procedure Call (RPC)

远程过程调用 (RPC) – 它是一种通信范例,能够调用远程进程上的新进程或方法,就好像它是本地过程调用一样。客户端进程使用 RPC 进行过程调用,然后使用通信协议将消息传递到所需的服务器进程。这些消息传递协议被抽象化,一旦从服务器进程获得结果,就会被发送回客户端进程以继续执行。

Failure Model

障模型 – 此模型用于解决分布式计算系统中发生的故障和故障。它提供了一个框架来识别和纠正系统中发生或可能发生的故障。实施容错机制,以便通过复制和错误检测和恢复方法处理故障。可能发生的不同故障包括:

  • Crash failures

    崩溃失败 – 进程或节点意外停止运行。

  • Omission failures

    遗漏失败 – 它涉及消息丢失,导致缺少所需的通信。

  • Timing failures

    定时故障 – 该过程偏离其预期的时间量,并可能导致延迟或不同步的响应时间。

  • Byzantine failures

    拜占庭故障 – 该进程可能会发送与设置的协议冲突的恶意或意外消息。

Security Model

安全模型 – 分布式计算系统可能会遭受恶意攻击、未经授权的访问和数据泄露。安全模型提供了一个框架,用于了解安全要求、威胁、漏洞和保护系统及其资源的机制。在安全模型中至关重要的各个方面是——

  • Authentication

    身份验证 – 它验证访问系统的用户的身份。它确保只有授权和受信任的实体才能访问。它涉及

    • Password-based authentication

      基于密码的身份验证 – 用户提供唯一的密码来证明其身份。

    • Public-key cryptography

      公钥加密 – 实体拥有私钥和相应的公钥,可以验证其真实性。

    • Multi-factor authentication

      多因素身份验证 – 使用多个因素(如密码、生物识别或安全令牌)来验证身份。

  • Encryption

    加密 – 它是将数据转换为没有解密密钥就无法读取的格式的过程。它可以保护敏感信息免遭未经授权的访问或披露。

Data Integrity

数据完整性 – 数据完整性机制可防止未经授权的修改或篡改数据。它们确保数据在存储、传输或处理过程中保持不变。数据完整性机制包括:

  • Hash functions

    哈希函数 – 从数据生成哈希值或校验和以验证其完整性。

  • Digital signatures

    数字签名 – 使用加密技术对数据进行签名并验证其真实性和完整性。

Image in a image block

而分布式架构的每个节点都是不同的,例如将支付系统拆分为实时支付服务、批量支付服务、对账服务,3个服务提供的功能彼此不同,相互协作成为一个系统生态,再对外提供服务。

Image in a image block

分布式架构往往要结合集群架构来提高可用性,例如支付系统被拆分为3个服务,为了提高每个服务的可用性,则每个服务都要采用集群模式部署。

Image in a image block

早期分布式调度系统以批处理系统为主,例如九几年的LSF/SGE/PBS等,这些批处理系统大规划的使用在HPC领域,而且对作业级的调度进行大量的研究工作;后续由批处理系统延伸出多集群、多组织资源共享的需求,便成了网络计算。

网络计算与云计算最大的不同是:网络计算强调多组织的资源共享,而云计算强调云厂商的集中式支持。这也是云计算成为主流的主要原因:多组织之间共享需要完备的协议和足够的安全支持,而云服务仅需要对用户提供相应服务和安全,并不需要在多个云厂商之间进行共享。

随着开源社区的发展,再将应用接口逐步统一,Hadoop出现后,不仅推动了分布式调度系统中对数据的处理,同时也推动了开源软件的生态。2012和2014是两个重要的节点,Hadoop将资源管理层与领域框架层分开,随后的领域框架也有机会构建自己的生态,同时,将资源管理层与领域框架分开也被广泛认可。

容器

在容器及Kuberentes(用于管理容器及其复杂的生产工作负载和可扩展性)流行后,凭借其高资源利用率与隔离,环境标准化等优势,越来越多的人希望将这些批量计算应用统一到 Kubernetes(K8s) 平台上。

Docker是一种轻量级的虚拟化技术,同时是一个开源的应用容器运行环境搭建平台,一个 Docker 容器封装了整个操作系统

virtualenv 仅封装 Python 依赖项。

docker

Docker 包括三个基本概念:参考

  • 镜像(Image):Docker 镜像是一个特殊的文件系统,除了提供容器运行时所需的程序、库、资源、配置等文件外,还包含了一些为运行时准备的一些配置参数(如匿名卷、环境变量、用户等)。镜像不包含任何动态数据,其内容在构建之后也不会被改变。
  • 容器(Container):镜像(Image)和容器(Container)的关系,就像是面向对象程序设计中的  和 实例 一样,镜像是静态的定义,容器是镜像运行时的实体。容器可以被创建、启动、停止、删除、暂停等。
  • 仓库(Repository):仓库(Repository)类似Git的远程仓库,集中存放镜像文件。

三者关系可以用下图表示:

Image in a image block

服务

  • 查看Docker版本信息

    docker version

  • 查看docker简要信息

    docker -v

  • 启动Docker

    systemctl start docker

  • 关闭docker

    systemctl stop docker

  • 设置开机启动

    systemctl enable docker

  • 重启docker服务

    service docker restart

  • 关闭docker服务

    service docker stop

镜像

镜像仓库

Docker Hub 等镜像仓库上有大量的高质量的镜像可以用,可以从仓库获取镜像。

  • 检索镜像

    docker search 关键字

  • 拉取镜像

    docker pull [选项] [Docker Registry 地址[:端口号]/]仓库名[:标签]

镜像管理
  • 列出镜像

    docker image ls

    docker images

  • 删除镜像

    删除指定镜像

    docker rmi <镜像Id>

  • 导出镜像

    将镜像保存为归档文件

    docker save

  • 导入镜像

    docker load

Dockerfile构建镜像

Dockerfile 是一个文本格式的配 文件,用户可以使用 Dockerfile 来快速创建自定义的镜像。

Dockerfile 由一行行行命令语句组成,并且支持以#开头的注释行.

Dockerfile常见指令

下面是Dockerfile中一些常见的指令:

  • FROM:指定基础镜像
  • RUN:执行命令
  • COPY:复制文件
  • ADD:更高级的复制文件
  • CMD:容器启动命令
  • ENV:设置环境变量
  • EXPOSE:暴露端口

其它的指令还有ENTRYPOINT、ARG、VOLUME、WORKDIR、USER、HEALTHCHECK、ONBUILD、LABEL等等。

以下是一个Dockerfile实例:

FROM java:8

MAINTAINER "jinshw"<jinshw@qq.com>

ADD mapcharts-0.0.1-SNAPSHOT.jar mapcharts.jar

EXPOSE 8080

CMD java -jar mapcharts.jar

镜像构建

docker build

镜像运行

镜像运行,就是新建并运行一个容器。

docker run [镜像ID]

容器生命周期
  • 启动:启动容器有两种方式,一种是基于镜像新建一个容器并启动,另外一个是将在终止状态(stopped)的容器重新启动。
    • 新建并启动

      docker run [镜像名/镜像ID]

    • 启动已终止容器

      docker start [容器ID]

  • 查看容器
    • 列出本机运行的容器

      docker ps

    • 列出本机所有的容器(包括停止和运行)

      docker ps -a

  • 停止容器
    • 停止运行的容器

      docker stop [容器ID]

    • 杀死容器进程

      docker kill [容器ID]

  • 重启容器

    docker restart [容器ID]

  • 删除容器

    docker rm [容器ID]

进入容器

进入容器有两种方式:

  • 如果从这个 stdin 中 exit,会导致容器的停止

    docker attach [容器ID]

  • 交互式进入容器

    docker exec [容器ID]

进入容器通常使用第二种方式,docker exec后面跟的常见参数如下:

-d, --detach 在容器中后台执行命令; -i, --interactive=true I false :打开标准输入接受用户输入命令

导出和导入
  • 导出容器

    导出一个已经创建的容器到一个文件

    docker export [容器ID]

  • 导入容器

    导出的容器快照文件可以再导入为镜像

    docker import [路径]

其它
  • 查看日志

    导出的容器快照文件可以再导入为镜像

    docker logs [容器ID]

    这个命令有以下常用参数 -f : 跟踪日志输出

    • -since :显示某个开始时间的所有日志 -t : 显示时间戳 --tail :仅列出最新N条容器日志
    • 复制文件

    从主机复制到容器

    sudo docker cp host_path containerID:container_path

    从容器复制到主机

    sudo docker cp containerID:container_path host_path

Image in a image block

docker run :创建一个新的容器并运行一个命令

语法

docker run [OPTIONS] IMAGE [COMMAND] [ARG...]

OPTIONS说明:

  • -a stdin: 指定标准输入输出内容类型,可选 STDIN/STDOUT/STDERR 三项;
  • -d: 后台运行容器,并返回容器ID;
  • -i: 以交互模式运行容器,通常与 -t 同时使用;
  • -P: 随机端口映射,容器内部端口随机映射到主机的端口
  • -p: 指定端口映射,格式为:主机(宿主)端口:容器端口
  • -t: 为容器重新分配一个伪输入终端,通常与 -i 同时使用;
  • -name="nginx-lb": 为容器指定一个名称;
  • -dns 8.8.8.8: 指定容器使用的DNS服务器,默认和宿主一致;
  • -dns-search example.com: 指定容器DNS搜索域名,默认和宿主一致;
  • -h "mars": 指定容器的hostname;
  • -e username="ritchie": 设置环境变量;
  • -env-file=[]: 从指定文件读入环境变量;
  • -cpuset="0-2" or --cpuset="0,1,2": 绑定容器到指定CPU运行;
  • -m :设置容器使用内存最大值;
  • -net="bridge": 指定容器的网络连接类型,支持 bridge/host/none/container: 四种类型;
  • -link=[]: 添加链接到另一个容器;
  • -expose=[]: 开放一个端口或一组端口;
  • -volume , -v: 绑定一个卷

docker run -it -v /home/zhuzhidan/code/tx8/pandecai/:/pandecai -p 10224:22 tensorflow/tensorflow:devel bash