

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

# 先决条件和集群设置
<a name="pacemaker-tutorial-prerequisites"></a>

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

## 创建和配置安全组
<a name="pacemaker-tutorial-prerequisites-sg"></a>

创建允许集群实例之间的所有流量的安全组。在本教程中，您可以打开所有端口以简化设置。此步骤需要一个 VPC。如果您没有 VPC，请参阅[创建 VPC](https://docs.amazonaws.cn/vpc/latest/userguide/create-vpc.html)。

**控制台**
+ 打开位于 [https://console.aws.amazon.com/ec2/](https://console.amazonaws.cn/ec2/) 的 Amazon EC2 控制台。
+ 在导航窗格中，选择**安全组**，然后选择**创建安全组**。
+ 输入名称（例如`pacemaker-cluster-sg`）和描述。
+ 选择您的 VPC。
+ 选择**创建安全组**。
+ 创建后，选择新的安全组并编辑其入站规则。选择**添加规则**。将**类型**设置为**所有流量**，将**来源**设置为安全组自己的 ID。这允许该安全组中实例之间的所有流量。
+ 为 SSH 访问添加第二条入站规则。将 “**类型”** 设置为 **SSH，将** “**来源**” 设置为 “**我的 IP**”。

**Amazon 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
  ```

## 创建密钥对
<a name="pacemaker-tutorial-prerequisites-keypair"></a>

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

**控制台**
+ 打开位于 [https://console.aws.amazon.com/ec2/](https://console.amazonaws.cn/ec2/) 的 Amazon EC2 控制台。
+ 在导航窗格中，选择**密钥对**，然后选择**创建密钥对**。
+ 输入名称（例如，`pacemaker-key`）。
+ 选择 **RSA** 作为密钥对类型，选择 **.pem** 作为文件格式。
+ 选择 **Create key pair (创建密钥对)**。私钥文件会自动下载。

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

**Amazon 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 实例
<a name="pacemaker-tutorial-prerequisites-instances"></a>

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

**控制台**
+ 打开位于 [https://console.aws.amazon.com/ec2/](https://console.amazonaws.cn/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 和安全组中。

**Amazon 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 地址**。
+ **Amazon 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
  ```

## 安装起搏器实用程序
<a name="pacemaker-tutorial-prerequisites-install"></a>

通过 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
```

## 配置网络通信
<a name="pacemaker-tutorial-prerequisites-network"></a>

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

   ```
   sudo tcpdump host {{source-instance-private-ip}}
   ```

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

   ```
   ping -c 4 {{destination-instance-private-ip}}
   ```

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

1. **禁用云初始化主机名管理。**在 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'
   ```

1. **在每个实例上设置主机名。**Pacemaker 使用主机名来识别集群实例。

   在实例 1 中：

   ```
   sudo hostnamectl set-hostname instance1
   ```

   在实例 2 中：

   ```
   sudo hostnamectl set-hostname instance2
   ```

1. **配置`/etc/hosts`。**在每个实例上，将私有 IP 和主机名对附加到。`/etc/hosts`这允许实例通过主机名相互解析。

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

## 创建 Pacemaker 集群
<a name="pacemaker-tutorial-prerequisites-cluster"></a>

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

   ```
   sudo systemctl enable pcsd.service
   sudo systemctl start pcsd.service
   ```

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

   ```
   sudo passwd hacluster
   ```

1. **授权 pcs 主机。**互相授权集群实例。在每个实例上运行它。

   ```
   sudo pcs host auth instance1 instance2
   ```

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

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

   ```
   sudo pcs cluster setup my-gg-cluster instance1 instance2 --force
   ```

1. **启动集群。**仅在一个实例上运行此命令。

   ```
   sudo pcs cluster start --all
   sudo pcs cluster enable --all
   ```

1. **验证任一实例的集群状态**。

   ```
   sudo pcs status
   ```

## 设置 DRBD
<a name="pacemaker-tutorial-prerequisites-drbd"></a>

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

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

**控制台**
   + 打开位于 [https://console.aws.amazon.com/ec2/](https://console.amazonaws.cn/ec2/) 的 Amazon EC2 控制台。
   + 在导航窗格中，选择**卷**，然后选择**创建卷**。
   + 将**卷类型**设置为 **gp3**，将**大小**设置为 **8 GiB**，将**可用区域**设置为与您的实例相同的区域。
   + 选择**创建卷**。
   + 选择新卷，选择**操作** > **附加卷**，选择目标实例，将设备名称设置为`/dev/xvdbz`，然后选择**连接卷**。
   + 对每个实例重复此操作。

**Amazon 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
     ```

     对每个实例重复此操作。

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

   ```
   lsblk
   ```

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

1. 在每个实例上@@ **安装 DRBD 实用程序**。

   ```
   sudo apt install -y drbd-utils
   ```

1. **配置 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;
       }
   }
   ```

1. **创建并启动 DRBD 资源。**在两个实例上运行。

   ```
   sudo drbdadm create-md greengrass
   sudo drbdadm up greengrass
   ```

   使用您`lsblk`的 EBS 音量设备下方`drbd0`显示的内容进行验证（例如，`xvdbz`或`nvme1n1`）。

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

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

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

1. **格式化并装载 DRBD 设备。**

   仅在主实例上，格式化 DRBD 设备：

   ```
   sudo mkfs.ext4 /dev/drbd0
   ```

   在所有实例上，创建装载目录：

   ```
   sudo mkdir -p /greengrass/v2
   ```

   仅在主实例上，装载 DRBD 设备：

   ```
   sudo mount /dev/drbd0 /greengrass/v2
   ```

1. **验证 DRBD 同步状态。**

   ```
   sudo drbdadm status
   mount | grep 'drbd'
   ```