在Linux(RHEL)上配置故障转移集群实例

适用于:Linux 上的 SQL Server

SQL Server 双节点共享磁盘故障转移群集实例为实现高可用性提供服务器级别的冗余。 本教程介绍如何创建 Linux 上的 SQL Server 的双节点故障转移群集实例。 你将完成的特定步骤包括:

  • 设置和配置 Linux
  • 安装和配置 SQL Server
  • 配置 hosts 文件
  • 配置共享存储并移动数据库文件
  • 在每个群集节点上安装和配置 Pacemaker
  • 配置故障转移群集实例

本文介绍如何为 SQL Server 创建双节点共享磁盘故障转移群集实例 (FCI)。 本文提供 Red Hat Enterprise Linux (RHEL) 的说明和脚本示例。 Ubuntu 分发版与 RHEL 相似,因此脚本示例通常也适用于 Ubuntu。

有关概念性信息,请参见 Linux上的故障转移集群实例

先决条件

若要完成接下来的端到端方案,需要两台计算机来部署双节点群集,还需要一台服务器进行存储。 以下步骤概述了如何配置这些服务器。

设置和配置 Linux

第一步是在群集节点上配置操作系统。 在集群的每个节点上,配置一个Linux发行版。 在两个节点上使用相同的分发版和版本。 请从以下分发版中选择其一:

  • 具有适用于 HA 加载项的有效订阅的 RHEL

安装和配置 SQL Server

  1. 在两个节点上安装和设置 SQL Server。 有关详细说明,请参阅 Linux 上的 SQL Server 的安装指南

  2. 出于配置目的,请将一个节点指定为主节点,而将另一个指定为辅助节点。 请在本指南中使用以下术语。

  3. 在辅助节点上,停止并禁用 SQL Server。 以下示例会停止并禁用 SQL Server:

    sudo systemctl stop mssql-server
    sudo systemctl disable mssql-server
    

    Note

    在设置时,将为 SQL Server 实例生成一个服务器主密钥并放置在 var/opt/mssql/secrets/machine-key。 在 Linux 上,SQL Server 始终以名为 mssql 的本地帐户身份运行。 因为它是本地帐户,所以其标识不会在节点之间共享。 因此,需要将加密密钥从主节点复制到每个辅助节点,以便每个本地 mssql 帐户均可访问它,从而解密服务器主密钥。

  4. 在主节点上,为 Pacemaker 创建 SQL Server 登录名并授予登录权限以运行 sp_server_diagnostics。 Pacemaker 使用此帐户验证正在运行 SQL Server 的节点。

    sudo systemctl start mssql-server
    

    使用 master 帐户连接到 SQL Server sa 数据库并运行以下命令:

    USE master;
    GO
    
    CREATE LOGIN [<loginName>]
        WITH PASSWORD = N'<password>';
    
    ALTER SERVER ROLE [sysadmin] ADD MEMBER [<loginName>];
    

    注意

    密码应遵循 SQL Server 默认密码策略。 默认情况下,密码必须为至少八个字符且包含以下四种字符中的三种:大写字母、小写字母、十进制数字、符号。 密码可最长为 128 个字符。 使用的密码应尽可能长,尽可能复杂。

    此外,也可以在更精细的级别设置权限。 Pacemaker 登录需要VIEW SERVER STATE使用 sp_server_diagnosticsALTER ANY LINKED SERVER查询运行状况,并通过运行sp_dropserversp_addserver将 FCI 实例名称更新为资源名称。

  5. 在主节点上,停止并禁用 SQL Server。

配置 hosts 文件

在每个群集节点上,配置主机文件。 “主机”文件必须包含每个群集节点的 IP 地址和名称。

  1. 检查每个节点的 IP 地址。 以下脚本显示当前节点的 IP 地址。

    sudo ip addr show
    
  2. 在每个节点上设置计算机名。 为每个节点提供长度不超过 15 个字符的唯一名称。 通过将计算机名添加到 /etc/hosts 来设置该名称。 以下脚本可使用 /etc/hosts 编辑 vi

    sudo vi /etc/hosts
    

    以下示例显示了 /etc/hosts 以及名为 sqlfcivm1sqlfcivm2 的两个节点。

    127.0.0.1        localhost localhost4 localhost4.localdomain4
    ::1              localhost localhost6 localhost6.localdomain6
    10.128.18.128    sqlfcivm1
    10.128.16.77     sqlfcivm2
    

配置存储并移动数据库文件

需要提供两个节点都可以访问的存储。 可以使用 iSCSI、NFS 或 SMB。 配置存储,将存储提供给群集节点,然后将数据库文件移到新存储。 以下文章介绍了每种存储类型的步骤:

在每个群集节点上安装和配置 Pacemaker

  1. 在两个群集节点上,创建一个文件来存储用于 Pacemaker 登录的 SQL Server 用户名和密码。

    以下命令创建并填充此文件:

    sudo touch /var/opt/mssql/secrets/passwd
    echo '<loginName>' | sudo tee -a /var/opt/mssql/secrets/passwd
    echo '<loginPassword>' | sudo tee -a /var/opt/mssql/secrets/passwd
    sudo chown root:root /var/opt/mssql/secrets/passwd
    sudo chmod 600 /var/opt/mssql/secrets/passwd
    
  2. 在两个群集节点上,打开 Pacemaker 防火墙端口。 若要使用 firewalld 打开这些端口,请运行以下命令:

    sudo firewall-cmd --permanent --add-service=high-availability
    sudo firewall-cmd --reload
    

    如果你使用的是没有内置高可用性配置的防火墙,请为Pacemaker打开以下端口,以便与集群中的其他节点通信:

    • TCP:端口 2224、3121、21064
    • UDP:端口 5405
  3. 在每个节点上安装 Pacemaker 包。

    sudo yum install pacemaker pcs fence-agents-all resource-agents
    
  4. 为安装 Pacemaker 和 Corosync 包时创建的默认用户设置密码。 在两个节点上使用相同的密码。

    sudo passwd hacluster
    
  5. 启用并启动 pcsd 服务和 Pacemaker 服务。 这样,节点将可以在重新启动后重新加入群集。 在这两个节点上运行以下命令。

    sudo systemctl enable pcsd
    sudo systemctl start pcsd
    sudo systemctl enable pacemaker
    
  6. 为 SQL Server 安装 FCI 资源代理。 在这两个节点上运行以下命令。

    sudo yum install mssql-server-ha
    

配置隔离代理

STONITH 设备提供隔离机制。 对于生产集群,你必须配置隔离代理。 关于如何在 Azure 中创建 STONITH 设备的示例,请参见《在 Azure 中设置 Red Hat Enterprise Linux 上的 Pacemaker》。 修改适用于您环境的说明。

配置故障转移群集实例

将在资源组中创建 FCI。 这稍微简单一点,因为资源组减少了对约束的需求。 不过,请按照资源应启动的顺序将其添加到资源组中。 它们应启动的顺序是:

  1. 存储资源
  2. 网络资源
  3. 应用程序资源

此示例在 NewLinFCIGrp 组中创建一个 FCI。 资源组的名称不能与 Pacemaker 中创建的任何资源重名。

  1. 创建磁盘资源。 如果没有问题,你不会收到答复。 创建磁盘资源的方式取决于存储类型。 以下章节介绍了每种存储类型(iSCSI、NFS 和 SMB)的示例。 使用适用于群集存储的存储类型的示例。

    sudo pcs resource create <iSCSIDiskResourceName> Filesystem device="/dev/<VolumeGroupName>/<LogicalVolumeName>" directory="<FolderToMountiSCSIDisk>" fstype="<FileSystemType>" --group RGName
    
    • <iSCSIDIskResourceName> 是与 iSCSI 磁盘关联的资源的名称
    • <VolumeGroupName> 是卷组的名称
    • <LogicalVolumeName> 是创建的逻辑卷的名称
    • <FolderToMountiSCSIDIsk> 是要装入磁盘的文件夹(对于系统数据库和默认位置,它是 /var/opt/mssql/data
    • <FileSystemType> 将是 ext4 或 XFS,具体取决于设置格式和分发支持的方式。

  1. 创建 FCI 将使用的 IP 地址。 如果没有问题,你不会收到答复。

    sudo pcs resource create <IPResourceName> ocf:heartbeat:IPaddr2 ip=<IPAddress> nic=<NetworkCard> cidr_netmask=<NetMask> --group <RGName>
    
    • <IPResourceName> 是与 IP 地址关联的资源的名称
    • <IPAddress> 是 FCI 的 IP 地址
    • <NetworkCard> 是与子网(即 eth0)关联的网卡
    • <NetMask> 是子网的网络掩码(即 24)
    • <RGName> 是资源组的名称
  2. 创建 FCI 资源。 如果没有问题,你不会收到答复。

    sudo pcs resource create FCIResourceName ocf:mssql:fci op defaults timeout=60s --group RGName
    
    • <FCIResourceName> 不仅是资源的名称,也是与 FCI 关联的友好名称。 这就是用户和应用程序用于连接的内容。
    • <RGName> 是资源组的名称。
  3. 运行 sudo pcs resource 命令。 FCI 应处于在线状态。

  4. 使用 FCI 的 DNS/资源名称,通过 SSMS 或 sqlcmd 连接到 FCI。

  5. 发出语句 SELECT @@SERVERNAME。 它应返回 FCI 的名称。

  6. 发出语句 SELECT SERVERPROPERTY('ComputerNamePhysicalNetBIOS')。 它应返回 FCI 运行的节点的名称。

  7. 手动将 FCI 故障转移到其他节点。 请参见 “在 Linux 上操作故障切换集群实例”下的说明。

  8. 最后,将 FCI 故障转移回原始节点移除场地租用约束。

Summary

在本教程中,已完成以下任务:

  • 设置和配置 Linux
  • 安装和配置 SQL Server
  • 配置 hosts 文件
  • 配置共享存储并移动数据库文件
  • 在每个群集节点上安装和配置 Pacemaker
  • 配置故障转移群集实例