

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

# Active/active Amazon IoT Greengrass V2 组件
<a name="pacemaker-tutorial-setup3"></a>

在此设置中，您可以使用自定义 OCF（开放集群框架）资源代理使用 Pacemaker 管理组 Amazon IoT Greengrass V2 件。这允许 Pacemaker 监控 Amazon IoT Greengrass V2 组件的运行状况，并在组件进入损坏状态时触发恢复操作。

**重要**  
除了 DRBD 设置步骤外，请[先决条件和集群设置](pacemaker-tutorial-prerequisites.md)先完成中的所有步骤，然后再继续。此安装程序不使用 DRBD。改 Amazon IoT Greengrass V2 为安装到每个实例的本地路径。 Amazon IoT Greengrass V2 必须预配置并在所有实例上运行。本教程假 Amazon IoT Greengrass V2 设安装在`/greengrass/v2`。如果您选择了不同的路径，请相应地更新 OCF 脚本中的`GG_CLI`变量。

## 创建自定义 OCF 资源代理
<a name="pacemaker-tutorial-setup3-ocf-agent"></a>

在所有实例上创建自定义资源代理目录和脚本。此示例管理一个名为的组件`PythonWebServer`。

```
sudo mkdir -p /usr/lib/ocf/resource.d/custom
```

使用以下内容在上`/usr/lib/ocf/resource.d/custom/gg-webserver`创建资源代理脚本。

```
#!/bin/bash
# OCF Resource Agent for Greengrass Web Server component
. /usr/lib/ocf/lib/heartbeat/ocf-shellfuncs

GG_CLI="/greengrass/v2/bin/greengrass-cli"
COMPONENT="PythonWebServer"
STATE_FILE="/run/gg-webserver.ocf-state"

case "$1" in
  meta-data)
  cat <<EOF
<?xml version="1.0"?>
<resource-agent name="gg-webserver">
  <version>1.0</version>
  <longdesc lang="en">Greengrass webserver component agent</longdesc>
  <shortdesc lang="en">GG Webserver</shortdesc>
  <parameters>
  </parameters>
  <actions>
    <action name="start" timeout="60"/>
    <action name="stop" timeout="10"/>
    <action name="monitor" timeout="5" interval="10"/>
    <action name="meta-data" timeout="5"/>
  </actions>
</resource-agent>
EOF
;;
  start)
    touch "$STATE_FILE"
    systemctl restart greengrass
    if [ $? -eq 0 ]; then
      exit $OCF_SUCCESS
    else
      rm -f "$STATE_FILE"
      exit $OCF_ERR_GENERIC
    fi
    ;;
  stop)
    rm -f "$STATE_FILE"
    exit $OCF_SUCCESS
    ;;
  monitor)
    # Check state file first — if absent, resource is stopped
    [ ! -f "$STATE_FILE" ] && exit $OCF_NOT_RUNNING
    # Check if the Greengrass service is running
    if ! systemctl is-active --quiet greengrass; then
      exit $OCF_NOT_RUNNING
    fi
    STATE=$($GG_CLI component details -n=$COMPONENT 2>/dev/null | grep '^[[:space:]]*State:' | awk '{print $2}')
    if [[ -z "$STATE" ]]; then
      ocf_log warn "Component $COMPONENT state is empty — component may not be deployed"
      exit $OCF_SUCCESS
    elif [[ "$STATE" == "BROKEN" ]]; then
      exit $OCF_ERR_GENERIC
    else
      exit $OCF_SUCCESS
    fi
    ;;
  *)
    echo "Usage: $0 {start|stop|monitor|meta-data}"
    exit $OCF_ERR_UNIMPLEMENTED
    ;;
esac
```

使脚本成为可执行文件。

```
sudo chmod +x /usr/lib/ocf/resource.d/custom/gg-webserver
```

**注意**  
该`start`操作会重新启动整个 Amazon IoT Greengrass V2 服务，这会重新启动实例上的所有组件，而不仅仅是。`PythonWebServer`这是唯一可行的恢复路径，因为 Amazon IoT Greengrass V2 不支持重启单个组件。该`stop`操作故意是禁用的，因为此代理是监视封装器—— Amazon IoT Greengrass V2 服务生命周期由 systemd 管理，而不是由此代理管理。如果某个组件持续存在`BROKEN`（例如，由于部署不当），Pacemaker 最多会重试`migration-threshold`几次，然后在该节点上禁止该资源直到到期。`failure-timeout`您必须修复根本原因（例如，重新部署有效的组件版本）才能停止重试周期。

## 附加资源
<a name="pacemaker-tutorial-setup3-attach-resource"></a>

使用自定义 OCF 代理创建 Pacemaker 资源。

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

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

```
sudo pcs resource create gg-webserver ocf:custom:gg-webserver \
  op monitor interval=30s \
  op start timeout=60s \
  meta migration-threshold=3 failure-timeout=60s \
  clone
```

## 验证恢复
<a name="pacemaker-tutorial-setup3-verify-recovery"></a>

1. **检查初始状态。**验证 Amazon IoT Greengrass V2 组件是否在所有实例上运行且运行正常。

   ```
   sudo pcs status
   ```

1. **模拟组件故障。**终止组件的进程以模拟瞬态故障。 Amazon IoT Greengrass V2 可能会先尝试内部恢复。如果组件进入`BROKEN`状态，Pacemaker 会检测到该状态并触发服务重启。如果在内部 Amazon IoT Greengrass V2 恢复组件，Pacemaker 将不采取任何行动。

   ```
   sudo pkill -f "PythonWebServer"
   
   # Wait 30-60 seconds, then check the component state
   sudo /greengrass/v2/bin/greengrass-cli component details -n=PythonWebServer
   ```

1. **验证恢复。**Pacemaker 检测到组件运行状况不佳，并按照自定义 OCF 脚本中的定义执行恢复步骤。无需故障转移 — Pacemaker 在同一实例上重新启动服务。

   诸如 HAProxy 之类的其他服务 Amazon IoT Greengrass V2 将继续在所有实例上正常运行。备用实例上的应用程序继续不受干扰地接受请求。

   ```
   sudo pcs status
   ```

   恢复的实例恢复后，负载均衡器会识别该实例，并根据需要分发客户端请求。