通过


配置故障转移群集实例 - iSCSI - Linux 上的 SQL Server

适用于:SQL Server 的 Linux 上

本文介绍如何在 Linux 上为故障转移群集实例 (FCI) 配置 iSCSI 存储。

配置 iSCSI

iSCSI 使用网络将名为“目标”的服务器中的磁盘呈现给服务器。 要连接到 iSCSI 目标,服务器必须配置 iSCSI 发起程序。 目标上的磁盘具有显式权限,因此只有能够访问它们的发起程序才能执行此操作。 目标本身应该是高度可用和可靠的。

重要的 iSCSI 目标信息

虽然本部分不介绍如何配置 iSCSI 目标,因为此过程特定于要使用的源类型,但请确保已配置(群集节点将使用的)磁盘的安全性。

如果使用基于 Linux 的 iSCSI 目标,则不应在任何 FCI 节点上配置目标。 处于性能和可用性的考虑,应将 iSCSI 网络与源服务器和客户端服务器上常规网络流量所使用的网络分开。 用于 iSCSI 的网络速度应很快。 请记住,网络确实会消耗一些处理器带宽,所以如果使用的是常规服务器,请相应进行规划。

为了实现这一目标,最重要的是确保为创建的磁盘分配正确的权限,以便只有那些参与 FCI 的服务器才能访问它们。 在此处显示了来自Microsoft iSCSI目标设备的一个示例,其中linuxnodes1是创建的名称,在这种情况下,节点的IP地址被分配,以便NewFCIDisk1.vhdx对于它们可见。

linuxnodes1 的 iSCSI 目标属性对话框的屏幕截图,其中显示了“发起程序”选项卡,其中 IP 地址已分配给目标。

说明

本部分介绍如何在用作 FCI 节点的服务器上配置 iSCSI 发起程序。 此说明同样适用于 Red Hat Enterprise Linux (RHEL) 和 Ubuntu。

有关支持的发行版的 iSCSI 发起程序的更多信息,请访问以下链接:

注释

从 SQL Server 2025(17.x)开始,不支持 SUSE Linux Enterprise Server (SLES)。

  1. 选择将参与 FCI 配置的其中一个服务器。 无所谓哪个。 iSCSI 应位于专用网络上,因此请配置 iSCSI 以识别和使用该网络。 运行 sudo iscsiadm -m iface -I <iSCSIIfaceName> -o new,其中 <iSCSIIfaceName> 是网络的唯一或友好名称。 下面的示例使用 iSCSINIC

    sudo iscsiadm -m iface -I iSCSINIC -o new
    

    下面是预期的输出。

    New interface iSCSINIC added
    
  2. 编辑 /var/lib/iscsi/ifaces/iSCSIIfaceName。 确保已完整填写以下值:

    • iface.net_ifacename 是操作系统中显示的网卡名称。
    • iface.hwaddress 是将会为以下接口创建的唯一名称的 MAC 地址。
    • iface.ipaddress
    • iface.subnet_Mask

    请参阅以下示例:

    已完全填写值的文件截屏。

  3. 查找 iSCSI 目标。

    sudo iscsiadm -m discovery -t sendtargets -I <iSCSINetName> -p <TargetIPAddress>:<TargetPort>
    

    <iSCSINetName> 是网络的唯一/友好名称,<TargetIPAddress> 是 iSCSI 目标的 IP 地址,<TargetPort> 是 iSCSI 目标的端口。

    下面是预期的输出。

    10.181.182.1:3260,1 iqn.1991-05.com.contoso:dcl-linuxnodes1-target
    10.201.202.1:3260,1 iqn.1991-05.com.contoso:dc1-linuxnodes1-target
    [2002:b4b5:b601::b4b5:b601]:3260,1 iqn.1991-05.com.contoso:dcl-linuxnodes1-target
    [2002:8c9:ca01::c8c9:ca01]:3260,1 iqn.1991-05.com.contoso:dcl-linuxnodes1-target
    
  4. 登录到目标系统。

    sudo iscsiadm -m node -I <iSCSIIfaceName> -p TargetIPAddress -l
    

    <iSCSIIfaceName> 网络的唯一/友好名称,<TargetIPAddress> 是 iSCSI 目标的 IP 地址。

    下面是预期的输出。

    Logging in to [iface: iSCSINIC, target: ian.1991-05.com.contoso:dcl-linuxnodesl-tar get, portal: 10.181.182.1,3260] (multiple)
    Login to [iface: iSCSINIC, target: ian.1991-05.com.contoso:dcl-linuxnodesl-tar get, portal: 10.181.182.1,3260] successful.
    
  5. 检查是否存在与 iSCSI 目标的连接。

    sudo iscsiadm -m session
    

    输出与以下示例类似:

    tcp: [1] 10.105.16.7:3260,1 iqn.1991-05.com.contoso:dcl-linuxnodes1-target (non-flash)
    
  6. 检查 iSCSI 挂载的磁盘。

    sudo grep "Attached SCSI" /var/log/messages
    

    grep 命令及对该命令的响应的屏幕截图,其中显示了附加的 SCSI 磁盘。

  7. 在 iSCSI 磁盘上创建物理卷。

    sudo pvcreate /dev/<devicename>
    

    <devicename> 是上一步中设备的名称。

  8. 在 iSCSI 磁盘上创建卷组。 分配给单个卷组的磁盘被视为池或集合。

    sudo vgcreate <VolumeGroupName> /dev/devicename
    

    <VolumeGroupName> 是卷组的名称,<devicename> 是第 6 步中设备的名称。

  9. 创建并验证磁盘的逻辑卷。

    sudo lvcreate -Lsize -n <LogicalVolumeName> <VolumeGroupName>
    

    <size> 是要创建的卷的大小,可以以 G (GB)、T (TB) 等为单位指定。<LogicalVolumeName> 是逻辑卷的名称,<VolumeGroupName> 是上一步中卷组的名称。

    下面是预期的输出。

    Logical volume "FCIDataLV1" created.
    

    以下示例创建 25 GB 磁盘卷。

  10. 执行 sudo lvs 以查看创建的 LVM。

  11. 使用支持的文件系统格式化逻辑卷。 对于 ext4,请使用以下示例:

    sudo mkfs.ext4 /dev/<VolumeGroupName>/<LogicalVolumeName>
    

    <VolumeGroupName> 是上一步中卷组的名称。 <LogicalVolumeName> 是上一步中逻辑卷的名称。

  12. 对于系统数据库或存储在默认数据位置的任何内容,请执行以下步骤。 否则则,请跳至步骤 13。

    1. 确保正在处理的服务器上停止SQL Server。

      sudo systemctl stop mssql-server
      sudo systemctl status mssql-server
      
    2. 彻底切换为超级用户。 如果成功,不会收到任何确认信息。

      sudo -i
      
    3. 切换到 mssql 用户。 如果成功,不会收到任何确认信息。

      su mssql
      
    4. 创建一个临时目录来存储SQL Server数据和日志文件。 如果成功,不会收到任何确认信息。

      mkdir <TempDir>
      

      <TempDir> 是文件夹的名称。 以下示例创建名为 /var/opt/mssql/TempDir 的文件夹。

      mkdir /var/opt/mssql/TempDir
      
    5. 将SQL Server数据和日志文件复制到临时目录。 如果成功,不会收到任何确认信息。

      cp /var/opt/mssql/data/* <TempDir>
      

      <TempDir> 是上一步中的文件夹的名称。

    6. 验证文件是否位于目录中。

      ls <TempDir>
      

      <TempDir> 是之前几步中的文件夹的名称。

    7. 从现有SQL Server数据目录中删除文件。 如果成功,不会收到任何确认信息。

      rm - f /var/opt/mssql/data/*
      
    8. 验证文件是否已删除。 下图显示了从 c 到 h 的整个序列的示例。

      ls /var/opt/mssql/data
      

      ls 命令及对该命令的响应的屏幕截图。

    9. 键入 exit 切换回root用户。

    10. 在SQL Server数据文件夹中装载 iSCSI 逻辑卷。 如果成功,不会收到任何确认信息。

      mount /dev/<VolumeGroupName>/<LogicalVolumeName> /var/opt/mssql/data
      

      <VolumeGroupName> 是卷组的名称,<LogicalVolumeName> 是已创建的逻辑卷的名称。 以下示例命令语法与前一个命令中的卷组和逻辑卷对应。

      mount /dev/FCIDataVG1/FCIDataLV1 /var/opt/mssql/data
      
    11. 将装载的所有者更改为 mssql。 如果成功,不会收到任何确认信息。

      chown mssql /var/opt/mssql/data
      
    12. 将挂载组的所有权更改为 mssql。 如果成功,不会收到任何确认信息。

      chgrp mssql /var/opt/mssql/data
      
    13. 切换到 mssql 用户。 如果成功,不会收到任何确认信息。

      su mssql
      
    14. 从临时目录 /var/opt/mssql/data 复制文件。 如果成功,不会收到任何确认信息。

      cp /var/opt/mssql/TempDir/* /var/opt/mssql/data
      
    15. 验证文件是否在那里。

      ls /var/opt/mssql/data
      
    16. 输入 exit 而不是 mssql

    17. 输入 exit 而不是 root

    18. 开始SQL Server。 如果已正确复制所有内容并正确应用安全性,SQL Server应显示为“已启动”。

      sudo systemctl start mssql-server
      sudo systemctl status mssql-server
      
    19. 停止SQL Server并验证它是否已关闭。

      sudo systemctl stop mssql-server
      sudo systemctl status mssql-server
      
  13. 对于系统数据库以外的其他内容,例如用户数据库或备份,请按照以下步骤操作。 如果仅使用默认位置,请跳至步骤 14。

    1. 切换为超级用户。 如果成功,不会收到任何确认信息。

      sudo -i
      
    2. 创建SQL Server要使用的文件夹。

      mkdir <FolderName>
      

      <FolderName> 是文件夹的名称。 如果文件夹不在正确的位置,需要指定文件夹的完整路径。 以下示例将创建名为 /var/opt/mssql/userdata 的文件夹。

      mkdir /var/opt/mssql/userdata
      
    3. 将 iSCSI 逻辑卷装载到上一步中创建的文件夹中。 如果成功,不会收到任何确认信息。

      mount /dev/<VolumeGroupName>/<LogicalVolumeName> <FolderName>
      

      <VolumeGroupName> 是卷组的名称,<LogicalVolumeName> 是已创建的逻辑卷的名称,<FolderName> 是文件夹的名称。 示例语法如下所示。

      mount /dev/FCIDataVG2/FCIDataLV2 /var/opt/mssql/userdata
      
    4. 将创建的文件夹的所有权更改为 mssql。 如果成功,不会收到任何确认信息。

      chown mssql <FolderName>
      

      <FolderName> 是已创建的文件夹的名称。 此处显示了一个示例。

      chown mssql /var/opt/mssql/userdata
      
    5. 将创建的文件夹组更改为 mssql。 如果成功,不会收到任何确认信息。

      chown mssql <FolderName>
      

      <FolderName> 是已创建的文件夹的名称。 此处显示了一个示例。

      chown mssql /var/opt/mssql/userdata
      
    6. 键入 exit 以退出超级用户身份。

    7. 若要进行测试,请在该文件夹中创建数据库。 以下脚本创建一个数据库,将上下文切换到它,验证文件是否存在于操作系统级别,然后删除临时位置。 可以使用 SSMS 或 sqlcmd 来运行此脚本。

      DROP DATABASE TestDB;
      GO
      
      CREATE DATABASE TestDB
          ON (NAME = TestDB_Data, FILENAME = '/var/opt/mssql/userdata/TestDB_Data.mdf')
          LOG ON (NAME = TestDB_Log, FILENAME = '/var/opt/mssql/userdata/TestDB_Log.ldf');
      GO
      
      USE TestDB;
      GO
      

      在 shell 中运行以下命令来查看新的数据库文件。

      sudo ls /var/opt/mssal/userdata
      

      下面是预期的输出。

      lost+found TestDB_Data.mdf
      TestDB_Log.ldf
      

      删除要清理的数据库。

      DROP DATABASE TestDB;
      GO
      
      sudo ls /var/opt/mssal/userdata
      

      下面是预期的输出。

      lost+found
      
    8. 解除挂载共享

      sudo umount /dev/<VolumeGroupName>/<LogicalVolumeName> <FolderName>
      

      <VolumeGroupName> 是卷组的名称,<LogicalVolumeName> 是已创建的逻辑卷的名称,<FolderName> 是文件夹的名称。 示例语法如下所示。

      sudo umount /dev/FCIDataVG2/FCIDataLV2 /var/opt/mssql/userdata
      
  14. 配置服务器,以便只有 Pacemaker 可以激活卷组。

    sudo lvmconf --enable-halvm --services -startstopservices
    
  15. 生成服务器上的卷组列表。 列出的任何不是 iSCSI 磁盘的都被系统使用,例如用作操作系统磁盘。

    sudo vgs
    
  16. 修改文件 /etc/lvm/lvm.conf 的激活配置部分。 配置下列行:

    volume_list = [ <ListOfVGsNotUsedByPacemaker> ]
    

    <ListOfVGsNotUsedByPacemaker> 是步骤 20 的输出中 FCI 不使用的卷组的列表。 将每一个括在引号中并用逗号分隔。 此处显示了一个示例。

    显示 volume_list 值的示例的屏幕截图。

  17. 当 Linux 启动时,它装载文件系统。 要确保只有 Pacemaker 可以装入 iSCSI 磁盘,请重新生成根文件系统映像。

    运行以下命令,可能需要一些时间才能完成。 若操作成功,将不会收到消息。

    sudo dracut -H -f /boot/initramfs-$(uname -r).img $(uname -r)
    
  18. 重新启动服务器。

  19. 在将参与 FCI 的另一台服务器上,执行步骤 1 - 6。 这会将 iSCSI 目标呈现到SQL Server。

  20. 生成服务器上卷组信息的列表。 应显示之前创建的卷组。

    sudo vgs
    
  21. 启动SQL Server并验证是否可以在此服务器上启动。

    sudo systemctl start mssql-server
    sudo systemctl status mssql-server
    
  22. 停止SQL Server并验证它是否已关闭。

    sudo systemctl stop mssql-server
    sudo systemctl status mssql-server
    
  23. 在将参与 FCI 的任何其他服务器上重复步骤 1 - 6。

现在可以配置 FCI 了。