在 适用于: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 发起程序的更多信息,请访问以下链接:
注释
从 SQL Server 2025(17.x)开始,不支持 SUSE Linux Enterprise Server (SLES)。
选择将参与 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编辑
/var/lib/iscsi/ifaces/iSCSIIfaceName。 确保已完整填写以下值:-
iface.net_ifacename是操作系统中显示的网卡名称。 -
iface.hwaddress是将会为以下接口创建的唯一名称的 MAC 地址。 iface.ipaddressiface.subnet_Mask
请参阅以下示例:
-
查找 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登录到目标系统。
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.检查是否存在与 iSCSI 目标的连接。
sudo iscsiadm -m session输出与以下示例类似:
tcp: [1] 10.105.16.7:3260,1 iqn.1991-05.com.contoso:dcl-linuxnodes1-target (non-flash)检查 iSCSI 挂载的磁盘。
sudo grep "Attached SCSI" /var/log/messages
在 iSCSI 磁盘上创建物理卷。
sudo pvcreate /dev/<devicename><devicename>是上一步中设备的名称。在 iSCSI 磁盘上创建卷组。 分配给单个卷组的磁盘被视为池或集合。
sudo vgcreate <VolumeGroupName> /dev/devicename<VolumeGroupName>是卷组的名称,<devicename>是第 6 步中设备的名称。创建并验证磁盘的逻辑卷。
sudo lvcreate -Lsize -n <LogicalVolumeName> <VolumeGroupName><size>是要创建的卷的大小,可以以 G (GB)、T (TB) 等为单位指定。<LogicalVolumeName>是逻辑卷的名称,<VolumeGroupName>是上一步中卷组的名称。下面是预期的输出。
Logical volume "FCIDataLV1" created.以下示例创建 25 GB 磁盘卷。
执行
sudo lvs以查看创建的 LVM。使用支持的文件系统格式化逻辑卷。 对于 ext4,请使用以下示例:
sudo mkfs.ext4 /dev/<VolumeGroupName>/<LogicalVolumeName><VolumeGroupName>是上一步中卷组的名称。<LogicalVolumeName>是上一步中逻辑卷的名称。对于系统数据库或存储在默认数据位置的任何内容,请执行以下步骤。 否则则,请跳至步骤 13。
确保正在处理的服务器上停止SQL Server。
sudo systemctl stop mssql-server sudo systemctl status mssql-server彻底切换为超级用户。 如果成功,不会收到任何确认信息。
sudo -i切换到
mssql用户。 如果成功,不会收到任何确认信息。su mssql创建一个临时目录来存储SQL Server数据和日志文件。 如果成功,不会收到任何确认信息。
mkdir <TempDir><TempDir>是文件夹的名称。 以下示例创建名为 /var/opt/mssql/TempDir 的文件夹。mkdir /var/opt/mssql/TempDir将SQL Server数据和日志文件复制到临时目录。 如果成功,不会收到任何确认信息。
cp /var/opt/mssql/data/* <TempDir><TempDir>是上一步中的文件夹的名称。验证文件是否位于目录中。
ls <TempDir><TempDir>是之前几步中的文件夹的名称。从现有SQL Server数据目录中删除文件。 如果成功,不会收到任何确认信息。
rm - f /var/opt/mssql/data/*验证文件是否已删除。 下图显示了从 c 到 h 的整个序列的示例。
ls /var/opt/mssql/data键入
exit切换回root用户。在SQL Server数据文件夹中装载 iSCSI 逻辑卷。 如果成功,不会收到任何确认信息。
mount /dev/<VolumeGroupName>/<LogicalVolumeName> /var/opt/mssql/data<VolumeGroupName>是卷组的名称,<LogicalVolumeName>是已创建的逻辑卷的名称。 以下示例命令语法与前一个命令中的卷组和逻辑卷对应。mount /dev/FCIDataVG1/FCIDataLV1 /var/opt/mssql/data将装载的所有者更改为
mssql。 如果成功,不会收到任何确认信息。chown mssql /var/opt/mssql/data将挂载组的所有权更改为
mssql。 如果成功,不会收到任何确认信息。chgrp mssql /var/opt/mssql/data切换到
mssql用户。 如果成功,不会收到任何确认信息。su mssql从临时目录
/var/opt/mssql/data复制文件。 如果成功,不会收到任何确认信息。cp /var/opt/mssql/TempDir/* /var/opt/mssql/data验证文件是否在那里。
ls /var/opt/mssql/data输入
exit而不是mssql。输入
exit而不是root。开始SQL Server。 如果已正确复制所有内容并正确应用安全性,SQL Server应显示为“已启动”。
sudo systemctl start mssql-server sudo systemctl status mssql-server停止SQL Server并验证它是否已关闭。
sudo systemctl stop mssql-server sudo systemctl status mssql-server
对于系统数据库以外的其他内容,例如用户数据库或备份,请按照以下步骤操作。 如果仅使用默认位置,请跳至步骤 14。
切换为超级用户。 如果成功,不会收到任何确认信息。
sudo -i创建SQL Server要使用的文件夹。
mkdir <FolderName><FolderName>是文件夹的名称。 如果文件夹不在正确的位置,需要指定文件夹的完整路径。 以下示例将创建名为 /var/opt/mssql/userdata 的文件夹。mkdir /var/opt/mssql/userdata将 iSCSI 逻辑卷装载到上一步中创建的文件夹中。 如果成功,不会收到任何确认信息。
mount /dev/<VolumeGroupName>/<LogicalVolumeName> <FolderName><VolumeGroupName>是卷组的名称,<LogicalVolumeName>是已创建的逻辑卷的名称,<FolderName>是文件夹的名称。 示例语法如下所示。mount /dev/FCIDataVG2/FCIDataLV2 /var/opt/mssql/userdata将创建的文件夹的所有权更改为
mssql。 如果成功,不会收到任何确认信息。chown mssql <FolderName><FolderName>是已创建的文件夹的名称。 此处显示了一个示例。chown mssql /var/opt/mssql/userdata将创建的文件夹组更改为
mssql。 如果成功,不会收到任何确认信息。chown mssql <FolderName><FolderName>是已创建的文件夹的名称。 此处显示了一个示例。chown mssql /var/opt/mssql/userdata键入
exit以退出超级用户身份。若要进行测试,请在该文件夹中创建数据库。 以下脚本创建一个数据库,将上下文切换到它,验证文件是否存在于操作系统级别,然后删除临时位置。 可以使用 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; GOsudo ls /var/opt/mssal/userdata下面是预期的输出。
lost+found解除挂载共享
sudo umount /dev/<VolumeGroupName>/<LogicalVolumeName> <FolderName><VolumeGroupName>是卷组的名称,<LogicalVolumeName>是已创建的逻辑卷的名称,<FolderName>是文件夹的名称。 示例语法如下所示。sudo umount /dev/FCIDataVG2/FCIDataLV2 /var/opt/mssql/userdata
配置服务器,以便只有 Pacemaker 可以激活卷组。
sudo lvmconf --enable-halvm --services -startstopservices生成服务器上的卷组列表。 列出的任何不是 iSCSI 磁盘的都被系统使用,例如用作操作系统磁盘。
sudo vgs修改文件 /etc/lvm/lvm.conf 的激活配置部分。 配置下列行:
volume_list = [ <ListOfVGsNotUsedByPacemaker> ]<ListOfVGsNotUsedByPacemaker>是步骤 20 的输出中 FCI 不使用的卷组的列表。 将每一个括在引号中并用逗号分隔。 此处显示了一个示例。当 Linux 启动时,它装载文件系统。 要确保只有 Pacemaker 可以装入 iSCSI 磁盘,请重新生成根文件系统映像。
运行以下命令,可能需要一些时间才能完成。 若操作成功,将不会收到消息。
sudo dracut -H -f /boot/initramfs-$(uname -r).img $(uname -r)重新启动服务器。
在将参与 FCI 的另一台服务器上,执行步骤 1 - 6。 这会将 iSCSI 目标呈现到SQL Server。
生成服务器上卷组信息的列表。 应显示之前创建的卷组。
sudo vgs启动SQL Server并验证是否可以在此服务器上启动。
sudo systemctl start mssql-server sudo systemctl status mssql-server停止SQL Server并验证它是否已关闭。
sudo systemctl stop mssql-server sudo systemctl status mssql-server在将参与 FCI 的任何其他服务器上重复步骤 1 - 6。
现在可以配置 FCI 了。