配置故障转移群集实例 - 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 发起程序的更多信息,请访问以下链接:
选择将参与 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.ipaddress
iface.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; GO
sudo 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 了。