教程:使用适用于 Linux 的 HPE Serviceguard 设置三节点 Always On 可用性组

适用于:SQL Server - Linux

本教程介绍如何使用在本地虚拟机 (VM) 上或基于 Azure 的虚拟机中运行的适用于 Linux 的 HPE Serviceguard 来配置 SQL Server 可用性组。

有关 HPE Serviceguard 群集的概述,请参阅 HPE Serviceguard 群集

注意

Microsoft 支持数据移动、可用性组和 SQL Server 组件。 请联系 HPE 以获取与 HPE Serviceguard 群集和仲裁管理文档相关的支持。

本教程包含以下任务:

  • 在三个 VM(将构成可用性组的一部分)上都安装 SQL Server
  • 在 VM 上安装 HPE Serviceguard
  • 创建 HPE Serviceguard 群集
  • 在 Azure 门户中创建负载均衡器
  • 创建可用性组,并将示例数据库添加到可用性组
  • 通过 Serviceguard 群集管理器在可用性组上部署 SQL Server 工作负载
  • 执行自动故障转移,并将节点加入回群集

先决条件

  • 在 Azure 中,创建三个基于 Linux 的 VM(虚拟机)。 若要在 Azure 中创建基于 Linux 的虚拟机,请参阅快速入门:在 Azure 门户中创建 Linux 虚拟机。 部署 VM 时,请确保使用 HPE Serviceguard 支持的 Linux 发行版。 如果需要,还可以在本地环境中本地部署 VM。

    如需受支持的分发的示例,请参阅适用于 Linux 的 HPE Serviceguard。 请参阅 HPE,获取有关对公有云环境的支持的信息。

    本教程中的说明已针对适用于 Linux 的 HPE Serviceguard 进行验证。 可从 HPE 下载试用版。

  • 三个虚拟机的逻辑卷装载 (LVM) 上的 SQL Server 数据库文件。 请参阅 Serviceguard Linux (HPE) 快速入门指南

  • 确保 VM 上已安装 OpenJDK Java 运行时。 不支持 IBM Java SDK。

安装 SQL Server

在这三个 VM 上,都请根据你在本教程中选择的 Linux 发行版,按照以下步骤之一安装 SQL Server 和工具。

Red Hat Enterprise Linux (RHEL)

SUSE Linux Enterprise Server (SLES)

完成此步骤后,应在要加入可用性组的三个 VM 上都安装 SQL Server 服务和工具。

在 VM 上安装 HPE Serviceguard

在此步骤中,在三个 VM 上都安装适用于 Linux 的 HPE Serviceguard。 下表描述了每个服务器在群集中扮演的角色。

VM 数量 HPE Serviceguard 角色 Microsoft SQL Server 可用性组副本角色
1 HPE Serviceguard 群集节点 主副本
大于等于 1 HPE Serviceguard 群集节点 辅助副本
1 HPE Serviceguard 仲裁服务器 仅配置副本

注意

请参阅 HPE 提供的此视频,该视频介绍如何通过 UI 安装和配置 HPE Serviceguard 群集

若要安装 Serviceguard,请使用 cminstaller 方法。 以下链接提供了具体说明:

完成 HPE Serviceguard 群集的安装后,可以在主要副本节点的 TCP 端口 5522 上启用群集管理门户。 以下步骤将规则添加到防火墙以允许 5522。 以下命令适用于 Red Hat Enterprise Linux (RHEL)。 需要为其他分发运行类似的命令:

sudo firewall-cmd --zone=public --add-port=5522/tcp --permanent
sudo firewall-cmd --reload

创建 HPE Serviceguard 群集

按照以下说明配置和创建 HPE Serviceguard 群集。 在此步骤中,你还将配置仲裁服务器。

  1. 在第三个节点上配置 Serviceguard 仲裁服务器。 请参阅“Configure_QS”部分。
  2. 在其他两个节点上配置和创建 Serviceguard 群集。 请参阅“Configure_and_create_Cluster”部分。

注意

创建 VM 时,可以通过从 Azure VM 市场添加 HPE Serviceguard for Linux (SGLX) 扩展来绕过 HPE Serviceguard 群集和仲裁的手动安装。

创建可用性组并添加示例数据库

在此步骤中,创建具有两个(或更多)同步副本和一个仅配置副本的可用性组,该可用性组除了提供数据保护,还可以提供高可用性。 下图呈现了此体系结构:

Screenshot showing how the primary replica synchronizes user data and configuration data with the secondary replica. The primary replica only synchronizes configuration data with the configuration only replica. The configuration only replica doesn't have user data replicas.

  1. 用户数据到次要副本的同步复制。 它还包括可用性组配置元数据。

  2. 可用性组配置元数据的同步复制。 它不包括用户数据。

有关详细信息,请参阅两个同步副本和一个仅配置副本

若要创建可用性组,请执行以下步骤:

  1. 在所有 VM(包括仅配置副本)上启用可用性组并重启 mssql-server
  2. 启用 AlwaysOn_health 事件会话(可选)
  3. 在主 VM 上创建证书
  4. 在辅助服务器上创建证书
  5. 在副本上创建数据库镜像终结点
  6. 创建可用性组
  7. 联接次要副本
  8. 将数据库添加到可用性组

启用可用性组并重启 mssql-server

在托管 SQL Server 实例的所有节点上启用可用性组。 然后重启 mssql-server。 在三个节点上都运行以下脚本:

sudo /opt/mssql/bin/mssql-conf
set hadr.hadrenabled 1 sudo systemctl restart mssql-server

启用 AlwaysOn_health 事件会话(可选)

可选择性地启用 Always On 可用性组的扩展事件,以便在对可用性组进行故障排除时帮助诊断根本原因。 在每个 SQL Server 实例上运行以下命令:

ALTER EVENT SESSION AlwaysOn_health ON SERVER WITH (STARTUP_STATE=ON);
GO

在主 VM 上创建证书

以下 Transact-SQL 脚本创建主密钥和证书。 然后备份证书,并使用私钥保护文件。 使用强密码更新脚本。 连接到主 SQL Server 实例,并运行以下 Transact-SQL 脚本:

CREATE MASTER KEY ENCRYPTION BY PASSWORD = '<Master_Key_Password>';

CREATE CERTIFICATE dbm_certificate WITH SUBJECT = 'dbm';

BACKUP CERTIFICATE dbm_certificate TO FILE = '/var/opt/mssql/data/dbm_certificate.cer'
WITH PRIVATE KEY
    ( FILE = '/var/opt/mssql/data/dbm_certificate.pvk',
      ENCRYPTION BY PASSWORD = '<Private_Key_Password>' );

现在,主 SQL Server 副本的证书位于 /var/opt/mssql/data/dbm_certificate.cer,私钥位于 var/opt/mssql/data/dbm_certificate.pvk。 将这两个文件复制到所有要托管可用性副本的服务器上的同一位置。 使用 mssql 用户或为 mssql 用户授予访问这些文件的权限。

例如,在源服务器上,以下命令可将文件复制到目标计算机。 将 node2 值替换为运行辅助 SQL Server 实例的主机的名称。 同时将证书复制到仅配置副本上,并在该节点上运行以下命令。

cd /var/opt/mssql/data
scp dbm_certificate.* root@<node2>:/var/opt/mssql/data/

现在,在运行辅助实例的辅助 VM 和 SQL Server 仅配置副本上运行以下命令,以便 mssql 用户可以拥有复制的证书:

cd /var/opt/mssql/data
chown mssql:mssql dbm_certificate.*

在辅助服务器上创建证书

以下 Transact-SQL 脚本根据在主 SQL Server 副本上创建的备份创建主密钥和证书。 使用强密码更新脚本。 解密密码与在此前的步骤中创建 .pvk 文件使用的密码相同。 若要创建证书,请在除仅配置副本之外的所有辅助服务器上运行以下脚本:

CREATE MASTER KEY ENCRYPTION BY PASSWORD =
'<Master_Key_Password>';

CREATE CERTIFICATE dbm_certificate FROM FILE =
'/var/opt/mssql/data/dbm_certificate.cer'
WITH PRIVATE KEY ( FILE = '/var/opt/mssql/data/dbm_certificate.pvk',
DECRYPTION BY PASSWORD = '<Private_Key_Password>' );

在副本上创建数据库镜像终结点

在主要副本和次要副本上运行以下命令,以创建数据库镜像终结点:

CREATE ENDPOINT [hadr_endpoint] AS TCP (LISTENER_PORT = 5022)
    FOR DATABASE_MIRRORING
        (
        ROLE = WITNESS,
        AUTHENTICATION = CERTIFICATE dbm_certificate,
        ENCRYPTION = REQUIRED ALGORITHM AES
        );

ALTER ENDPOINT [hadr_endpoint] STATE = STARTED;

注意

5022 是用于数据库镜像终结点的标准端口,但你可以将其更改为任意可用端口。

在仅配置副本上,使用以下命令创建数据库镜像终结点,请注意此处“角色”的值设置为 WITNESS,这是仅配置副本所需的值。

CREATE ENDPOINT [hadr_endpoint] AS TCP (LISTENER_PORT = 5022)
    FOR DATABASE_MIRRORING (
        ROLE = WITNESS,
        AUTHENTICATION = CERTIFICATE dbm_certificate,
        ENCRYPTION = REQUIRED ALGORITHM AES
        );

ALTER ENDPOINT [hadr_endpoint] STATE = STARTED;

创建可用性组

在主要副本实例上,运行以下命令。 这些命令将创建一个名为 ag1 的具有外部 cluster_type 的可用性组,并向该可用性组授予创建数据库的权限。

在运行以下脚本之前,请将 <node1><node2><node3>(仅配置副本)占位符替换为在之前步骤中创建的 VM 的名称。

CREATE AVAILABILITY GROUP [ag1]
    WITH (CLUSTER_TYPE = EXTERNAL)
    FOR REPLICA ON
    N'<node1>' WITH (
        ENDPOINT_URL = N'tcp://<node1>:<5022>',
        AVAILABILITY_MODE = SYNCHRONOUS_COMMIT,
        FAILOVER_MODE = EXTERNAL,
        SEEDING_MODE = AUTOMATIC
        ),

    N'<node2>' WITH (
        ENDPOINT_URL = N'tcp://<node2>:\<5022>',
        AVAILABILITY_MODE = SYNCHRONOUS_COMMIT,
        FAILOVER_MODE = EXTERNAL,
        SEEDING_MODE = AUTOMATIC
        ),
    
    N'<node3>' WITH (
        ENDPOINT_URL = N'tcp://<node3>:<5022>',
        AVAILABILITY_MODE = CONFIGURATION_ONLY
        );
          
ALTER AVAILABILITY GROUP [ag1] GRANT CREATE ANY DATABASE;

联接次要副本

在所有次要副本上运行以下命令。 这些命令将次要副本与主要副本联接到 ag1 可用性组,并向 ag1 可用性组授予创建数据库的权限。

ALTER AVAILABILITY GROUP [ag1]
JOIN WITH (CLUSTER_TYPE = EXTERNAL);
GO
ALTER AVAILABILITY GROUP [ag1]
GRANT CREATE ANY DATABASE;
GO

将数据库添加到可用性组

连接到主要副本,并运行以下 T-SQL 命令来执行以下操作:

  1. 创建一个名为 db1 的示例数据库,该数据库将添加到可用性组。
  2. 将数据库的恢复模式设置为“完整”。 可用性组中的所有数据库都需处于完整恢复模式。
  3. 备份数据库。 数据库至少需要一个完整备份,然后才能将其添加到可用性组。
-- creates a database named db1
CREATE DATABASE [db1];
GO

-- set the database in full recovery model
ALTER DATABASE [db1] SET RECOVERY FULL; 
GO

-- backs up the database to disk
BACKUP DATABASE [db1]
TO DISK = N'/var/opt/mssql/data/db1.bak';
GO

-- adds the database db1 to the AG
ALTER AVAILABILITY GROUP [ag1] ADD DATABASE [db1];
GO

成功完成上述步骤后,可以看到创建了 ag1 可用性组,并且添加了三个 VM 作为副本,其中包含一个主要副本、一个次要副本和一个仅配置副本。 ag1 包含一个数据库。

部署 SQL Server 可用性组工作负载(HPE 群集管理器)

在 HPE Serviceguard 中,通过 Serviceguard 群集管理器 UI 在可用性组上部署 SQL Server 工作负载。

使用 Serviceguard 管理器图形用户界面,通过 Serviceguard 群集部署可用性组工作负载并启用高可用性 (HA)、灾难恢复 (DR)。 请参阅“保护 Always On 可用性组的 Linux 上的 Microsoft SQL Server”部分。

在 Azure 门户中创建负载均衡器

对于 Azure 云中的部署,适用于 Linux 的 HPE Serviceguard 需要一个负载均衡器来启用与主要副本的客户端连接,以替代传统的 IP 地址。

  1. 在 Azure 门户中,打开包含 Serviceguard 群集节点或虚拟机的资源组。

  2. 在资源组中,选择“添加”。

  3. 搜索“负载均衡器”,并在搜索结果中选择 Microsoft 发布的“负载均衡器”。

  4. 在“负载均衡器”窗格上,选择“创建”。

  5. 按如下所示配置负载均衡器:

    设置
    名称 负载均衡器名称。 例如,SQLAvailabilityGroupLB
    类型 内部
    SKU 基本或标准
    虚拟网络 用于 VM 副本的 VNet
    子网 托管 SQL Server 实例的子网
    IP 地址分配 静态
    专用 IP 地址 在子网中创建专用 IP
    订阅 选择相关订阅
    资源组 选择相关资源组
    位置 选择与 SQL 节点相同的位置

配置后端池

后端池是配置 Serviceguard 群集的两个实例的地址。

  1. 在你的资源组中,选择你创建的负载均衡器。
  2. 导航到“设置”>“后端池”,然后选择“添加”以创建后端地址池。
  3. 在“添加后端池”中的“名称”下,键入后端池的名称。
  4. 在“关联到”下,选择“虚拟机”。
  5. 选择环境中的虚拟机,并将相应的 IP 地址关联到所选的每个虚拟机。
  6. 选择 添加

创建探测

探测定义 Azure 如何验证哪个 Serviceguard 群集节点是主要副本。 Azure 根据创建探测时定义的端口上的 IP 地址来探测服务。

  1. 在负载均衡器的“设置”窗格上,选择“运行状况探测”。

  2. 在“运行状况探测”窗格上,选择“添加”。

  3. 使用以下值配置探测:

    设置
    名称 表示探测的名称。 例如,SQLAGPrimaryReplicaProbe
    协议 TCP
    端口 可以使用任何可用的端口。 例如 59999。
    时间间隔 5
    不正常阈值 2
  4. 选择“确定”。

  5. 登录到所有虚拟机,使用以下命令打开探测端口:

    sudo firewall-cmd --zone=public --add-port=59999/tcp --permanent
    sudo firewall-cmd --reload
    

Azure 创建探测,然后使用它来测试运行可用性组的主要副本实例的 Serviceguard 节点。 记住配置的端口 (59999),在 Serviceguard 群集中部署 AG 需要此端口。

设置负载均衡规则

负载均衡规则配置负载均衡器如何将流量路由到 Serviceguard 节点,该节点是群集中的主要副本。 对于此负载均衡器,请启用直接服务器返回,因为一次只有一个 Serviceguard 群集节点可以作为主要副本。

  1. 在负载均衡器的“设置”窗格上,选择“负载均衡规则”。

  2. 在“负载均衡规则”窗格上,选择“添加”。

  3. 使用以下设置配置负载均衡规则:

    设置
    名称 表示负载均衡规则的名称。 例如,SQLAGPrimaryReplicaListener
    协议 TCP
    端口 1433
    后端端口 1433。由于此规则使用浮动 IP,因此会忽略此值。
    探测 使用为此负载均衡器创建的探测的名称。
    会话暂留
    空闲超时(分钟) 4
    浮动 IP 已启用
  4. 选择“确定”。

  5. Azure 将配置负载均衡规则。 现在,负载均衡器配置为将流量路由到作为群集中主要副本实例的 Serviceguard 节点。

记下负载均衡器的前端 IP 地址“LbReadWriteIP”,在 Serviceguard 群集中部署 AG 需要此地址。

此时,资源组有一个连接到所有 Serviceguard 节点的负载均衡器。 负载均衡器还包含客户端用于连接到群集中的主要副本实例的 IP 地址,以便任何作为主要副本的计算机都可以响应针对可用性组的请求。

执行自动故障转移,并将节点加入回群集

对于自动故障转移测试,可以关闭主要副本(关闭电源),这可复制主节点突然不可用的情况。 预计的行为如下:

  1. 群集管理器会将可用性组中的其中一个次要副本提升为主要副本。
  2. 发生故障的主要副本在备份后会自动加入群集。 群集管理器会将其提升为次要副本。

对于 HPE Serviceguard,请参阅测试设置以实现故障转移就绪部分