

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

# Active/passive AWS IoT Greengrass V2 服务
<a name="pacemaker-tutorial-setup1"></a>

在此设置中，您一次只能在一个实例上 AWS IoT Greengrass V2 作为 systemd 服务运行。Pacemaker 将 DRBD 复制、文件系统装载和 AWS IoT Greengrass V2 服务作为有序资源进行管理。如果主实例出现故障，Pacemaker 会将备用实例的 DRBD 提升为主实例，挂载文件系统并启动。 AWS IoT Greengrass V2

**重要**  
在继续操作[先决条件和集群设置](pacemaker-tutorial-prerequisites.md)之前，请完成中的所有步骤。

**警告**  
除非另有说明，否则仅在主实例上运行以下命令。

## 附加 DRBD 资源
<a name="pacemaker-tutorial-setup1-drbd-resource"></a>

在继续操作之前，请验证 Pacemaker 是否正在运行。

```
sudo systemctl status pacemaker
```

在创建任何资源之前禁用 STONITH。如果未配置屏蔽设备，则如果启用 STONITH（默认），Pacemaker 将拒绝启动资源。

```
sudo pcs property set stonith-enabled=false
```

**警告**  
为了简化本教程，此处禁用 STONITH。在生产环境中，您必须启用 STONITH 并配置隔离代理（例如，用于 Amazon EC2 实例），`fence_aws`以防止大脑分裂和数据损坏。

在主实例上卸载 DRBD 设备并关闭所有实例上的 DRBD，这样 Pacemaker 就可以完全控制 DRBD 生命周期。

```
# On the primary instance only
sudo umount /greengrass/v2

# On all instances
sudo drbdadm down greengrass
```

在 Pacemaker 中创建 DRBD 资源。

```
sudo pcs resource create drbd-greengrass \
  ocf:linbit:drbd drbd_resource=greengrass \
  op monitor interval=15s role=Promoted \
  op monitor interval=30s role=Unpromoted
```

将资源配置为可升级，以便一次只有一个实例是主实例。设置`clone-max`为集群中的实例数量。

```
sudo pcs resource promotable drbd-greengrass \
  promoted-max=1 promoted-node-max=1 clone-max=2 clone-node-max=1 notify=true
```

## 附加文件系统资源
<a name="pacemaker-tutorial-setup1-fs-resource"></a>

所有 AWS IoT Greengrass V2 资源都存储在`/greengrass/v2`。此步骤告诉 Pacemaker 在提升的实例上的该路径上安装 DRBD 设备。这样可以确保 AWS IoT Greengrass V2 数据目录在故障转移期间被复制并可用。

在禁用状态下创建文件系统资源。在所有约束条件都到位后，您将启用它。

```
sudo pcs resource create fs_greengrass Filesystem \
    device="/dev/drbd0" \
    directory="/greengrass/v2" \
    fstype="ext4" \
    op start timeout=15s \
    op stop timeout=15s \
    --disabled
```

## 验证资源
<a name="pacemaker-tutorial-setup1-verify-resources"></a>

验证资源是否已创建并传播到所有实例。

```
sudo pcs status
```

## 配置并附上 AWS IoT Greengrass V2 systemd 资源
<a name="pacemaker-tutorial-setup1-greengrass-resource"></a>

1. **规定 AWS IoT Greengrass V2。**由于您之前已卸载 DRBD 设备，因此请启用维护模式并重新安装它进行配置：

   ```
   # Enable maintenance mode to prevent Pacemaker from interfering
   sudo pcs property set maintenance-mode=true
   
   # Check which node Pacemaker promoted to Primary
   sudo pcs status | grep drbd-greengrass
   
   # On the Promoted node, mount the DRBD device
   sudo mount /dev/drbd0 /greengrass/v2
   ```

   使用自动配置在主实例 AWS IoT Greengrass V2 上进行配置。按照[安装 AWSAWS IoTAWS IoT Greengrass V2 核心软件中的说明进行操作，并自动配置资源](https://docs.aws.amazon.com/greengrass/v2/developerguide/quick-installation.html)。

   确保 AWS IoT Greengrass V2 已将其安装到`/greengrass/v2`目录（ DRBD-mounted 路径）。配置完成后，卸载设备并禁用维护模式：

   ```
   sudo umount /greengrass/v2
   sudo pcs property set maintenance-mode=false
   ```

1. **禁用该 AWS IoT Greengrass V2 服务**，以便 Pacemaker 可以代替 systemd 对其进行管理。

   ```
   sudo systemctl disable greengrass
   sudo systemctl stop greengrass
   ```

1. **在所有备用实例上安装运行时必备组件。** AWS IoT Greengrass V2 需要自动置备器在 DRBD-replicated 目录之外安装的 Java 和其他依赖项。在每个备用实例上安装相同的 JDK 版本。有关先决条件的完整列表，请参阅[AWS IoT Greengrass V2 要求](https://docs.aws.amazon.com/greengrass/v2/developerguide/setting-up.html)。

1. **在其他实例上创建 systemd 单元文件。**将 AWS IoT Greengrass V2 systemd 单元文件复制到备用实例，这样 Pacemaker 就可以在故障转移期间在任何实例上启动服务。

   ```
   # On the primary instance, view the unit file location
   systemctl show -p FragmentPath greengrass
   ```

   将该文件复制到彼此实例上的相同路径。然后在每个备用实例上重新加载 systemd，使其识别新的单元文件。

   ```
   # On each standby instance
   sudo systemctl daemon-reload
   ```

1. **附加 AWS IoT Greengrass V2 资源。**

   ```
   sudo pcs resource create greengrass systemd:greengrass \
     op monitor interval=10s \
     op start timeout=60s \
     op stop timeout=60s \
     --disabled
   ```

## 创建资源限制
<a name="pacemaker-tutorial-setup1-constraints"></a>

创建约束顺序，以便 Pacemaker 在故障转移期间按正确的顺序管理资源。

```
sudo pcs constraint order promote drbd-greengrass-clone then start fs_greengrass
sudo pcs constraint colocation add fs_greengrass with Promoted drbd-greengrass-clone score=INFINITY
sudo pcs resource group add greengrass-group fs_greengrass greengrass
sudo pcs constraint location greengrass-group prefers {{instance1}}=200
```

既然限制已经到位，就启用资源。

```
sudo pcs resource enable fs_greengrass
sudo pcs resource enable greengrass
```

验证资源限制的最终状态。

```
sudo pcs constraint show
```

输出应显示以下约束：
+ **位置限制**-`greengrass-group` 资源组首选主实例。
+ **主机托管约束** — 与升级版一起`fs_greengrass`运行`drbd-greengrass-clone`，与一起`greengrass``fs_greengrass`运行。
+ **顺序限制** — DRBD 在文件系统启动之前升级，文件系统在启动之前启动。 AWS IoT Greengrass V2

## 验证故障转移
<a name="pacemaker-tutorial-setup1-failover"></a>

模拟故障转移以验证设置是否有效。

1. **检查初始状态。**验证主实例上是否 AWS IoT Greengrass V2 正在运行。

   ```
   sudo pcs status
   ```

1. **模拟主实例故障。**将主节点置于待机模式以触发资源迁移。

   ```
   sudo pcs node standby {{primary-node-name}}
   ```

1. **验证故障转移。**在备用实例上，检查集群状态。DRBD、文件系统和 AWS IoT Greengrass V2 资源现在应该在备用实例上运行。

   ```
   sudo pcs status
   ```

1. **恢复失败的实例。**

   ```
   sudo pcs node unstandby {{primary-node-name}}
   ```

   当节点恢复在线状态时，它会作为备用实例重新加入集群。在故障转移期间升级的实例仍为主实例。

**问题排查**  
如果资源进入故障状态，则可以使用以下命令对其进行清理并重新启动。  

```
sudo pcs resource cleanup
```