Menu Close
Settings Close

Language and Page Formatting Options

第 2 章 在 Microsoft Azure 上配置红帽高可用性集群

红帽支持 Red Hat Enterprise Linux(RHEL)7.4 及更新的版本中的高可用性(HA)。本章包含使用虚拟机(VM)实例作为集群节点在 Microsoft Azure 上配置 Red Hat HA 集群的信息和步骤。本章中的流程假设您要为 Azure 创建自定义镜像。您有多个选项来获取用于集群的 RHEL 7 镜像。如需有关 Azure 镜像选项的更多信息,请参阅 Azure 的 Red Hat Enterprise Linux Image Options。

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

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

本章在很多位置使用了 Microsoft Azure 文档。如需了解更多信息,请参阅引用的 Azure 文档。

先决条件

2.1. 在 Azure 中创建资源

完成以下步骤以创建可用性集。您需要这些资源才能完成本章中的后续任务。

流程

  • 创建可用性集。所有集群节点都必须处于相同的可用性集。

    $ az vm availability-set create --name _MyAvailabilitySet_ --resource-group _MyResourceGroup_

    例如:

    [clouduser@localhost]$ az vm availability-set create --name rhelha-avset1 --resource-group azrhelclirsgrp
    {
      "additionalProperties": {},
        "id": "/subscriptions/.../resourceGroups/azrhelclirsgrp/providers/Microsoft.Compute/availabilitySets/rhelha-avset1",
        "location": "southcentralus",
        "name": “rhelha-avset1",
        "platformFaultDomainCount": 2,
        "platformUpdateDomainCount": 5,
    
    ...omitted

2.2. 创建 Azure Active Directory 应用程序

完成以下步骤以创建 Azure Active Directory(AD)应用程序。Azure AD Application Views 和自动访问集群中所有节点的 HA 操作。

先决条件

您需要安装 Azure 命令行界面(CLI)

流程

  1. 确保您是 Microsoft Azure 订阅的管理员或所有者。您需要此授权来创建 Azure AD 应用程序。
  2. 登录到您的 Azure 帐户。

    $ az login
  3. 输入以下命令来创建 Azure AD 应用程序。要使用您自己的密码,在该命令中添加 --password 选项。确保您创建一个强大密码。

    $ az ad sp create-for-rbac --name _FencingApplicationName_ --role owner --scopes "/subscriptions/_SubscriptionID_/resourceGroups/_MyResourseGroup_"

    例如:

    [clouduser@localhost ~] $ az ad sp create-for-rbac --name FencingApp --role owner --scopes "/subscriptions/2586c64b-xxxxxx-xxxxxxx-xxxxxxx/resourceGroups/azrhelclirsgrp"
    Retrying role assignment creation: 1/36
    Retrying role assignment creation: 2/36
    Retrying role assignment creation: 3/36
    {
      "appId": "1a3dfe06-df55-42ad-937b-326d1c211739",
      "displayName": "FencingApp",
      "name": "http://FencingApp",
      "password": "43a603f0-64bb-482e-800d-402efe5f3d47",
      "tenant": "77ecefb6-xxxxxxxxxx-xxxxxxx-757a69cb9485"
    }
  4. 在继续操作前,保存以下信息。您需要这些信息来设置隔离代理。

    • Azure AD 应用 ID
    • Azure AD 应用程序密码
    • 租户 ID
    • Microsoft Azure Subscription ID

2.3. 配置 HA 服务

在所有节点上完成以下步骤。

流程

  1. 用户 hacluster 在上一步中的 pcspacemaker 安装中创建。在所有集群节点上为 hacluster 创建密码。所有节点都使用相同的密码。

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

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

    # systemctl enable pcsd.service --now

验证步骤

  • 确定 pcs 服务正在运行。

    # systemctl is-active pcsd.service

2.4. 安装 Red Hat HA 软件包和代理

在所有节点上完成以下步骤。

流程

  1. 在红帽注册虚拟机。

    $ sudo -i
    # subscription-manager register --auto-attach
  2. 禁用所有软件仓库。

    # subscription-manager repos --disable=*
  3. 启用 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
  4. 更新所有软件包。

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

    # reboot
  6. 安装 pcspacemakerfence agent resource agentnmap-ncat

    # yum install -y pcs pacemaker fence-agents-azure-arm resource-agents nmap-ncat

2.5. 创建集群

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

流程

  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...

2.6. 创建隔离设备

完成以下步骤,从集群中的任何节点配置隔离。

流程

  1. 找到可隔离的可用实例。

    # fence_azure_arm -l [appid] -p [authkey] --resourceGroup=[name] --subscriptionId=[name] --tenantId=[name] -o list

    例如:

    [root@node1 ~]# fence_azure_arm -l XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX -p XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX --resourceGroup=hacluster-rg --subscriptionId=XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX --tenantId=XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX -o list
    node01-vm,
    node02-vm,
    node03-vm,
  2. 创建隔离设备。使用 pcmk_host_map 命令将 RHEL 主机名映射到实例 ID。

    # pcs stonith create _clusterfence_ fence_azure_arm login=_AD-Application-ID_ passwd=_AD-passwd_ pcmk_host_map="_pcmk-host-map_ resourcegroup= _myresourcegroup_ tenantid=_tenantid_ subscriptionid=_subscriptionid_

验证步骤

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

    # pcs stonith fence _azurenodename_

    例如:

    [root@node01 ~]# pcs stonith fence fenceazure
     Resource: fenceazure (class=stonith type=fence_azure_arm)
      Attributes: login=XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX passwd=XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX pcmk_host_map=nodea:nodea-vm;nodeb:nodeb-vm;nodec:nodec-vm pcmk_reboot_retries=4 pcmk_reboot_timeout=480 power_timeout=240 resourceGroup=rg subscriptionId=XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX tenantId=XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX
      Operations: monitor interval=60s (fenceazure-monitor-interval-60s)
    [root@node01 ~]# pcs stonith
     fenceazure     (stonith:fence_azure_arm):      Started nodea
  2. 检查状态以验证节点已启动。

    # watch pcs status

    例如:

    [root@node01 ~]# watch pcs status
     fenceazure     (stonith:fence_azure_arm):      Started nodea

2.7. 创建 Azure 内部负载均衡器

Azure 内部负载均衡器会删除对健康探测请求没有做出响应的集群节点。

执行以下步骤来创建 Azure 内部负载均衡器。每个步骤都引用特定的 Microsoft 流程,并包括为 HA 自定义负载均衡器的设置。

先决条件

访问 Azure 控制面板

流程

  1. 创建基本负载均衡器。为 IP 地址分配类型选择 Internal load balancerBasic SKUDynamic
  2. 创建后端地址池。将后端池与在 HA 中创建 Azure 资源时创建的可用性集关联。不要设置任何目标网络 IP 配置。
  3. 创建健康探测。对于健康探测,选择 TCP 并输入端口 61000。您可以使用不会影响到另一个服务的 TCP 端口号。对于某些 HA 产品应用程序,如 SAP HANA 和 SQL Server,您可能需要与 Microsoft 合作来识别要使用的正确端口。
  4. 创建负载均衡器规则。要创建负载均衡规则,请使用预先填充的默认值。确保将 Floating IP (direct server return) 设置为 Enabled

2.8. 配置 Azure 负载均衡器资源代理

创建健康探测后,您必须配置 load balancer 资源代理。此资源代理运行一个服务,它回答来自 Azure 负载均衡器的健康探测请求,并删除不回答请求的集群节点。

流程

  1. 输入 Azure id 命令来查看 Azure 负载均衡器资源代理描述。这显示了这个代理的选项和默认操作。

    # pcs resource describe _azure-id_
  2. 创建用于管理节点上 IP 的 Ipaddr2 资源。

    # pcs resource create _resource-id_ IPaddr2 ip=_virtual/floating-ip_ cidr_netmask=_virtual/floating-mask_ --group _group-id_ nic=_network-interface_ op monitor interval=30s

    例如:

    [root@node01 ~]# pcs resource create ClusterIP ocf:heartbeat:IPaddr2 ip=172.16.66.99 cidr_netmask=24 --group CloudIP nic=eth0 op monitor interval=30s
  3. 配置 load balancer 资源代理。

    # pcs resource create _resource-loadbalancer-name_ azure-lb port=_port-number_ --group _cluster-resources-group_

验证步骤

  • 运行 pcs status 命令查看结果。

    [root@node01 clouduser]# pcs status

    例如:

    [root@node01 ~]# pcs status
    Cluster name: hacluster
    
    WARNINGS:
    No stonith devices and stonith-enabled is not false
    
    Stack: corosync
    Current DC: nodeb (version 1.1.22-1.el7-63d2d79005) - partition with quorum
    Last updated: Wed Sep  9 16:47:07 2020
    Last change: Wed Sep  9 16:44:32 2020 by hacluster via crmd on nodeb
    
    3 nodes configured
    0 resource instances configured
    
    Online: [ node01 node02 node03 ]
    
    No resources
    
    
    Daemon Status:
      corosync: active/enabled
      pacemaker: active/enabled
      pcsd: active/enabled

其它资源

2.9. 配置共享块存储

本节介绍了使用 Microsoft Azure Shared Disks 为 Red Hat High Availability 集群配置共享块存储的可选流程。该流程假设三个 Azure VM(一个三节点集群)带有一个 1TB 共享磁盘。

注意

这是配置块存储的独立示例步骤。该流程假设您还没有创建集群。

先决条件

流程

  1. 使用 Azure 命令 az disk create 创建共享块卷。

    $ az disk create -g resource_group -n shared_block_volume_name --size-gb disk_size --max-shares number_vms -l location

    例如,以下命令在 Azure Availability Zone westcentralus 的资源组 sharedblock 中创建了一个名为 shared-block-volume.vhd 的共享块卷。

    $ az disk create -g sharedblock-rg -n shared-block-volume.vhd --size-gb 1024 --max-shares 3 -l westcentralus
    
    {
      "creationData": {
        "createOption": "Empty",
        "galleryImageReference": null,
        "imageReference": null,
        "sourceResourceId": null,
        "sourceUniqueId": null,
        "sourceUri": null,
        "storageAccountId": null,
        "uploadSizeBytes": null
      },
      "diskAccessId": null,
      "diskIopsReadOnly": null,
      "diskIopsReadWrite": 5000,
      "diskMbpsReadOnly": null,
      "diskMbpsReadWrite": 200,
      "diskSizeBytes": 1099511627776,
      "diskSizeGb": 1024,
      "diskState": "Unattached",
      "encryption": {
        "diskEncryptionSetId": null,
        "type": "EncryptionAtRestWithPlatformKey"
      },
      "encryptionSettingsCollection": null,
      "hyperVgeneration": "V1",
      "id": "/subscriptions/12345678910-12345678910/resourceGroups/sharedblock-rg/providers/Microsoft.Compute/disks/shared-block-volume.vhd",
      "location": "westcentralus",
      "managedBy": null,
      "managedByExtended": null,
      "maxShares": 3,
      "name": "shared-block-volume.vhd",
      "networkAccessPolicy": "AllowAll",
      "osType": null,
      "provisioningState": "Succeeded",
      "resourceGroup": "sharedblock-rg",
      "shareInfo": null,
      "sku": {
        "name": "Premium_LRS",
        "tier": "Premium"
      },
      "tags": {},
      "timeCreated": "2020-08-27T15:36:56.263382+00:00",
      "type": "Microsoft.Compute/disks",
      "uniqueId": "cd8b0a25-6fbe-4779-9312-8d9cbb89b6f2",
      "zones": null
    }
  2. 使用 Azure 命令 az disk show 创建共享块卷。

    $ az disk show -g resource_group -n shared_block_volume_name

    例如,以下命令显示资源组 sharedblock-rg 中的共享块卷 shared-block-volume.vhd 的详情。

    $ az disk show -g sharedblock-rg -n shared-block-volume.vhd
    
    {
      "creationData": {
        "createOption": "Empty",
        "galleryImageReference": null,
        "imageReference": null,
        "sourceResourceId": null,
        "sourceUniqueId": null,
        "sourceUri": null,
        "storageAccountId": null,
        "uploadSizeBytes": null
      },
      "diskAccessId": null,
      "diskIopsReadOnly": null,
      "diskIopsReadWrite": 5000,
      "diskMbpsReadOnly": null,
      "diskMbpsReadWrite": 200,
      "diskSizeBytes": 1099511627776,
      "diskSizeGb": 1024,
      "diskState": "Unattached",
      "encryption": {
        "diskEncryptionSetId": null,
        "type": "EncryptionAtRestWithPlatformKey"
      },
      "encryptionSettingsCollection": null,
      "hyperVgeneration": "V1",
      "id": "/subscriptions/12345678910-12345678910/resourceGroups/sharedblock-rg/providers/Microsoft.Compute/disks/shared-block-volume.vhd",
      "location": "westcentralus",
      "managedBy": null,
      "managedByExtended": null,
      "maxShares": 3,
      "name": "shared-block-volume.vhd",
      "networkAccessPolicy": "AllowAll",
      "osType": null,
      "provisioningState": "Succeeded",
      "resourceGroup": "sharedblock-rg",
      "shareInfo": null,
      "sku": {
        "name": "Premium_LRS",
        "tier": "Premium"
      },
      "tags": {},
      "timeCreated": "2020-08-27T15:36:56.263382+00:00",
      "type": "Microsoft.Compute/disks",
      "uniqueId": "cd8b0a25-6fbe-4779-9312-8d9cbb89b6f2",
      "zones": null
    }
  3. 使用 Azure 命令 az network nic create 创建三个网络接口。运行以下命令三次,每次使用不同的 <nic_name>

    $ az network nic create -g resource_group -n nic_name --subnet subnet_name --vnet-name virtual_network --location location --network-security-group network_security_group --private-ip-address-version IPv4

    例如:以下命令创建一个名为 shareblock-nodea-vm-nic-protected 的网络接口。

    $ az network nic create -g sharedblock-rg -n sharedblock-nodea-vm-nic-protected --subnet sharedblock-subnet-protected --vnet-name sharedblock-vn --location westcentralus --network-security-group sharedblock-nsg --private-ip-address-version IPv4
  4. 创建三个虚拟机并使用 Azure 命令 az vm create 附加共享块卷。每个虚拟机的选项值都是一样的,但每个虚拟机都有自己的 <vm_name><new_vm_disk_name><nic_name>

    $ az vm create -n vm_name -g resource_group --attach-data-disks shared_block_volume_name --data-disk-caching None --os-disk-caching ReadWrite --os-disk-name new-vm-disk-name --os-disk-size-gb disk_size --location location --size virtual_machine_size --image image_name --admin-username vm_username --authentication-type ssh --ssh-key-values ssh_key --nics -nic_name_ --availability-set availability_set --ppg proximity_placement_group

    例如,以下命令会创建一个名为 sharedblock-nodea-vm 的虚拟机。

    $ az vm create -n sharedblock-nodea-vm -g sharedblock-rg --attach-data-disks shared-block-volume.vhd --data-disk-caching None --os-disk-caching ReadWrite --os-disk-name sharedblock-nodea-vm.vhd --os-disk-size-gb 64 --location westcentralus --size Standard_D2s_v3 --image /subscriptions/12345678910-12345678910/resourceGroups/sample-azureimagesgroupwestcentralus/providers/Microsoft.Compute/images/sample-azure-rhel-7.0-20200713.n.0.x86_64 --admin-username sharedblock-user --authentication-type ssh --ssh-key-values @sharedblock-key.pub --nics sharedblock-nodea-vm-nic-protected --availability-set sharedblock-as --ppg sharedblock-ppg
    
    {
      "fqdns": "",
      "id": "/subscriptions/12345678910-12345678910/resourceGroups/sharedblock-rg/providers/Microsoft.Compute/virtualMachines/sharedblock-nodea-vm",
      "location": "westcentralus",
      "macAddress": "00-22-48-5D-EE-FB",
      "powerState": "VM running",
      "privateIpAddress": "198.51.100.3",
      "publicIpAddress": "",
      "resourceGroup": "sharedblock-rg",
      "zones": ""
    }

验证步骤

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

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

    例如,以下命令列出了包括虚拟机 IP 地址 198.51.100.3 的主机名和块设备的详细信息。

    # ssh 198.51.100.3 "hostname ; lsblk -d | grep ' 1T '"
    
    nodea
    sdb    8:16   0    1T  0 disk
  2. 使用 SSH 命令验证集群中的每个虚拟机是否使用相同的共享磁盘。

    # ssh _ip_address_s "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=3600224808dd8eb102f6ffc5822c41d89

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