本指南介绍了如何在 Google Cloud上的 Red Hat Enterprise Linux (RHEL) 高可用性集群中部署 SAP MaxDB 系统,并采用主动/被动集群配置。
如需在 Linux 上部署单节点 SAP MaxDB 系统,请使用 SAP MaxDB 部署指南。
本指南适用于熟悉 SAP 系统的 Linux HA 配置的 SAP MaxDB 高级用户。
本指南部署的系统
本指南包含以下步骤:
- 配置内部直通式网络负载均衡器以在发生故障时重新路由流量
- 在 RHEL 上配置 Pacemaker 集群,以在故障切换期间管理 SAP 系统和其他资源
部署的集群包括以下功能和特性:
- 位于不同可用区的两个 Compute Engine 虚拟机,能够运行 SAP MaxDB 实例
- 用于安装 SAP MaxDB 的区域性永久性磁盘。
- Pacemaker 高可用性集群资源管理器。
- STONITH 防护机制。
本指南不涉及 SAP NetWeaver 高可用性安装。
前提条件
在创建 SAP MaxDB 高可用性集群之前,请确保满足以下前提条件:
- 您已阅读 SAP MaxDB 规划指南。
- 您有 Red Hat 订阅。
- 您或贵组织拥有 Google Cloud 账号,并且您已为 SAP MaxDB 部署创建了一个项目。
如果您需要 SAP 工作负载根据数据驻留、访问权限控制、支持人员或监管要求运行,则必须创建所需的 Assured Workloads 文件夹。如需了解详情,请参阅 Google Cloud 上 SAP 的合规性和主权控制。
如果在项目元数据中启用了 OS Login,则需要暂时停用 OS Login,直到部署完成。出于部署目的,此过程会在实例元数据中配置 SSH 密钥。启用 OS Login 后,基于元数据的 SSH 密钥配置会停用,并且此部署将失败。部署完成后,您可以再次启用 OS Login。
如需了解详情,请参阅以下主题:
创建网络
出于安全考虑,建议您创建一个新的网络。您可以通过添加防火墙规则或使用其他访问权限控制方法来控制哪些人有权访问该网络。
如果您的项目具有默认 VPC 网络,请勿使用。 请创建自己的 VPC 网络,以保证只有您明确创建的防火墙规则在起作用。
在部署期间,虚拟机实例通常需要访问互联网来下载 Google Cloud的 Agent for SAP。如果您使用的是由 Google Cloud提供的某一经 SAP 认证的 Linux 映像,那么虚拟机实例还需要访问互联网来注册许可并访问操作系统供应商代码库。具有 NAT 网关和虚拟机网络标记的配置支持这种访问,即使目标虚拟机没有外部 IP 地址,也是如此。
如需设置网络,请执行以下操作:
控制台
- 在 Google Cloud 控制台中,前往 VPC 网络页面。
- 点击创建 VPC 网络。
- 输入网络的名称。
名称必须遵循命名惯例。VPC 网络使用 Compute Engine 命名惯例。
- 对于子网创建模式,选择自定义。
- 在新子网部分,为子网指定以下配置参数:
- 输入子网的名称。
- 对于区域,请选择您要在其中创建子网的 Compute Engine 区域。
- 对于 IP 栈类型,请选择 IPv4(单栈),然后输入 CIDR 格式的 IP 地址范围,例如
10.1.0.0/24
。这是子网的主要 IPv4 地址范围。如果您计划添加多个子网,请为网络中的每个子网分配互不重叠的 CIDR IP 地址范围。请注意,每个子网及其内部 IP 地址范围都映射到一个区域。
- 点击完成。
- 如需添加更多子网,请点击添加子网,然后重复上述步骤。您可以在创建网络后向网络添加更多子网。
- 点击创建。
gcloud
- 转至 Cloud Shell。
- 如需在自定义子网模式下创建新网络,请运行以下命令:
gcloud compute networks create NETWORK_NAME --subnet-mode custom
将
NETWORK_NAME
替换为新网络的名称。名称必须遵循命名惯例。VPC 网络使用 Compute Engine 命名惯例。指定
--subnet-mode custom
可避免使用默认的自动模式,该模式会自动在每个 Compute Engine 区域创建一个子网。如需了解详情,请参阅子网创建模式。 - 创建一个子网,并指定区域和 IP 地址范围:
gcloud compute networks subnets create SUBNETWORK_NAME \ --network NETWORK_NAME --region REGION --range RANGE
替换以下内容:
SUBNETWORK_NAME
:新子网的名称NETWORK_NAME
:您在上一步中创建的网络的名称REGION
:该子网所在的区域RANGE
:以 CIDR 格式指定的 IP 地址范围,例如10.1.0.0/24
如果您计划添加多个子网,请为网络中的每个子网分配互不重叠的 CIDR IP 地址范围。请注意,每个子网及其内部 IP 地址范围均映射到一个区域。
- (可选)重复上述步骤并添加更多子网。
设置 NAT 网关
如果您需要创建一个或多个没有公共 IP 地址的虚拟机,则需要使用网络地址转换 (NAT) 以使虚拟机能够访问互联网。使用 Cloud NAT,这是 Google Cloud 提供的一项软件定义的代管式服务,可让虚拟机将出站数据包发送到互联网,并接收任何对应的已建立入站响应数据包。或者,您可以将单独的虚拟机设置为 NAT 网关。
如需为项目创建 Cloud NAT 实例,请参阅使用 Cloud NAT。
为项目配置 Cloud NAT 后,虚拟机实例可以在没有公共 IP 地址的情况下安全地访问互联网。
添加防火墙规则
默认情况下,隐式防火墙规则会阻止从 Virtual Private Cloud (VPC) 网络外部传入的连接。如需允许传入的连接,请为您的虚拟机设置防火墙规则。在与虚拟机建立传入的连接后,防火墙会允许通过此连接的双向流量。
您还可以创建防火墙规则,允许对指定端口进行外部访问,或限制同一网络中各虚拟机之间的访问。如果使用 default
VPC 网络类型,则系统还会应用一些其他默认规则(例如 default-allow-internal
规则),以允许在同一网络中所有端口上的各虚拟机之间建立连接。
您可能需要通过创建防火墙规则来隔离或限制与数据库主机的连接,具体取决于适用于您的环境的 IT 政策。
根据您的使用场景,您可以创建防火墙规则来允许下列各项中的访问:
- 所有 SAP 产品的 TCP/IP 中列出的默认 SAP 端口。
- 从您的计算机或公司网络环境到 Compute Engine 虚拟机实例的连接。如果您不确定使用哪个 IP 地址,请与您公司的网络管理员联系。
如需创建防火墙规则,请执行以下操作:
控制台
在 Google Cloud 控制台中,前往 Compute Engine 防火墙页面。
点击页面顶部的创建防火墙规则。
- 在网络字段中,选择您的虚拟机所在的网络。
- 在目标字段中,指定要应用此规则的 Google Cloud资源。例如,指定网络中的所有实例。或者,若要将规则限制为仅应用于 Google Cloud上的特定实例,请在指定的目标标记中输入标记。
- 在来源过滤条件字段中,选择下列选项之一:
- IP 地址范围:用于允许从特定 IP 地址传入的流量。 请在来源 IP 地址范围字段中指定相应 IP 地址范围。
- 子网:用于允许从特定子网传入的流量。请在下面的子网字段中指定相应子网名称。此选项可用于允许 3 层式或横向扩缩式配置中的各虚拟机之间互相访问。
- 在协议和端口部分,选择指定的协议和端口并输入
tcp:PORT_NUMBER
。
点击创建以创建防火墙规则。
gcloud
使用以下命令创建防火墙规则:
$
gcloud compute firewall-rules create firewall-name
--direction=INGRESS --priority=1000 \
--network=network-name --action=ALLOW --rules=protocol:port \
--source-ranges ip-range --target-tags=network-tags
部署虚拟机并安装 MaxDB
在开始配置高可用性集群之前,请先定义和部署将充当高可用性集群中的主节点和辅助节点的虚拟机实例和 SAP MaxDB 系统。
为 MaxDB 部署创建虚拟机
在高可用性部署过程中,您需要创建两个 Google Cloud Compute Engine 虚拟机。您可以参阅创建和启动 Compute Engine 实例指南。
请注意,区域级 Persistent Disk 仅支持使用 E2、N1、N2 和 N2D 机器类型。如需了解详情,请参阅区域级永久性磁盘指南。
请参阅 SAP 说明 2456432 - Google Cloud上的 SAP 应用:支持的产品和 Google Cloud 机器类型,根据您的大小调整选择合适的机器类型。
在不同的可用区中创建两个虚拟机,以实现可用区级弹性,并满足以下最低要求:
虚拟机详情:
Instance Name
Zone
- 您的首选可用区Machine Type
- 基于大小Subnet
- 为此区域创建的子网名称
至少对以下 API 具有访问权限范围的服务账号:
- https://www.googleapis.com/auth/compute
- https://www.googleapis.com/auth/servicecontrol
- https://www.googleapis.com/auth/service.management.readonly
- https://www.googleapis.com/auth/logging.write
- https://www.googleapis.com/auth/monitoring.write
- https://www.googleapis.com/auth/trace.append
- https://www.googleapis.com/auth/devstorage.read_write
每个虚拟机上至少有 20 GB 的额外磁盘可用于
/usr/sap
为 SAP MaxDB 创建单个区域级磁盘
对于此部署,一个区域级磁盘将用于在 /sapdb
目录中存储 MaxDB 文件。
创建磁盘,确保区域磁盘的复制可用区与您创建这两个虚拟机所在的可用区一致。
将区域磁盘附加到您将执行 MaxDB 安装和配置任务的其中一个虚拟机。
为安装 SAP 准备 RHEL 操作系统
SAP 产品需要安装特定的操作系统设置和软件包。请遵循 SAP 备注 2772999 - Red Hat Enterprise Linux 8.x:安装和配置中的准则。
必须在这两个节点上执行此任务。
创建文件系统
使用 SSH 连接到这两个实例,然后创建
/usr/sap/SID
和/sapdb
挂载点。#
sudo mkdir -p /usr/sap/SID#
sudo mkdir -p /sapdb使用
mkfs
在挂接到虚拟机的两个额外磁盘中创建文件系统。请注意,此时地区磁盘只会挂接到其中一个虚拟机,因此只会创建一次
/sapdb
文件系统。修改
/etc/fstab
文件,以便在两个节点上重新启动时始终挂载/usr/sap/SID
。将
/sapdb
文件系统手动装载到您将执行 MaxDB 安装的节点中。如需有关创建和装载文件系统的更多参考信息,请参阅指南在 Linux 虚拟机上格式化和装载非启动磁盘。
修改 LVM 配置
您需要修改逻辑卷管理 (LVM) 配置,以便共享卷组 (VG) 始终仅由一个节点附加和访问。
为此,请在两个节点上执行以下步骤:
以 root 用户身份修改
/etc/lvm/lvm.conf
文件,将system_id_source
值从none
修改为uname
检查结果:
#
grep -i system_id_source /etc/lvm/lvm.conf您应该会看到类似如下所示的输出:
# Configuration option global/system_id_source. system_id_source = "uname"
此外,为防止虚拟机在节点重新启动时激活集群管理的 VG,请在
/etc/lvm/lvm.conf
配置文件中维护以下参数,其中包含以英文逗号分隔的非集群管理的完整 VG 名称。例如,当
usrsap
是未由集群管理的 VG 名称时:auto_activation_volume_list = [ usrsap ]
例如,如果没有任何 VG 不受集群管理,则必须添加此参数并使用空值:
auto_activation_volume_list = [ ]
安装数据库和 SAP Host Agent
现在,您的操作系统已配置完毕,接下来您就可以安装 SAP MaxDB 数据库和 SAP Host Agent。MaxDB 通常会与其集成的 SAP 产品一起安装。
请注意,安装只会在您挂接了区域永久性磁盘的实例中执行一次。
如需在您的虚拟机上安装 SAP MaxDB,请执行以下操作:
- 与基于 Linux 的虚拟机建立 SSH 连接。
- 根据 SAP 安装指南,下载 SAP Software Provisioning Manager (SWPM)、SAP 产品安装介质和 MaxDB 安装介质。
- 根据针对您所用 SAP 产品的 SAP 安装指南,安装 SAP 产品和 AP MaxDB 数据库。如需获取更多指导信息,请参阅 SAP MaxDB 文档。
SAP 在 SAP 说明 1020175 - 常见问题解答:SAP MaxDB 安装、升级或应用补丁程序中提供了其他安装信息。
安装完成后,请执行以下验证:
以 sidadm 用户身份检查 MaxDB 的状态。
#
dbmcli -d SID -u control,password db_state您应该会看到类似于以下示例的输出:
>dbmcli -d MDB -u control, my_p4$$w0rd db_state OK State ONLINE
同时检查
x_server
的状态:#
x_server您应该会看到类似于以下示例的输出:
>x_server 2024-10-23 19:01:43 11968 19744 INF 12916 Found running XServer on port 7200 2024-10-23 19:01:43 11968 19744 INF 13011 version 'U64/LIX86 7.9.10 Build 004-123-265-969' 2024-10-23 19:01:43 11968 19744 INF 13010 installation MDB - path: /sapdb/MDB/db 2024-10-23 19:01:45 11971 13344 INF 12916 Found running sdbgloballistener on port 7210 2024-10-23 19:01:45 11971 13344 INF 13011 version 'U64/LIX86 7.9.10 Build 004-123-265-969'
检查 SAP Host Agent 是否正在运行:
#
ps -ef | grep -i hostctrl您应该会看到类似于以下示例的输出:
>ps -ef | grep -i hostctrl root 1543 1 0 Oct18 ? 00:00:15 /usr/sap/hostctrl/exe/saphostexec pf=/usr/sap/hostctrl/exe/host_profile sapadm 1550 1 0 Oct18 ? 00:03:00 /usr/sap/hostctrl/exe/sapstartsrv pf=/usr/sap/hostctrl/exe/host_profile -D root 1618 1 0 Oct18 ? 00:03:48 /usr/sap/hostctrl/exe/saposcol -l -w60 pf=/usr/sap/hostctrl/exe/host_profile mdbadm 12751 11261 0 19:03 pts/0 00:00:00 grep --color=auto -i hostctrl
安装完成后,请停止 MaxDB 实例和 x_server。
# dbmcli -d SID -u control, and password db_offline # x_server stop
执行安装后任务
在使用 SAP MaxDB 实例之前,我们建议您先执行以下几个部署后步骤:
- 使用最新的补丁程序更新 SAP MaxDB 软件(如果有)。
- 安装其他任何组件。
- 配置新的 SAP MaxDB 数据库并进行备份。
如需了解详情,请参阅 SAP MaxDB 数据库管理。
成功部署 SAP MaxDB 系统后,您可以定义和配置高可用性集群。
配置 Cloud Load Balancing 故障切换支持
具有故障切换支持的内部直通式网络负载平衡器服务会根据健康检查服务将流量路由到 SAP MaxDB 集群中的活跃主机。
为虚拟 IP 地址预留 IP 地址
虚拟 IP (VIP) 地址(有时也称为浮动 IP 地址)跟随活跃 SAP MaxDB 系统。负载均衡器将发送到 VIP 的流量路由到托管活跃 SAP MaxDB 系统的虚拟机。
打开 Cloud Shell:
为虚拟 IP 地址预留 IP 地址。这是应用用于访问 SAP MaxDB 的 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: '2024-10-23T14:19:03.109-07:00' description: '' id: '8961491304398200872' kind: compute#address name: vip-for-maxdb-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-maxdb-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 maxdb-ha-ig-1 us-central1-a example-network example-project-123456 No 1 maxdb-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: '2023-10-23T21:03:06.924-07:00' healthyThreshold: 2 id: '4963070308818371477' kind: compute#healthCheck name: maxdb-health-check selfLink: https://www.googleapis.com/compute/v1/projects/example-project-123456/global/healthChecks/maxdb-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 地址,请指定您为 VIP 地址预留的 IP 地址。如果您需要从下面指定的区域外部访问 SAP MaxDB 系统,请在定义中添加
--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 MaxDB 高可用性系统,请参阅内部 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/maxdb-ha-ig-1 status: healthStatus: ‐ healthState: HEALTHY instance: https://www.googleapis.com/compute/v1/projects/example-project-123456/zones/us-central1-a/instances/maxdb-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/maxdb-ha-ig-2 status: healthStatus: ‐ healthState: HEALTHY instance: https://www.googleapis.com/compute/v1/projects/example-project-123456/zones/us-central1-c/instances/maxdb-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/maxdb-ha-ig-1 status: healthStatus: ‐ healthState: HEALTHY instance: https://www.googleapis.com/compute/v1/projects/example-project-123456/zones/us-central1-a/instances/maxdb-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/maxdb-ha-ig-2 status: healthStatus: ‐ healthState: HEALTHY instance: https://www.googleapis.com/compute/v1/projects/example-project-123456/zones/us-central1-c/instances/maxdb-ha-vm-2 ipAddress: 10.0.0.34 port: 80 kind: compute#backendServiceGroupHealth
完成后,将健康检查端口号更改回原始端口号。
设置 Pacemaker
以下过程将在 SAP MaxDB 的 Compute Engine 虚拟机上配置 Pacemaker 集群的 Red Hat 实现。
此过程基于用于配置高可用性集群的 Red Hat 文档,包括:
在两个节点上安装集群代理
在两个节点上完成以下步骤。
以根用户身份安装 Pacemaker 组件:
#
yum -y install pcs pacemaker fence-agents-gce resource-agents-gcp resource-agents-sap-hana#
yum update -y如果您使用的是 Google 提供的 RHEL-for-SAP 映像,则这些软件包已安装,但可能需要更新。
设置
hacluster
用户的密码,该用户将作为软件包的一部分安装:#
passwd hacluster在系统提示时为
hacluster
指定密码。在 Google Cloud提供的 RHEL 映像中,操作系统防火墙服务默认处于活跃状态。配置防火墙服务以允许高可用性流量:
#
firewall-cmd --permanent --add-service=high-availability#
firewall-cmd --reload启动 pcs 服务,并将其配置为在启动时启动:
#
systemctl start pcsd.service#
systemctl enable pcsd.service检查 pcs 服务的状态:
#
systemctl status pcsd.service您将看到如下所示的输出:
● pcsd.service - PCS GUI and remote configuration interface Loaded: loaded (/usr/lib/systemd/system/pcsd.service; enabled; vendor preset: disabled) Active: active (running) since Sat 2023-10-23 21:17:05 UTC; 25s ago Docs: man:pcsd(8) man:pcs(8) Main PID: 31627 (pcsd) CGroup: /system.slice/pcsd.service └─31627 /usr/bin/ruby /usr/lib/pcsd/pcsd Oct 23 21:17:03 maxdb-ha-vm-1 systemd[1]: Starting PCS GUI and remote configuration interface... Oct 23 21:17:05 maxdb-ha-vm-1 systemd[1]: Started PCS GUI and remote configuration interface.
确保所有必需的高可用性 (HA) 服务都已启用,并且在两个节点上都已启动并运行。
#
systemctl enable pcsd.service pacemaker.service corosync.service在
/etc/hosts
文件中,添加集群中两个主机的完整主机名和内部 IP 地址。例如:127.0.0.1 localhost localhost.localdomain localhost4 localhost4.localdomain4 ::1 localhost localhost.localdomain localhost6 localhost6.localdomain6 10.0.0.40 maxdb-ha-vm-1.us-central1-a.c.example-project-123456.internal maxdb-ha-vm-1 # Added by Google 10.0.0.41 maxdb-ha-vm-2.us-central1-c.c.example-project-123456.internal maxdb-ha-vm-2 169.254.169.254 metadata.google.internal # Added by Google
如需详细了解 Red Hat 如何在 RHEL 集群节点上设置
/etc/hosts
文件,请参阅 https://access.redhat.com/solutions/81123。
创建集群
在任一节点上以根用户身份为
hacluster
用户授权。点击 RHEL 版本的标签页以查看命令:RHEL 8 及更高版本
#
pcs host auth primary-host-name secondary-host-nameRHEL 7
#
pcs cluster auth primary-host-name secondary-host-name在系统提示时,输入
hacluster
用户名以及您为hacluster
用户设置的密码。创建集群:
RHEL 8 及更高版本
#
pcs cluster setup cluster-name primary-host-name secondary-host-nameRHEL 7
#
pcs cluster setup --name cluster-name primary-host-name secondary-host-name
修改 corosync.conf 默认设置
修改主要主机上的 /etc/corosync/corosync.conf
文件,以为在 Google Cloud上测试高可用性集群的容错设置较合适的起点。
在任一主机上,使用首选文本编辑器打开
/etc/corosync/corosync.conf
文件进行修改:#
/etc/corosync/corosync.conf如果
/etc/corosync/corosync.conf
是新文件或者为空,您可以在/etc/corosync/
目录中查找示例文件并用作 corosync 文件的基础。在 corosync.conf 文件的
totem
部分中,添加以下属性以及建议的值,如您的 RHEL 版本所示:RHEL 8 及更高版本
transport: knet
token: 20000
token_retransmits_before_loss_const: 10
join: 60
max_messages: 20
例如:
totem { version: 2 cluster_name: hacluster secauth: off transport: knet token: 20000 token_retransmits_before_loss_const: 10 join: 60 max_messages: 20 } ...
RHEL 7
transport: udpu
token: 20000
token_retransmits_before_loss_const: 10
join: 60
max_messages: 20
例如:
totem { version: 2 cluster_name: hacluster secauth: off transport: udpu token: 20000 token_retransmits_before_loss_const: 10 join: 60 max_messages: 20 } ...
从包含已修改的
corosync.conf
文件的主机上,在集群之间同步 corosync 配置:RHEL 8 及更高版本
#
pcs cluster sync corosyncRHEL 7
#
pcs cluster sync将集群设置为自动启动:
#
pcs cluster enable --all#
pcs cluster start --all使用 corosync-cmapctl 实用工具确认新的 corosync 设置在集群中处于活动状态:
#
corosync-cmapctl
设置防护功能
Google Cloud 提供的 RHEL 映像包含一个特定于 Google Cloud的 fence_gce
防护代理。您可以使用 fence_gce
为每个主机虚拟机创建防护设备。
为了确保执行防护操作后的事件序列正确无误,您可以配置操作系统,以在防护虚拟机后延迟 Corosync 的重启。此外,您还需要调整 Pacemaker 的重启超时,以将该延迟考虑在内。
若要查看 fence_gce
防护代理可用的所有选项,请发出 fence_gce -h
。
创建防护设备资源
在主要主机上,以根用户身份执行以下操作:
为每个主机虚拟机创建防护设备:
#
pcs stonith create primary-fence-name fence_gce \ port=primary-host-name \ zone=primary-host-zone \ project=project-id \ pcmk_reboot_timeout=300 pcmk_monitor_retries=4 pcmk_delay_max=30 \ op monitor interval="300s" timeout="120s" \ op start interval="0" timeout="60s"#
pcs stonith create secondary-fence-name fence_gce \ port=secondary-host-name \ zone=secondary-host-zone \ project=project-id \ pcmk_reboot_timeout=300 pcmk_monitor_retries=4 \ op monitor interval="300s" timeout="120s" \ op start interval="0" timeout="60s"将每个防护设备限制到另一个主机虚拟机:
#
pcs constraint location primary-fence-name avoids primary-host-name#
pcs constraint location secondary-fence-name avoids secondary-host-name
在主要主机上,以根用户身份测试辅助防护设备:
关闭辅助主机虚拟机:
#
fence_gce -o off -n secondary-host-name --zone=secondary-host-zone如果命令成功,您将失去与辅助主机虚拟机的连接,并且在 Google Cloud 控制台中的虚拟机实例页面上会停止该命令。您可能需要刷新页面。
重启辅助主机虚拟机:
#
fence_gce -o on -n secondary-host-name --zone=secondary-host-zone
在辅助主机上,以根用户身份,通过在命令中使用主要主机的值重复上述步骤来测试主防护设备。
在任一主机上,以根用户身份检查集群的状态:
#
pcs status防护资源显示在集群状态的资源部分中,类似于以下示例:
[root@maxdb-ha-vm-2 ~]# pcs status Cluster name: maxdb-ha-cluster Stack: corosync Current DC: maxdb-ha-vm-1 (version 1.1.19-8.el7_6.5-c3c624ea3d) - partition with quorum Last updated: Mon Jun 15 17:19:07 2020 Last change: Mon Jun 15 17:18:33 2020 by root via cibadmin on maxdb-ha-vm-1 2 nodes configured 2 resources configured Online: [ maxdb-ha-vm-1 maxdb-ha-vm-2 ] Full list of resources: STONITH-maxdb-ha-vm-1 (stonith:fence_gce): Started maxdb-ha-vm-2 STONITH-maxdb-ha-vm-2 (stonith:fence_gce): Started maxdb-ha-vm-1 Daemon Status: corosync: active/enabled pacemaker: active/enabled pcsd: active/enabled
设置 Corosync 重启延迟
在两个主机上,以根用户身份创建一个
systemd
普适性文件,该文件用于延迟 Corosync 的启动,以确保在重启经过防护的虚拟机后具有正确的事件序列:systemctl edit corosync.service
将以下代码行添加到文件中:
[Service] ExecStartPre=/bin/sleep 60
保存文件并退出编辑器。
重新加载 systemd 管理器配置。
systemctl daemon-reload
确认已创建普适性文件:
service corosync status
您应能看到普适性文件所对应的行,如以下示例所示:
● corosync.service - Corosync Cluster Engine Loaded: loaded (/usr/lib/systemd/system/corosync.service; disabled; vendor preset: disabled) Drop-In: /etc/systemd/system/corosync.service.d └─override.conf Active: active (running) since Tue 2021-07-20 23:45:52 UTC; 2 days ago
安装侦听器并创建健康检查资源
如需配置健康检查资源,您需要先安装监听器。
安装侦听器
负载均衡器在每个主机的健康检查端口上使用监听器来确定 MaxDB 实例的运行位置。
在两个主机上,以根用户身份安装 TCP 监听器。这些说明将安装 HAProxy 并将其用作侦听器。
#
yum install haproxy打开配置文件
haproxy.cfg
进行修改:#
vi /etc/haproxy/haproxy.cfg在
haproxy.cfg
的默认值部分中,将mode
更改为tcplog
。在默认值部分后,通过添加以下内容创建一个新部分:
#--------------------------------------------------------------------- # Health check listener port for SAP MaxDB 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 MaxDB 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 —-group SAPMaxDB_Group确认健康检查服务在 SAP MaxDB 实例所在的主机上处于活跃状态:
#
pcs status如果健康检查资源不在 MaxDB 所在的主机上,请使用以下命令进行移动:
#
pcs resource move healthcheck_resource_name target_host_name#
pcs resource clear healthcheck_resource_name命令
pcs resource clear
会将资源保留在其新位置,但移除了pcs resource move
命令创建的不需要的位置限制条件。在状态中,资源部分应类似于以下示例:
Full list of resources: STONITH-maxdb-ha-vm-1 (stonith:fence_gce): Started maxdb-ha-vm-2 STONITH-maxdb-ha-vm-2 (stonith:fence_gce): Started maxdb-ha-vm-1 Resource Group: SAPMaxDB_Group rsc_healthcheck_MDB (service:haproxy): Started maxdb-ha-vm-1
设置集群默认设置
设置迁移阈值和粘性,以确定在发生故障前要尝试的故障切换次数,并将系统设置为先尝试在当前主机上重启。只需在一个节点上设置此设置即可应用到集群。
在任一主机上,以根用户身份设置资源默认值:
#
pcs resource defaults resource-stickiness=1000#
pcs resource defaults migration-threshold=5000属性
resource-stickiness
用于控制服务在其位置保持运行的可能性。值越高,服务粘性越高。值1000
表示服务粘性非常高。属性
migration-threshold
用于指定在服务故障切换到其他主机之前必须发生的故障数。值 5000 已经足够高,可以防止对持续较短时间的故障进行故障切换。您可以通过输入
pcs resource defaults
来检查资源默认值。设置资源操作超时默认值:
#
pcs resource op defaults timeout=600s您可以通过输入
pcs resource op defaults
来检查资源操作默认值。设置以下集群属性:
#
pcs property set stonith-enabled="true"#
pcs property set stonith-timeout="300s"您可以通过
pcs property list
来检查您的属性设置。
在集群中创建 MaxDB 资源
执行这些步骤之前,请确保 MaxDB 和 x_server
已停止,并且 /sapdb
文件系统已卸载。
创建 gcp-pd-move 资源
gcp-pd-move
资源是一种资源代理,用于在集群故障切换期间将永久性磁盘从一个节点移至另一个节点。
在任一节点上,使用以下命令以 root 身份创建资源:
#
pcs resource create pd_move_resource_name gcp-pd-move \ disk_name=regional_pd_name mode="READ_WRITE" disk_scope=regional \ op monitor interval=10s timeout=15s \ op start interval=0s timeout=300s \ op stop interval=0s timeout=15s \ --group SAPMaxDB_Group
创建 LVM 资源
在将磁盘移至另一个节点后,系统会使用已激活 LVM 的资源代理来激活 LVM。
在任一节点上,以 root 身份使用以下命令创建 LVM 资源:
#
pcs resource create lvm_resource_name LVM-activate \ vgname=vgname_for_maxdb \ vg_access_mode=system_id activation_mode=exclusive \ --group SAPMaxDB_Group例如:
# pcs resource create sapdb_lvm LVM-activate \ vgname=sapdb vg_access_mode=system_id \ activation_mode=exclusive \ --group SAPMaxDB_Group
创建文件系统资源
文件系统资源在集群中用于在故障切换操作期间卸载 /sapdb
并将其挂载到另一个节点上。
在任一节点上,使用以下命令以 root 身份创建文件系统资源:
#
pcs resource create fs_resource_name Filesystem \ device=filesystem directory=/sapdb fstype=fs_type \ --group SAPMaxDB_Group例如:
# pcs resource create sapdb_FS Filesystem \ device=/dev/mapper/sapdb-sapdblv directory=/sapdb fstype=ext4 \ --group SAPMaxDB_Group
为 MaxDB 资源组做好准备
如需启用 MaxDB 资源组,您需要执行以下步骤。
将您在执行 MaxDB 安装的节点上的用户和组同步到另一个节点。
必须通过复制
/etc/passwd
中的条目,在节点之间同步 SAP MaxDB 用户,例如:sdb:x:1002:1003:MaxDB User:/home/sdb:/bin/false madbadm:x:1003:1005:SAP System Administrator:/home/mdbadm:/bin/csh
同样,您还必须通过将
/etc/group
中的条目从一个节点复制到另一个节点来同步 SAP 组,例如:dba:x:1003:mdbadm sapsys:x:1005:
同步存储在操作系统目录下的 MaxDB 专用文件。以根用户身份执行以下命令:
#
rsync -av /etc/services target_host:/etc/services#
rsync -av /home/* target_host:/home#
rsync -av --exclude=sapservices /usr/sap/* target_host:/usr/sap#
rsync -av --ignore-existing /usr/sap/sapservicestarget_host:/usr/sap/sapservices#
rsync -av /etc/init.d/sapinittarget_host:/etc/init.d/# MaxDB specific files
#
rsync -av /etc/opttarget_host:/etc#
rsync -av /var/lib/sdbtarget_host:/var/lib对于第二个节点上的 SAP OS 用户,请重命名以下环境文件,以便在其主目录中使用相应主机名,例如:
mv .sapenv_maxdb-ha-vm-1.sh .sapenv_maxdb-ha-vm-2.sh mv .sapenv_maxdb-ha-vm-1.csh .sapenv_maxdb-ha-vm-2.csh mv .sapsrc_maxdb-ha-vm-1.sh .sapsrc_maxdb-ha-vm-2.sh mv .sapsrc_maxdb-ha-vm-1.csh .sapsrc_maxdb-ha-vm-2.csh mv .dbenv_maxdb-ha-vm-1.sh .sapenv_maxdb-ha-vm-2.sh mv .dbenv_maxdb-ha-vm-1.csh .dbenv_maxdb-ha-vm-2.csh
SAPDatabase
资源代理不会使用任何数据库专用命令来停止或启动数据库,而是依赖于 saphostctrl
命令来执行相同的操作。SAP Host Agent 需要创建 xuser
条目,才能使用 saphostctrl 成功监控和控制 MAXDB。如需了解详情,请参阅 SAP 备注 2435938 - SAP Host Agent SAP MaxDB:DB 连接的 DBCredentials。
以 root 身份执行以下命令,在活动节点上执行
SetDatabaseProperty
:/usr/sap/hostctrl/exe/saphostctrl -host primary-host-name -user sapadm password \ -dbname SID -dbtype ada -function SetDatabaseProperty DBCredentials=SET \ -dboption User=SUPERDBA -dboption Password=password
使用以下命令测试条目,即使数据库已停止,该命令也应能恢复状态:
/usr/sap/hostctrl/exe/saphostctrl -host secondary-host-name -dbname SID \ -dbtype ada -function GetDatabaseStatus
saphostctrl 代理命令使用 MaxDB 安装中的 xuser
程序,因此,现在若要准备第二个节点,您需要将 SAPMaxDB_group
移至 maxdb-node-b。
在任意节点上,以 root 身份执行以下命令:
pcs resource move SAPMaxDB_group
请注意,创建的四项资源(健康检查、gcp-pd-move
、LVM 和文件系统)现已迁移到第二个节点并成功启动。
您可以在任何节点上使用以下命令监控正在执行的操作:
watch pcs status
在第二个节点上成功启动所有四个资源后,执行 saphostctrl
命令。
以 root 身份执行以下命令,在当前处于活动状态的节点上 SetDatabaseProperty:
/usr/sap/hostctrl/exe/saphostctrl -host secondary-host-name -user sapadm password \ -dbname SID -dbtype ada -function SetDatabaseProperty DBCredentials=SET \ -dboption User=SUPERDBA -dboption Password=password
在节点 b 上,手动启动 MaxDB 和
x_server
,检查它们能否正常启动:#
dbmcli -d SID -u control, and password db_online # x_server start
继续执行下一步,为 SAP 数据库创建资源。 如果此时出现任何错误,请勿创建数据库资源。
为 SAP MaxDB 创建资源
RHEL Pacemaker 使用 SAP 数据库资源代理来监控和控制 SAP 数据库。
使用以下命令在 SAPMaxDB_group 处于活动状态的节点上创建数据库资源:
#
pcs resource create SAPDatabase_resource_name SAPDatabase \ DBTYPE="ADA" SID="SID" STRICT_MONITORING="TRUE" \ MONITOR_SERVICES="Database|x_server" AUTOMATIC_RECOVER="TRUE" --group SAPMaxDB_Group您可以使用
pcs status
查看最终的集群资源,预期结果如下所示:# pcs status Cluster name: maxdb-cluster Stack: corosync Current DC: maxdb-ha-vm-1 (version 1.1.23-1.el7_9.1-9acf116022) - partition with quorum Last updated: Wed Oct 23 02:04:32 2024 Last change: Wed Oct 23 02:01:41 2024 by hacluster via crmd on maxdb-ha-vm-1 2 nodes configured 7 resource instances configured Online: [ maxdb-ha-vm-1 maxdb-ha-vm-2 ] Full list of resources: STONITH-maxdb-ha-vm-1 (stonith:fence_gce): Started maxdb-ha-vm-2 STONITH-maxdb-ha-vm-2 (stonith:fence_gce): Started maxdb-ha-vm-1 Resource Group: SAPMaxDB_Group healthcheck_maxdb (service:haproxy): Started maxdb-ha-vm-1 sapdb_regpd (ocf::heartbeat:gcp-pd-move): Started maxdb-ha-vm-1 lvm_sapdb (ocf::heartbeat:LVM-activate): Started maxdb-ha-vm-1 sapdb_fs (ocf::heartbeat:Filesystem): Started maxdb-ha-vm-1 MDB_SAPMaxDB (ocf::heartbeat:SAPDatabase): Started maxdb-ha-vm-1 Daemon Status: corosync: active/enabled pacemaker: active/enabled pcsd: active/enabled
测试故障切换
通过在活跃主机上模拟故障来测试集群。在发布系统以供使用之前,请使用测试系统或在生产系统上运行测试。
在测试前备份系统。
您可以通过多种方式模拟故障,包括:
- 手动停止 MaxDB 或
x_server
- 终止 MaxDB 或
x_server
进程 reboot
(活跃节点上)ip link set eth0 down
,适用于具有单个网络接口的实例iptables ... DROP
,适用于具有多个网络接口的实例echo c > /proc/sysrq-trigger
以下说明使用 ip link set eth0 down
或 iptables
来模拟集群中两个主机之间的网络中断。在具有单个网络接口的实例上使用 ip link
命令,在具有一个或多个网络接口的实例上使用 iptables
命令。此测试会验证故障切换和防护。如果您的实例定义了多个网络接口,请在辅助主机上使用 iptables
命令,以根据集群的主要主机用于集群通信的 IP 来丢弃传入和传出流量,从而模拟主要主机的网络连接中断。
在活跃主机上,以根用户身份将网络接口设为离线:
#
ip link set eth0 down使用 SSH 重新连接到任一主机并切换到根用户。
输入
pcs status
以确认之前处于被动状态的主机现在已挂接区域永久性磁盘,并且正在运行 MaxDB 服务。集群中已启用自动重启,因此已停止的主机将重启并担任被动主机的角色,如以下示例所示:Cluster name: maxdb-ha-cluster Stack: corosync Current DC: maxdb-ha-vm-2 (version 1.1.23-1.el7_9.1-9acf116022) - partition with quorum Last updated: Wed Oct 23 02:01:45 2024 Last change: Wed Oct 23 02:01:41 2024 by hacluster via crmdon maxdb-ha-vm-2 2 nodes configured 7 resources configured Online: [ maxdb-ha-vm-1 maxdb-ha-vm-2 ] Full list of resources: STONITH-maxdb-ha-vm-1 (stonith:fence_gce): Started maxdb-ha-vm-2 STONITH-maxdb-ha-vm-2 (stonith:fence_gce): Started maxdb-ha-vm-1 Resource Group: SAPMaxDB_Group healthcheck_maxdb (service:haproxy): Started maxdb-ha-vm-2 sapdb_regpd (ocf::heartbeat:gcp-pd-move): Started maxdb-ha-vm-2 lvm_sapdb (ocf::heartbeat:LVM-activate): Started maxdb-ha-vm-2 sapdb_fs (ocf::heartbeat:Filesystem): Started maxdb-ha-vm-2 MDB_SAPMaxDB (ocf::heartbeat:SAPDatabase): Started maxdb-ha-vm-2 Daemon Status: corosync: active/enabled pacemaker: active/enabled pcsd: active/enabled
问题排查
如需排查 RHEL 上的 SAP 系统高可用性配置问题,请参阅排查 SAP 高可用性配置。
获取 RHEL 上的 SAP HANA 支持
如果您在解决 RHEL 上的 SAP HANA 高可用性集群问题时需要帮助,请收集必要的诊断信息并与 Cloud Customer Care 联系。如需了解详情,请参阅 RHEL 上的高可用性集群诊断信息。