配置故障转移群集实例 - 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

发起程序的屏幕截图。

说明

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

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

  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. 将 iSCSI 逻辑卷装入 SQL Server 数据文件夹中。 如果成功,不会收到任何确认信息。

      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 磁盘内容都由系统使用,例如用于 OS 磁盘的内容。

    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 服务器呈现 iSCSI 目标。

  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 了。