在 Google Cloud 上,为适用于 SAP 的基于操作系统的高可用性 (HA) 集群实现虚拟 IP 地址 (VIP) 的推荐方法是使用内部 TCP/UDP 负载均衡器的故障切换支持。
如果您在 Google Cloud 上已有适用于 SAP 的 Red Hat Enterprise Linux (RHEL) HA 集群,且该集群使用的是通过别名 IP 实现的 VIP,则您可以迁移该 VIP 以改用内部负载均衡器。
如果您使用了不再受支持的 sap_hana_ha
Deployment Manager 模板在 RHEL 上的 HA 集群中部署 SAP HANA 纵向扩容系统,则您的 VIP 会通过别名实现 IP。
以下说明介绍了如何在 RHEL HA 集群中迁移 VIP。
前提条件
以下说明假定您在 Google Cloud 上已有正确配置的 HA 集群,且该集群使用别名 IP 实现 VIP。
步骤概述
- 使用临时转发规则和临时 IP 地址代替 VIP 来配置和测试负载均衡器。
- 将集群设置为维护模式,如果可以,停止 SAP 应用服务器实例以避免任何意外行为。
- 从主要主机中取消分配别名 IP 地址。此地址将成为使用负载均衡器的 VIP。
- 在 Pacemaker 集群配置中:
- 更改现有 VIP 资源的类。
- 将别名 IP 的现有参数替换为健康检查服务的参数。
确认现有 VIP 地址
在主虚拟机实例上,以根用户身份显示现有基于别名 IP 的集群配置:
$
pcs configure show
在资源定义中,VIP 地址范围显示在 alias
和 IPaddr2
资源上。如果您需要更改 VIP 地址,则需要更新这两个资源。请参阅以下示例:
Resource rsc_alias (class=ocf provider=heartbeat type=gcp-vpc-move-vip) \ Attributes: alias_ip=10.10.0.90/32 Operations: monitor interval=60s timeout=60s (vip_hkn_00-monitor-interval-60s) start interval=0s timeout=600s stop interval=0s timeout=20s Resource rsc_vip(class=ocf provider=heartbeat type=IPaddr2) \ Attributes: cidr_netmask=32 ip=10.10.0.90 nic=eth0 Operations: monitor interval=10s timeout=20s (vip_hkn_00-monitor-interval-10s) start interval=0s timeout=20s (vip_hkn_00-start-interval-0s) stop interval=0s timeout=20s (vip_hkn_00-stop-interval-0s)
在 Google Cloud 控制台中,确认与别名 IP 结合使用的 IP 地址是否已预留。IP 地址可以是用于别名 IP 地址的 IP 地址,也可以是新的 IP 地址。
$
gcloud compute addresses list --filter="region:( cluster-region )"
如果该 IP 地址已预留并分配给主虚拟机实例,则其状态将显示为 IN_USE
。当您将该 IP 重新分配给负载均衡器时,首先要从活跃主实例中取消分配该 IP,此时其状态会变为 RESERVED
。
如果 list 命令返回的 IP 地址不包含此地址,请立即预留该地址以防止将来发生地址冲突。
$
gcloud compute addresses create vip-name \
--region cluster-region --subnet cluster-subnet \
--addresses vip-address
再次列出您的地址,以确认该 IP 地址是否显示为 RESERVED
。
配置 Cloud Load Balancing 故障切换支持
具有故障切换支持的内部直通式网络负载均衡器服务会根据健康检查服务将流量路由到 SAP HANA 集群中的活跃主机。
为避免冲突并允许在迁移完成之前进行测试,以下说明可让您创建临时转发规则,该规则使用 VIP 地址所在子网中的占位 IP 地址。当您准备好切换 VIP 实现时,可以创建使用 VIP 地址的新的最终转发规则。
为虚拟 IP 预留临时 IP 地址
VIP 地址跟随活跃 SAP HANA 系统。负载均衡器将发送到 VIP 的流量路由到当前正在托管活跃 SAP HANA 系统的虚拟机。
打开 Cloud Shell:
在别名 IP 所在的子网中预留临时 IP 地址,以便进行测试。如果您省略
--addresses
标志,系统会为您选择指定子网中的 IP 地址:$
gcloud compute addresses create VIP_NAME \ --region CLUSTER_REGION --subnet CLUSTER_SUBNET \ --addresses VIP_ADDRESS如需详细了解如何预留静态 IP 地址,请参阅预留静态内部 IP 地址。
确认 IP 地址预留:
$
gcloud compute addresses describe VIP_NAME \ --region CLUSTER_REGION您应该会看到类似于以下示例的输出:
address: 10.0.0.19 addressType: INTERNAL creationTimestamp: '2020-05-20T14:19:03.109-07:00' description: '' id: '8961491304398200872' kind: compute#address name: vip-for-hana-ha networkTier: PREMIUM purpose: GCE_ENDPOINT region: https://www.googleapis.com/compute/v1/projects/example-project-123456/regions/us-central1 selfLink: https://www.googleapis.com/compute/v1/projects/example-project-123456/regions/us-central1/addresses/vip-for-hana-ha status: RESERVED subnetwork: https://www.googleapis.com/compute/v1/projects/example-project-123456/regions/us-central1/subnetworks/example-subnet-us-central1
为您的主机虚拟机创建实例组
在 Cloud Shell 中,创建两个非代管实例组,并将主要主实例主机虚拟机分配给其中一个实例组,同时将辅助主实例主机虚拟机分配给另一个实例组:
$
gcloud compute instance-groups unmanaged create PRIMARY_IG_NAME \ --zone=PRIMARY_ZONE$
gcloud compute instance-groups unmanaged add-instances PRIMARY_IG_NAME \ --zone=PRIMARY_ZONE \ --instances=PRIMARY_HOST_NAME$
gcloud compute instance-groups unmanaged create SECONDARY_IG_NAME \ --zone=SECONDARY_ZONE$
gcloud compute instance-groups unmanaged add-instances SECONDARY_IG_NAME \ --zone=SECONDARY_ZONE \ --instances=SECONDARY_HOST_NAME确认已创建实例组:
$
gcloud compute instance-groups unmanaged list您应该会看到类似于以下示例的输出:
NAME ZONE NETWORK NETWORK_PROJECT MANAGED INSTANCES hana-ha-ig-1 us-central1-a example-network example-project-123456 No 1 hana-ha-ig-2 us-central1-c example-network example-project-123456 No 1
创建 Compute Engine 健康检查
在 Cloud Shell 中,创建健康检查。对于健康检查使用的端口,请选择专用范围 (49152-65535) 内的端口,以避免与其他服务发生冲突。检查间隔和超时值略大于默认值,其目的是为了在 Compute Engine 实时迁移事件期间提高故障切换容忍度。您可以根据需要调整这些值:
$
gcloud compute health-checks create tcp HEALTH_CHECK_NAME --port=HEALTHCHECK_PORT_NUM \ --proxy-header=NONE --check-interval=10 --timeout=10 --unhealthy-threshold=2 \ --healthy-threshold=2确认已创建健康检查:
$
gcloud compute health-checks describe HEALTH_CHECK_NAME您应该会看到类似于以下示例的输出:
checkIntervalSec: 10 creationTimestamp: '2020-05-20T21:03:06.924-07:00' healthyThreshold: 2 id: '4963070308818371477' kind: compute#healthCheck name: hana-health-check selfLink: https://www.googleapis.com/compute/v1/projects/example-project-123456/global/healthChecks/hana-health-check tcpHealthCheck: port: 60000 portSpecification: USE_FIXED_PORT proxyHeader: NONE timeoutSec: 10 type: TCP unhealthyThreshold: 2
为健康检查创建防火墙规则
为专用范围内的端口定义防火墙规则,用于允许从 Compute Engine 健康检查使用的 IP 地址范围(35.191.0.0/16
和 130.211.0.0/22
)访问您的主机虚拟机。如需了解详情,请参阅为健康检查创建防火墙规则。
如果您还没有为主机虚拟机添加网络标记,请先添加。此网络标记由防火墙规则用于健康检查。
$
gcloud compute instances add-tags PRIMARY_HOST_NAME \ --tags NETWORK_TAGS \ --zone PRIMARY_ZONE$
gcloud compute instances add-tags SECONDARY_HOST_NAME \ --tags NETWORK_TAGS \ --zone SECONDARY_ZONE如果您还没有防火墙规则,请创建一条防火墙规则来允许健康检查:
$
gcloud compute firewall-rules create RULE_NAME \ --network NETWORK_NAME \ --action ALLOW \ --direction INGRESS \ --source-ranges 35.191.0.0/16,130.211.0.0/22 \ --target-tags NETWORK_TAGS \ --rules tcp:HLTH_CHK_PORT_NUM例如:
gcloud compute firewall-rules create fw-allow-health-checks \ --network example-network \ --action ALLOW \ --direction INGRESS \ --source-ranges 35.191.0.0/16,130.211.0.0/22 \ --target-tags cluster-ntwk-tag \ --rules tcp:60000
配置负载均衡器和故障切换组
创建负载均衡器后端服务:
$
gcloud compute backend-services create BACKEND_SERVICE_NAME \ --load-balancing-scheme internal \ --health-checks HEALTH_CHECK_NAME \ --no-connection-drain-on-failover \ --drop-traffic-if-unhealthy \ --failover-ratio 1.0 \ --region CLUSTER_REGION \ --global-health-checks将主实例组添加到后端服务:
$
gcloud compute backend-services add-backend BACKEND_SERVICE_NAME \ --instance-group PRIMARY_IG_NAME \ --instance-group-zone PRIMARY_ZONE \ --region CLUSTER_REGION将辅助故障切换实例组添加到后端服务:
$
gcloud compute backend-services add-backend BACKEND_SERVICE_NAME \ --instance-group SECONDARY_IG_NAME \ --instance-group-zone SECONDARY_ZONE \ --failover \ --region CLUSTER_REGION创建临时转发规则。对于 IP 地址,请指定您为测试预留的临时 IP 地址。如果您需要从下面指定的区域外部访问 SAP HANA 系统,请在定义中添加
--allow-global-access
标志:$
gcloud compute forwarding-rules create RULE_NAME \ --load-balancing-scheme internal \ --address VIP_ADDRESS \ --subnet CLUSTER_SUBNET \ --region CLUSTER_REGION \ --backend-service BACKEND_SERVICE_NAME \ --ports ALL如需详细了解跨区域访问 SAP HANA 高可用性系统,请参阅内部 TCP/UDP 负载均衡。
测试负载均衡器配置
即使您的后端实例组在稍后完成相应配置之前不会被注册为运行状况良好,您仍然可以通过设置监听器响应健康检查来测试负载均衡器配置。设置监听器后,如果负载均衡器配置正确,则后端实例组的状态会变为运行状况良好。
以下部分介绍了可用于测试配置的各种不同方法。
使用 socat
实用程序测试负载均衡器
您可以使用 socat
实用程序来临时侦听健康检查端口。
在两个主机虚拟机上,安装
socat
实用程序:$
sudo yum install -y socat启动
socat
进程以侦听健康检查端口 60 秒:$
sudo timeout 60s socat - TCP-LISTEN:HLTH_CHK_PORT_NUM,fork在 Cloud Shell 中,等待几秒钟,让健康检查检测到监听器,然后检查后端实例组的运行状况:
$
gcloud compute backend-services get-health BACKEND_SERVICE_NAME \ --region CLUSTER_REGION您将看到如下所示的输出:
--- backend: https://www.googleapis.com/compute/v1/projects/example-project-123456/zones/us-central1-a/instanceGroups/hana-ha-ig-1 status: healthStatus: ‐ healthState: HEALTHY instance: https://www.googleapis.com/compute/v1/projects/example-project-123456/zones/us-central1-a/instances/hana-ha-vm-1 ipAddress: 10.0.0.35 port: 80 kind: compute#backendServiceGroupHealth --- backend: https://www.googleapis.com/compute/v1/projects/example-project-123456/zones/us-central1-c/instanceGroups/hana-ha-ig-2 status: healthStatus: ‐ healthState: HEALTHY instance: https://www.googleapis.com/compute/v1/projects/example-project-123456/zones/us-central1-c/instances/hana-ha-vm-2 ipAddress: 10.0.0.34 port: 80 kind: compute#backendServiceGroupHealth
使用端口 22 测试负载均衡器
如果主机虚拟机上的端口 22 对于 SSH 连接是打开的,则您可以将健康检查程序临时修改为使用端口 22,该端口上具有可以响应健康检查程序的监听器。
若要临时使用端口 22,请按以下步骤操作:
点击控制台中的健康检查:
点击修改。
在端口字段中,将端口号更改为 22。
点击保存,然后等待一两分钟。
在 Cloud Shell 中,检查后端实例组的运行状况:
$
gcloud compute backend-services get-health BACKEND_SERVICE_NAME \ --region CLUSTER_REGION您将看到如下所示的输出:
--- backend: https://www.googleapis.com/compute/v1/projects/example-project-123456/zones/us-central1-a/instanceGroups/hana-ha-ig-1 status: healthStatus: ‐ healthState: HEALTHY instance: https://www.googleapis.com/compute/v1/projects/example-project-123456/zones/us-central1-a/instances/hana-ha-vm-1 ipAddress: 10.0.0.35 port: 80 kind: compute#backendServiceGroupHealth --- backend: https://www.googleapis.com/compute/v1/projects/example-project-123456/zones/us-central1-c/instanceGroups/hana-ha-ig-2 status: healthStatus: ‐ healthState: HEALTHY instance: https://www.googleapis.com/compute/v1/projects/example-project-123456/zones/us-central1-c/instances/hana-ha-vm-2 ipAddress: 10.0.0.34 port: 80 kind: compute#backendServiceGroupHealth
完成后,将健康检查端口号更改回原始端口号。
迁移 VIP 实现以使用负载均衡器
以下步骤会修改 Pacemaker 集群配置和负载均衡器转发规则,以便完成 VIP 迁移。
准备系统进行修改
如果可以,停止 SAP 应用连接到 SAP HANA 数据库,因为您将暂时中断连接以交换 IP 地址。NetWeaver 工作流程能够重新连接到该数据库,但您可能会遇到故障或挂起的情况,这会中断连接。确保您的 IP 在目标地区中属于您的 VPC 的内部范围中注册。
在活跃主实例上以根用户身份将集群置于维护模式:
$
pcs property set maintenance-mode="true"备份集群配置:
$
pcs config show > clusterconfig.backup
取消分配别名 IP
在 Cloud Shell 中,确认分配给 SAP HANA 主实例的别名 IP 范围:
$
gcloud compute instances describe \ primary-host-name \ --zone primary-zone \ --format="flattened(name,networkInterfaces[].aliasIpRanges)"在 Google Cloud 控制台中,更新网络接口。如果您不需要保留任何别名 IP,请指定
--aliases ""
:$
gcloud compute instances network-interfaces update primary-host-name \ --zone primary-zone \ --aliases "ip-ranges-to-retain"
创建 VIP 转发规则和清理 VIP 转发规则
在 Google Cloud 控制台中,为负载均衡器创建新的前端转发规则,并将之前用于别名 IP 的 IP 地址指定为 IP 地址。这是您的 VIP。
$
gcloud compute forwarding-rules create rule-name \ --load-balancing-scheme internal \ --address vip-address \ --subnet cluster-subnet \ --region cluster-region \ --backend-service backend-service-name \ --ports ALL确认转发规则的创建并记下要删除的临时转发规则的名称:
$
gcloud compute forwarding-rules list删除临时转发规则:
$
gcloud compute forwarding-rules delete rule-name --region=cluster-region释放您预留的临时 IP 地址:
$
gcloud compute addresses delete temp-ip-name --region=cluster-region
安装侦听器并创建健康检查资源
如需配置健康检查资源,您需要先安装侦听器。
安装侦听器
负载均衡器在每个主机的健康检查端口上使用侦听器来确定 SAP HANA 集群主实例的运行位置。 1. 在主要和辅助系统上,以主实例上的根用户身份安装 TCP 监听器。这些说明将安装 HAProxy 并将其用作监听器。
#
yum install haproxy
打开配置文件
haproxy.cfg
进行修改:#
vi /etc/haproxy/haproxy.cfg在
haproxy.cfg
的默认值部分中,将mode
更改为tcp
。在默认值部分后,通过添加以下内容创建一个新部分:
#--------------------------------------------------------------------- # Health check listener port for SAP HANA HA cluster #--------------------------------------------------------------------- listen healthcheck bind *:healthcheck-port-num
绑定端口与您在创建健康检查时使用的端口相同。
完成后,更新应类似于以下示例:
#--------------------------------------------------------------------- # common defaults that all the 'listen' and 'backend' sections will # use if not designated in their block #--------------------------------------------------------------------- defaults mode tcp log global option tcplog option dontlognull option http-server-close # option forwardfor except 127.0.0.0/8 option redispatch retries 3 timeout http-request 10s timeout queue 1m timeout connect 10s timeout client 1m timeout server 1m timeout http-keep-alive 10s timeout check 10s maxconn 3000 #--------------------------------------------------------------------- # Set up health check listener for SAP HANA HA cluster #--------------------------------------------------------------------- listen healthcheck bind *:60000
在每个主机上,以根用户身份启动服务以确认其配置正确无误:
#
systemctl start haproxy.service在 Google Cloud 控制台中的“负载均衡器”页面上,点击您的负载均衡器条目:
在负载均衡器详情页面的后端部分中,如果两个主机上的 HAProxy 服务都处于活跃状态,则您会在每个实例组条目的运行状况良好列中看到
1/1
。在每个主机上,停止 HAProxy 服务:
#
systemctl stop haproxy.service在每个主机上停止 HAProxy 服务后,每个实例组的运行状况良好列中都会显示
0/1
。稍后,在配置健康检查后,集群将在主节点上重启监听器。
创建健康检查资源
在任一主机上,以根用户身份为 HAProxy 服务创建健康检查资源:
#
pcs resource create healthcheck_resource_name service:haproxy op monitor interval=10s timeout=20s
修改集群配置以使用健康检查资源并移除别名资源
移除包含映射到 SAP HANA 主实例的别名 IP 资源的现有群组的
Colocation Constraints
:#
pcs constraint remove colocation-alias-vip-group-sap_hana_resource_name创建新的资源组,将 VIP 和健康检查资源组合在一起:
#
pcs resource group add rsc-group-namehealthcheck_resource_namevip_resource_name此命令会将别名 IP 和 VIP 资源的先前组名称替换为集群配置中的新资源组名称。
在集群配置中验证新的资源组名称:
#
pcs config show您应该会看到类似于以下示例的输出:
Group: ilb-vip-group Resource: vip_hkn_00 (class=ocf provider=heartbeat type=IPaddr2) Attributes: cidr_netmask=32 ip=10.10.0.90 nic=eth0 Operations: monitor interval=10s timeout=20s (vip_hkn_00-monitor-interval-10s) start interval=0s timeout=20s (vip_hkn_00-start-interval-0s) stop interval=0s timeout=20s (vip_hkn_00-stop-interval-0s) Resource: ilb-health-check (class=service type=haproxy) Operations: monitor interval=60 timeout=100 (ilb-health-check-monitor-interval-60) start interval=0s timeout=100 (ilb-health-check-start-interval-0s) stop interval=0s timeout=100 (ilb-health-check-stop-interval-0s)
删除别名资源:
#
pcs resource delete alias_resource_name验证集群状态:
#
pcs status您应该在输出中看到“资源组”部分,类似于以下示例:
STONITH-hana-ha-vm-1 (stonith:fence_gce): Started hana-ha-vm-2 STONITH-hana-ha-vm-2 (stonith:fence_gce): Started hana-ha-vm-1 Clone Set: SAPHanaTopology_HA1_22-clone [SAPHanaTopology_HA1_22] Started: [ hana-ha-vm-1 hana-ha-vm-2 ] Master/Slave Set: SAPHana_HA1_22-master [SAPHana_HA1_22] Masters: [ hana-ha-vm-1 ] Slaves: [ hana-ha-vm-2 ] Resource Group: g-primary rsc_healthcheck_HA1 (service:haproxy): Started hana-ha-vm-1 rsc_vip_HA1_22 (ocf::heartbeat:IPaddr2): Started hana-ha-vm-1
让集群退出维护模式:
#
pcs property set maintenance-mode=false
测试更新后的 HA 集群
在应用实例中,通过发出以下任一命令来确认您是否可以访问数据库:
以
sidadm
用户身份:>
R3trans -d以任意用户身份:
telnet VIP HANA SQL port
或
nc -zv VIP HANA SQL port