适用于: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 发起程序的更多信息,请访问以下链接:
选择将参与 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用户。将 iSCSI 逻辑卷装入 SQL Server 数据文件夹中。 如果成功,不会收到任何确认信息。
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 磁盘内容都由系统使用,例如用于 OS 磁盘的内容。
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 服务器呈现 iSCSI 目标。
生成服务器上卷组的列表。 列表中应会显示之前创建的卷组。
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 了。