View a markdown version of this page

先决条件和集群设置 - AWS IoT Greengrass

本文属于机器翻译版本。若本译文内容与英语原文存在差异,则一律以英文原文为准。

先决条件和集群设置

在本节中,您将为高可用性教程设置基础架构。您可以创建安全组、创建密钥对、启动 Amazon EC2 实例、安装 Pacemaker 和 DRBD、创建集群以及在实例之间配置块级复制。

创建和配置安全组

创建允许集群实例之间的所有流量的安全组。在本教程中,您可以打开所有端口以简化设置。此步骤需要一个 VPC。如果您没有 VPC,请参阅创建 VPC

控制台
  • 打开位于 https://console.aws.amazon.com/ec2/ 的 Amazon EC2 控制台。

  • 在导航窗格中,选择安全组,然后选择创建安全组

  • 输入名称(例如pacemaker-cluster-sg)和描述。

  • 选择您的 VPC。

  • 选择创建安全组

  • 创建后,选择新的安全组并编辑其入站规则。选择添加规则。将类型设置为所有流量,将来源设置为安全组自己的 ID。这允许该安全组中实例之间的所有流量。

  • 为 SSH 访问添加第二条入站规则。将 “类型” 设置为 SSH,将来源” 设置为 “我的 IP”。

AWS Command Line Interface
  • 创建安全组。

    aws ec2 create-security-group \ --group-name pacemaker-cluster-sg \ --description "Security group for Pacemaker HA cluster" \ --vpc-id your-vpc-id

    请注意输出GroupId中的(例如,sg-0123456789abcdef0)。

  • 添加入站规则以允许来自同一安全组中实例的所有流量。

    aws ec2 authorize-security-group-ingress \ --group-id security-group-id \ --protocol all \ --source-group security-group-id
  • 添加入站规则以允许从您的 IP 地址进行 SSH 访问。

    aws ec2 authorize-security-group-ingress \ --group-id security-group-id \ --protocol tcp \ --port 22 \ --cidr your-ip/32

创建密钥对

创建密钥对,用于 SSH 访问所有实例。在本教程中,对所有实例使用相同的密钥对。

控制台
  • 打开位于 https://console.aws.amazon.com/ec2/ 的 Amazon EC2 控制台。

  • 在导航窗格中,选择密钥对,然后选择创建密钥对

  • 输入名称(例如,pacemaker-key)。

  • 选择 RSA 作为密钥对类型,选择 .pem 作为文件格式。

  • 选择 Create key pair (创建密钥对)。私钥文件会自动下载。

警告

将私钥文件 (.pem) 保存在安全的位置。您无法再次下载。您需要此文件才能通过 SSH 连接到您的实例。

AWS Command Line Interface
  • 创建密钥对。

    aws ec2 create-key-pair \ --key-name key-name \ --query 'KeyMaterial' \ --output text > pacemaker-key.pem
  • 为私钥文件设置正确的权限。

    chmod 400 pacemaker-key.pem

启动 EC2 实例

在您创建的安全组中启动两个 Ubuntu Amazon EC2 实例。对于本教程来说,一个小的实例类型(例如t3.small)就足够了。

控制台
  • 打开位于 https://console.aws.amazon.com/ec2/ 的 Amazon EC2 控制台。

  • 选择 Launch instances

  • 输入实例的名称(例如,pacemaker-instance-1)。

  • 在 “应用程序和操作系统映像” 下,搜索 Ubuntu 并选择 Ubuntu Server AMI(例如 Ubuntu Server 24.04 LTS)。

  • 实例类型下,选择 t3.small

  • 在 “密钥对” 下,选择您之前创建的密钥。

  • 网络设置下,选择编辑,选择您的 VPC 和子网,然后在防火墙(安全组)下,选择选择现有安全组并选择pacemaker-cluster-sg

  • 选择启动实例

  • 对每个其他实例(例如pacemaker-instance-2)重复此操作。确保所有实例都在同一 VPC 和安全组中。

AWS Command Line Interface
  • 启动一个实例。

    aws ec2 run-instances \ --image-id ubuntu-ami-id \ --instance-type t3.small \ --key-name key-name \ --security-group-ids security-group-id \ --subnet-id subnet-id \ --count 1 \ --tag-specifications 'ResourceType=instance,Tags=[{Key=Name,Value=pacemaker-instance-1}]'

    Value=pacemaker-instance-2对于第二个实例,重复使用。

集群配置需要每个实例的私有 IP 地址。

  • 控制台:在 Amazon EC2 控制台中,选择一个实例,然后在详细信息选项卡中找到私有 IPv4 地址

  • AWS Command Line Interface:

    aws ec2 describe-instances \ --filters "Name=tag:Name,Values=pacemaker-instance-*" \ --query "Reservations[*].Instances[*].[Tags[?Key=='Name'].Value|[0],PrivateIpAddress]" \ --output table

安装起搏器实用程序

通过 SSH 连接到每个实例并安装 Pacemaker 实用程序。

ssh -i pacemaker-key.pem ubuntu@instance-public-ip
sudo apt update sudo apt install -y pacemaker pcs resource-agents-extra resource-agents-common resource-agents-base

配置网络通信

  1. 测试实例之间的通信。在目标实例上,运行以下命令以侦听来自源实例的 ping。

    sudo tcpdump host source-instance-private-ip

    在源实例上,运行以下命令以 ping 目标实例。

    ping -c 4 destination-instance-private-ip

    您应该会看到两边的 ping 响应。如果不是,请验证您的安全组是否允许实例之间的所有流量。

  2. 禁用云初始化主机名管理。在 Ubuntu Amazon EC2 实例上,cloud-init 可以在重启时恢复主机名和/etc/hosts更改。为了防止这种情况,请在每个实例上运行此命令。

    sudo bash -c 'cat > /etc/cloud/cloud.cfg.d/99-preserve-hostconfig.cfg <<EOF preserve_hostname: true manage_etc_hosts: false EOF'
  3. 在每个实例上设置主机名。Pacemaker 使用主机名来识别集群实例。

    在实例 1 中:

    sudo hostnamectl set-hostname instance1

    在实例 2 中:

    sudo hostnamectl set-hostname instance2
  4. 配置/etc/hosts在每个实例上,将私有 IP 和主机名对附加到。/etc/hosts这允许实例通过主机名相互解析。

    sudo tee -a /etc/hosts <<EOF instance1-private-ip instance1 instance2-private-ip instance2 EOF

创建 Pacemaker 集群

  1. 在每个实例@@ 上启动 pcs 守护程序

    sudo systemctl enable pcsd.service sudo systemctl start pcsd.service
  2. 设置黑客群集密码。hacluster用户是安装pcs软件包时自动创建的系统帐户。Pacemaker 使用此帐户在实例之间进行集群身份验证。在每个实例上设置相同的密码。

    sudo passwd hacluster
  3. 授权 pcs 主机。互相授权集群实例。在每个实例上运行它。

    sudo pcs host auth instance1 instance2

    系统将提示您输入hacluster用户名和密码。

  4. 设置集群。仅在一个实例上运行此命令。该--force标志会销毁设备上的任何现有集群。

    sudo pcs cluster setup my-gg-cluster instance1 instance2 --force
  5. 启动集群。仅在一个实例上运行此命令。

    sudo pcs cluster start --all sudo pcs cluster enable --all
  6. 验证任一实例的集群状态

    sudo pcs status

设置 DRBD

DRBD(分布式复制块设备)是一个 Linux 内核模块,可在实例之间实时复制存储设备。它在块设备级别(文件系统下方的原始磁盘级别)工作,因此在一个实例上写入磁盘的所有数据都会镜像到另一个实例上。这样可以确保在主实例出现故障时,备用实例拥有相同的数据副本。

  1. 创建并附加 EBS 卷。为每个实例创建一个 EBS 卷。该卷必须与实例位于同一个可用区。

    控制台
    • 打开位于 https://console.aws.amazon.com/ec2/ 的 Amazon EC2 控制台。

    • 在导航窗格中,选择,然后选择创建卷

    • 卷类型设置为 gp3,将大小设置为 8 GiB,将可用区域设置为与您的实例相同的区域。

    • 选择创建卷

    • 选择新卷,选择操作 > 附加卷,选择目标实例,将设备名称设置为/dev/xvdbz,然后选择连接卷

    • 对每个实例重复此操作。

    AWS Command Line Interface
    • 在与您的实例相同的可用区中创建卷。

      aws ec2 create-volume \ --volume-type gp3 \ --size 8 \ --availability-zone instance-availability-zone

      请注意输出VolumeId中的。

    • 将卷连接到实例。

      aws ec2 attach-volume \ --volume-id volume-id \ --instance-id instance-id \ --device /dev/xvdbz

      对每个实例重复此操作。

  2. 验证音量。通过 SSH 连接到每个实例,并通过列出块设备来验证卷是否已连接。

    lsblk

    在诸如的 Nitro-based 实例类型上t3.small,卷显示为 NVMe 设备(例如/dev/nvme1n1),而不是。/dev/xvdbzlsblk用于识别实际的设备名称,并在 DRBD 配置中使用该名称。

  3. 在每个实例上@@ 安装 DRBD 实用程序

    sudo apt install -y drbd-utils
  4. 配置 DRBD 资源。在两个实例上创建 DRBD 资源配置目录和文件。

    sudo mkdir -p /etc/drbd.d sudo vi /etc/drbd.d/greengrass.res

    添加以下配置。用您的值替换主机名和 IP 地址。

    resource greengrass { protocol C; on instance1 { device /dev/drbd0; disk /dev/instance1-device-name; address instance1-private-ip:7788; meta-disk internal; } on instance2 { device /dev/drbd0; disk /dev/instance2-device-name; address instance2-private-ip:7788; meta-disk internal; } }
  5. 创建并启动 DRBD 资源。在两个实例上运行。

    sudo drbdadm create-md greengrass sudo drbdadm up greengrass

    使用您lsblk的 EBS 音量设备下方drbd0显示的内容进行验证(例如,xvdbznvme1n1)。

  6. 设置主实例。仅在 instance1 上运行以下命令以强制其为主实例并等待同步。

    sudo drbdadm -- --overwrite-data-of-peer primary greengrass sudo drbdadm status

    等到两个实例都显示UpToDate磁盘状态。同步后,所有其他实例都将变为备用实例。

  7. 格式化并装载 DRBD 设备。

    仅在主实例上,格式化 DRBD 设备:

    sudo mkfs.ext4 /dev/drbd0

    在所有实例上,创建装载目录:

    sudo mkdir -p /greengrass/v2

    仅在主实例上,装载 DRBD 设备:

    sudo mount /dev/drbd0 /greengrass/v2
  8. 验证 DRBD 同步状态。

    sudo drbdadm status mount | grep 'drbd'