Menu Close
Settings Close

Language and Page Formatting Options

第 4 章 在 AWS 上配置红帽高可用性集群

本章包含使用 EC2 实例作为集群节点在 Amazon Web Services(AWS)上配置红帽高可用性(HA)集群的信息和步骤。您有多个选项来获取您用于集群的 Red Hat Enterprise Linux(RHEL)镜像。有关 AWS 镜像选项的详情,请查看 AWS 的 Red Hat Enterprise Linux 镜像选项

本章包含为 AWS 设置环境的先决条件。设置环境后,您可以创建并配置 EC2 实例。

本章还包含与创建 HA 集群相关的流程,该集群将单个节点转换为 AWS 上的一个 HA 节点集群。这包括在每个集群节点上安装高可用性软件包和代理、配置隔离以及安装 AWS 网络资源代理的步骤。

本章在很多位置使用了 Amazon 文档。更多信息,请参阅引用的 Amazon 文档来获得更多信息。

先决条件

4.1. 创建 AWS 访问密钥和 AWS Secret 访问密钥

在安装 AWS CLI 前,您需要创建一个 AWS 访问密钥和 AWS Secret 访问密钥。隔离和资源代理 API 使用 AWS 访问密钥和 Secret 访问密钥连接到集群中的每个节点。

完成以下步骤以创建这些密钥。

先决条件

您的 IAM 用户帐户必须具有 Programmatic 访问权限。如需更多信息,请参阅设置 AWS 环境

流程

  1. 启动 AWS 控制台
  2. 点击 AWS Account ID 以显示下拉菜单并选择 My Security Credentials
  3. Users
  4. 选择用户以打开 Summary 屏幕。
  5. Security credentials 选项卡。
  6. Create access key
  7. 下载 .csv 文件(或者保存这两个密钥)。创建隔离设备时需要输入这些密钥。

4.2. 安装 HA 软件包和代理

在所有节点上完成以下步骤以安装 HA 软件包和代理。

流程

  1. 输入以下命令删除 AWS Red Hat Update Infrastructure(RHUI)客户端。由于您要使用 Red Hat Cloud Access 订阅,所以您不应该在订阅之外使用 AWS RHUI。

    $ sudo -i
    # yum -y remove rh-amazon-rhui-client*
  2. 在红帽注册虚拟机。

    # subscription-manager register --auto-attach
  3. 禁用所有软件仓库。

    # subscription-manager repos --disable=*
  4. 启用 RHEL 7 Server 和 RHEL 7 Server HA 软件仓库。

    # subscription-manager repos --enable=rhel-7-server-rpms
    # subscription-manager repos --enable=rhel-ha-for-rhel-7-server-rpms
  5. 更新所有软件包。

    # yum update -y
  6. 如果内核被更新,则需要重启。

    # reboot
  7. 安装 pcs、pacemaker、隔离代理和资源代理。

    # yum -y install pcs pacemaker fence-agents-aws resource-agents
  8. 用户 hacluster 在上一步中的 pcspacemaker 安装中创建。在所有集群节点上为 hacluster 创建密码。所有节点都使用相同的密码。

    # passwd hacluster
  9. 如果启用了 firewalld.service,在 RHEL 防火墙中添加 high availability 服务。

    # firewall-cmd --permanent --add-service=high-availability
    # firewall-cmd --reload
  10. 启动 pcs 服务并在引导时启用它。

    # systemctl enable pcsd.service --now

验证步骤

确定 pcs 服务正在运行。

# systemctl is-active pcsd.service

4.3. 创建集群

完成以下步骤以创建节点集群。

流程

  1. 在其中一个节点上,输入以下命令验证 pcs 用户 hacluster。指定集群中的每个节点的名称。

    # pcs host auth  _hostname1_ _hostname2_ _hostname3_

    例如:

    [root@node01 clouduser]# pcs host auth node01 node02 node03
    Username: hacluster
    Password:
    node01: Authorized
    node02: Authorized
    node03: Authorized
  2. 创建集群。

    # pcs cluster setup --name _hostname1_ _hostname2_ _hostname3_

    例如:

    [root@node01 clouduser]# pcs cluster setup --name newcluster node01 node02 node03
    
    ...omitted
    
    Synchronizing pcsd certificates on nodes node01, node02, node03...
    node02: Success
    node03: Success
    node01: Success
    Restarting pcsd on the nodes in order to reload the certificates...
    node02: Success
    node03: Success
    node01: Success

验证步骤

  1. 启用集群。

    # pcs cluster enable --all
  2. 启动集群。

    # pcs cluster start --all

    例如:

    [root@node01 clouduser]# pcs cluster enable --all
    node02: Cluster Enabled
    node03: Cluster Enabled
    node01: Cluster Enabled
    
    [root@node01 clouduser]# pcs cluster start --all
    node02: Starting Cluster...
    node03: Starting Cluster...
    node01: Starting Cluster...

4.4. 创建隔离设备

完成以下步骤来配置隔离。

流程

  1. 输入以下 AWS 元数据查询以获取每个节点的实例 ID。您需要这些 ID 来配置隔离设备。如需更多信息,请参阅实例元数据和用户数据

    # echo $(curl -s http://169.254.169.254/latest/meta-data/instance-id)

    例如:

    [root@ip-10-0-0-48 ~]# echo $(curl -s http://169.254.169.254/latest/meta-data/instance-id) i-07f1ac63af0ec0ac6
  2. 创建隔离设备。使用 pcmk_host_map 命令将 RHEL 主机名映射到实例 ID。使用之前在创建 AWS 访问密钥和 AWS Secret 访问密钥中设置的 AWS 访问密钥和 AWS Secret 访问密钥。

    # pcs stonith create cluster_fence fence_aws access_key=access-key secret_key=_secret-access-key_ region=_region_ pcmk_host_map="rhel-hostname-1:Instance-ID-1;rhel-hostname-2:Instance-ID-2;rhel-hostname-3:Instance-ID-3"

    例如:

    [root@ip-10-0-0-48 ~]# pcs stonith create clusterfence fence_aws access_key=AKIAI*******6MRMJA secret_key=a75EYIG4RVL3h*******K7koQ8dzaDyn5yoIZ/ region=us-east-1 pcmk_host_map="ip-10-0-0-48:i-07f1ac63af0ec0ac6;ip-10-0-0-46:i-063fc5fe93b4167b2;ip-10-0-0-58:i-08bd39eb03a6fd2c7" power_timeout=240 pcmk_reboot_timeout=480 pcmk_reboot_retries=4

验证步骤

  1. 测试其他其中一个节点的隔离代理。

    # pcs stonith fence _awsnodename_

    例如:

    [root@ip-10-0-0-48 ~]# pcs stonith fence ip-10-0-0-58
    Node: ip-10-0-0-58 fenced
  2. 检查状态以验证该节点是否已隔离。

    # watch pcs status

    例如:

    [root@ip-10-0-0-48 ~]# pcs status
    Cluster name: newcluster
    Stack: corosync
    Current DC: ip-10-0-0-46 (version 1.1.18-11.el7-2b07d5c5a9) - partition with quorum
    Last updated: Fri Mar  2 20:01:31 2018
    Last change: Fri Mar  2 19:24:59 2018 by root via cibadmin on ip-10-0-0-48
    
    3 nodes configured
    1 resource configured
    
    Online: [ ip-10-0-0-46 ip-10-0-0-48 ip-10-0-0-58 ]
    
    Full list of resources:
    
      clusterfence  (stonith:fence_aws):    Started ip-10-0-0-46
    
    Daemon Status:
      corosync: active/disabled
      pacemaker: active/disabled
      pcsd: active/enabled

4.5. 在集群节点上安装 AWS CLI

在以前的版本中,您在主机系统中安装了 AWS CLI。现在,在配置网络资源代理前,您需要在集群节点上安装 AWS CLI。

在每个集群节点上完成以下步骤。

先决条件

您必须已创建了 AWS Access Key 和 AWS Secret 访问密钥。如需更多信息,请参阅创建 AWS 访问密钥和 AWS Secret 访问密钥

流程

  1. 执行安装 AWS CLI 的步骤。
  2. 输入以下命令验证 AWS CLI 是否已正确配置。应该会显示实例 ID 和实例名称。

    例如:

    [root@ip-10-0-0-48 ~]# aws ec2 describe-instances --output text --query 'Reservations[*].Instances[*].[InstanceId,Tags[?Key==`Name`].Value]'
    i-07f1ac63af0ec0ac6
    ip-10-0-0-48
    i-063fc5fe93b4167b2
    ip-10-0-0-46
    i-08bd39eb03a6fd2c7
    ip-10-0-0-58

4.6. 安装网络资源代理

要使 HA 操作正常工作,集群使用 AWS 网络资源代理来启用故障切换功能。如果节点在设定的时间里不响应 heartbeat 检查,则该节点会被隔离,操作切换到集群中的额外节点。需要配置网络资源代理才能正常工作。

将两个资源添加到 同一组 以强制 ordercolocation 限制。

创建二级私有 IP 资源及虚拟 IP 资源

完成以下步骤以添加二级专用 IP 地址并创建虚拟 IP。您可以从集群中的任何节点完成此步骤。

流程

  1. 输入以下命令查看 AWS Secondary Private IP Address 资源代理(awsvip)描述。这显示了这个代理的选项和默认操作。

    # pcs resource describe awsvip
  2. 输入以下命令使用 VPC CIDR 块中未使用的私有 IP 地址创建二级私有 IP 地址。

    # pcs resource create privip awsvip secondary_private_ip=_Unused-IP-Address_ --group _group-name_

    例如:

    [root@ip-10-0-0-48 ~]# pcs resource create privip awsvip secondary_private_ip=10.0.0.68 --group networking-group
  3. 创建虚拟 IP 资源。这是一个 VPC IP 地址,可以从隔离的节点快速迁移到故障切换节点,从而使子网中隔离的节点失败。

    # pcs resource create vip IPaddr2 ip=_secondary-private-IP_ --group _group-name_

    例如:

    root@ip-10-0-0-48 ~]# pcs resource create vip IPaddr2 ip=10.0.0.68 --group networking-group

验证步骤

输入 pcs status 命令来验证资源是否正在运行。

# pcs status

例如:

[root@ip-10-0-0-48 ~]# pcs status
Cluster name: newcluster
Stack: corosync
Current DC: ip-10-0-0-46 (version 1.1.18-11.el7-2b07d5c5a9) - partition with quorum
Last updated: Fri Mar  2 22:34:24 2018
Last change: Fri Mar  2 22:14:58 2018 by root via cibadmin on ip-10-0-0-46

3 nodes configured
3 resources configured

Online: [ ip-10-0-0-46 ip-10-0-0-48 ip-10-0-0-58 ]

Full list of resources:

clusterfence    (stonith:fence_aws):    Started ip-10-0-0-46
 Resource Group: networking-group
     privip (ocf::heartbeat:awsvip):    Started ip-10-0-0-48
     vip    (ocf::heartbeat:IPaddr2):   Started ip-10-0-0-58

Daemon Status:
  corosync: active/disabled
  pacemaker: active/disabled
  pcsd: active/enabled

创建弹性 IP 地址

弹性 IP 地址是一个公共 IP 地址,可以从隔离的节点快速迁移到故障转移节点,从而使隔离的节点失败。

请注意,这与之前创建的虚拟 IP 资源不同。弹性 IP 地址用于面向公共的互联网连接,而不是子网连接。

  1. 将两个资源添加到之前创建的用来强制 ordercolocation 约束的 同一组 中。
  2. 输入以下 AWS CLI 命令来创建弹性 IP 地址。

    [root@ip-10-0-0-48 ~]# aws ec2 allocate-address --domain vpc --output text
    eipalloc-4c4a2c45   vpc 35.169.153.122
  3. 输入以下命令查看 AWS 二级 Elastic IP 地址资源代理(awseip)描述。这显示了这个代理的选项和默认操作。

    # pcs resource describe awseip
  4. 使用步骤 1 中创建的分配的 IP 地址创建二级 Elastic IP 地址资源。

    # pcs resource create elastic awseip elastic_ip=_Elastic-IP-Address_allocation_id=_Elastic-IP-Association-ID_ --group networking-group

    例如:

    # pcs resource create elastic awseip elastic_ip=35.169.153.122 allocation_id=eipalloc-4c4a2c45 --group networking-group

验证步骤

输入 pcs status 命令来验证资源是否正在运行。

# pcs status

例如:

[root@ip-10-0-0-58 ~]# pcs status
Cluster name: newcluster
Stack: corosync
Current DC: ip-10-0-0-58 (version 1.1.18-11.el7-2b07d5c5a9) - partition with quorum
Last updated: Mon Mar  5 16:27:55 2018
Last change: Mon Mar  5 15:57:51 2018 by root via cibadmin on ip-10-0-0-46

3 nodes configured
4 resources configured

Online: [ ip-10-0-0-46 ip-10-0-0-48 ip-10-0-0-58 ]

Full list of resources:

 clusterfence   (stonith:fence_aws):    Started ip-10-0-0-46
 Resource Group: networking-group
     privip (ocf::heartbeat:awsvip):  Started ip-10-0-0-48
     vip    (ocf::heartbeat:IPaddr2):    Started ip-10-0-0-48
     elastic (ocf::heartbeat:awseip):    Started ip-10-0-0-48

Daemon Status:
  corosync: active/disabled
  pacemaker: active/disabled
  pcsd: active/enabled

测试弹性 IP 地址

输入以下命令验证虚拟 IP(awsvip)和弹性 IP(awseip)资源是否可以正常工作。

流程

  1. 从本地工作站启动 SSH 会话到之前创建的弹性 IP 地址。

    $ ssh -l ec2-user -i ~/.ssh/<KeyName>.pem elastic-IP

    例如:

    $ ssh -l ec2-user -i ~/.ssh/cluster-admin.pem 35.169.153.122
  2. 验证您通过 SSH 连接到的主机是否与创建的弹性资源关联。

4.7. 配置共享块存储

本节提供了使用 Amazon EBS Multi-Attach 卷为红帽高可用性集群配置共享块存储的可选步骤。此流程假设三个带有 1TB 共享磁盘的实例(三节点集群)。

流程

  1. 使用 AWS 命令 create-volume 创建共享块卷。

    $ aws ec2 create-volume --availability-zone availability_zone --no-encrypted --size 1024 --volume-type io1 --iops 51200 --multi-attach-enabled

    例如,以下命令在 us-east-1a 可用区中创建卷。

    $ aws ec2 create-volume --availability-zone us-east-1a --no-encrypted --size 1024 --volume-type io1 --iops 51200 --multi-attach-enabled
    
    {
        "AvailabilityZone": "us-east-1a",
        "CreateTime": "2020-08-27T19:16:42.000Z",
        "Encrypted": false,
        "Size": 1024,
        "SnapshotId": "",
        "State": "creating",
        "VolumeId": "vol-042a5652867304f09",
        "Iops": 51200,
        "Tags": [ ],
        "VolumeType": "io1"
    }
    注意

    下一步需要 VolumeId

  2. 对于集群中的每个实例,使用 AWS 命令 attach-volume 附加一个共享块卷。使用您的 <instance_id><volume_id>

    $ aws ec2 attach-volume --device /dev/xvdd --instance-id instance_id --volume-id volume_id

    例如:以下命令将共享块卷 vol-042a5652867304f09 附加到 instance i-0eb803361c2c887f2

    $ aws ec2 attach-volume --device /dev/xvdd --instance-id i-0eb803361c2c887f2 --volume-id vol-042a5652867304f09
    
    {
        "AttachTime": "2020-08-27T19:26:16.086Z",
        "Device": "/dev/xvdd",
        "InstanceId": "i-0eb803361c2c887f2",
        "State": "attaching",
        "VolumeId": "vol-042a5652867304f09"
    }

验证步骤

  1. 对于集群中的每个实例,使用带有实例 <ip_address> 的 SSH 命令验证块设备是否可用。

    # ssh <ip_address> "hostname ; lsblk -d | grep ' 1T '"

    例如:以下命令列出了包括实例 IP 198.51.100.3 的主机名和块设备的详情。

    # ssh 198.51.100.3 "hostname ; lsblk -d | grep ' 1T '"
    
    nodea
    nvme2n1 259:1    0   1T  0 disk
  2. 使用 ssh 命令验证集群中的每个实例是否使用相同的共享磁盘。

    # ssh ip_address "hostname ; lsblk -d | grep ' 1T ' | awk '{print \$1}' | xargs -i udevadm info --query=all --name=/dev/{} | grep '^E: ID_SERIAL='"

    例如,以下命令列出了包括实例 IP 地址 198.51.100.3 的主机名和共享磁盘卷 ID 的详情。

     # ssh 198.51.100.3 "hostname ; lsblk -d | grep ' 1T ' | awk '{print \$1}' | xargs -i udevadm info --query=all --name=/dev/{} | grep '^E: ID_SERIAL='"
    
    nodea
    E: ID_SERIAL=Amazon Elastic Block Store_vol0fa5342e7aedf09f7

在确认将共享磁盘附加到每个实例后,您可以为集群配置弹性存储。有关为红帽高可用性集群配置弹性存储的详情,请参考在集群中配置 GFS2 文件系统。有关 GFS2 文件系统的常规信息,请参考配置和管理 GFS2 文件系统