iSCSI 服务器

iSCSI 服务器

iSCSI 服务介绍

SCSI(Small Computer System Interface,小型计算机系统接口),一种用于计算机和智能设备之间(硬盘、软驱、光驱、打印机、扫描仪等)连接标准。

iSCSI (Internet Small Computer System Interface,Internet 小型计算机系统接口),又称为IP-SAN,是IBM公司研究开发的IP SAN技术,该技术是将现有SCSI接口与以太网络(Ethernet)技术结合,基于TCP/IP的协议连接iSCSI服务端(Target)和客户端(Initiator),使得封装后的SCSI数据包可以在互联网传输,最终实现iSCSI服务端提供存储给客户端。

通常,iSCSI使用专用的10 Gb以太网或更好的网络,以最大程度地提高性能。

从物理服务器到存储的电缆通常封闭在数据中心内,并且理想情况下不直接连接到LAN网络,所以SAN流量通常不加密,以最大程度地提高性能。 为了实现WAN安全,iSCSI管理员可以使用IPsec加密流量。

iSCSI 架构

iSCSI服务是C/S架构。访问的iSCSI目标在客户端系统上显示为本地且未格式化的SCSI快设备,等同于通过SCSI布线、FC直连或FC交换光线连接的设备。

  • Initiator ,iSCSI客户端,通常以软件方式部署,也可以使用iSCSI Host Bus Adapters (HBAs) (HBA)硬件。 Initiator必须具有唯一的名称(请参见IQN)。

  • Target,iSCSI服务器上的iSCSI存储资源。 Target必须具有唯一的名称(请参见IQN)。 每个目标都提供一个或多个块设备或逻辑单元(LUN-logical units)。 在大多数情况下,Target只提供一个设备,但一台服务器可以提供多个目标。

  • IQN(iSCSI Qualified Name)全球唯一的名称,用于标识发起者和目标。 IQN具有以下格式:

    bash 复制代码
    iqn.YYYY-MM.com.reversed.domain:name_string
    • YYYY-MM ,年和月。示例,2020年6月为2020-06。该日期有助于确保IQN唯一性。
    • com.reversed.domain ,反向域名。 例如,server.redhat.fun的反向域名为cloud.shizhan.www
    • name_string,用于标识您管理的特定目标。 如果服务器只具有一个目标,则有时会省略此名称。
  • Portal,指定服务器监听的地址和端口,例如,172.25.250.50:3260。

  • LUN (Logical Unit Number),代表Target 提供的块设备。 每个目标可以提供一个或多个LUN

  • ACL (Access Control List),使用InitiatorIQN 限制客户端访问Target

  • TPG (Target Portal Group),是目标的完整配置,包括PortalLUNACL 。 几乎所有目标都使用一个TPG ,但是高级配置有时可能会定义多个TPG

  • discovery ,查询服务器上有Target列表。

  • login ,向Target 验证,验证通过后即可以使用Target服务器提供的块设备。

配置 iSCSI Targets

配置 iSCSI Targets需要安装以下软件:

  • targetd,服务端软件。
  • targetcli,targetd服务配置工具。
bash 复制代码
# 安装软件
[root@storage ~ 13:40:31]# yum install -y targetcli targetd

# 启用并启动服务
[root@server ~]# systemctl enable target --now 

# 配置防火墙
[root@server ~]# firewall-cmd --permanent --add-service=iscsi-target
[root@server ~]# firewall-cmd --reload

当您不带任何选项运行targetcli时,该命令将进入交互模式。

在以下示例中,使用ls命令显示当前布局。

bash 复制代码
[root@server ~]# targetcli
targetcli shell version 2.1.fb49
Copyright 2011-2013 by Datera, Inc and others.
For help on commands, type 'help'.
/> ls
o- / ................................................................. [...]
o- backstores ...................................................... [...]
| o- block .......................................... [Storage Objects: 0]
| o- fileio ......................................... [Storage Objects: 0]
| o- pscsi .......................................... [Storage Objects: 0]
| o- ramdisk ........................................ [Storage Objects: 0]
o- iscsi .................................................... [Targets: 0]
o- loopback ................................................. [Targets: 0]
/>

配置 backstore 对象

backstore类型:

  • block:服务器中的块设备,例如磁盘驱动器,磁盘分区或逻辑卷。
  • fileio:本地文件系统中的常规文件。targetcli将该文件用作磁盘映像。
  • pscsi:物理SCSI设备。 这种类型的存储允许客户端通过网络访问服务器上的物理SCSI设备。
  • ramdisk:内存中的磁盘设备。 这种类型的存储不会持久存储数据。 服务器重新启动后,数据将丢失。

要使用targetcli创建后备存储,请使用其create命令。 该命令的行为取决于您在配置树中的当前位置。

示例:

bash 复制代码
/iscsi> cd /backstores/block
/backstores/block> create webapp01 /dev/webapp/webapp01 
Created block storage object webapp01 using /dev/webapp/webapp01.

等同于

bash 复制代码
/> /backstores/block create myblock1 /dev/sdb
Created block storage object myblock1 using /dev/sdb.

配置 Target IQN

在/iscsi伪目录中,创建IQN,将您选择的IQN名称作为其第一个参数。

bash 复制代码
/> cd /iscsi
/iscsi> create iqn.2024-12.cloud.shizhan.server:disk1
Created target iqn.2024-12.cloud.shizhan.server:disk1.
Created TPG 1.
Global pref auto_add_default_portal=true
Created default portal listening on all IPs (0.0.0.0), port 3260.
/iscsi> ls
o- iscsi ...................................................... [Targets: 1]
  o- iqn.2024-12.cloud.shizhan.server:disk1 ............................... [TPGs: 1]
    o- tpg1 ......................................... [no-gen-acls, no-auth]
      o- acls .................................................... [ACLs: 0]
      o- luns .................................................... [LUNs: 0]
      o- portals .............................................. [Portals: 1]
        o- 0.0.0.0:3260 ............................................... [OK]

配置 LUN

bash 复制代码
/> cd /iscsi/iqn.2024-12.cloud.shizhan.server:disk1/tpg1/luns
/iscsi/iqn.20...sk1/tpg1/luns> create /backstores/block/myblock1
Created LUN 0.

配置 ACL

创建ACL,以允许客户端启动程序访问目标。在Red Hat Enterprise Linux上,启动器的IQN存储在/etc/iscsi/initiatorname.iscsi文件中。

bash 复制代码
/> cd /iscsi/iqn.2024-12.cloud.shizhan.server:disk1/tpg1/acls
/iscsi/iqn.20...sk1/tpg1/acls> create iqn.2024-12.cloud.shizhan.client
Created Node ACL for iqn.2024-12.cloud.shizhan.client
Created mapped LUN 0.

配置 Portal

bash 复制代码
/> cd /iscsi/iqn.2024-12.cloud.shizhan.server:disk1/tpg1/portals/
/iscsi/iqn.20.../tpg1/portals> delete 0.0.0.0 3260
Deleted network portal 0.0.0.0:3260
/iscsi/iqn.20.../tpg1/portals> create 10.1.8.10 3260
Using default IP port 3260
Created network portal 10.1.8.10:3260.

保存配置

退出targetcli shell时,该命令将配置保存在/etc/target/saveconfig.json文件中。

bash 复制代码
/> exit
Global pref auto_save_on_exit=true
Configuration saved to /etc/target/saveconfig.json

非交互式管理 Targets

bash 复制代码
[root@server ~]# targetcli /backstores/block create myblock1 /dev/sdb
Created block storage object myblock1 using /dev/sdb.

[root@server ~]# targetcli /iscsi create iqn.2024-12.cloud.shizhan.server:disk1
Created target iqn.2024-12.cloud.shizhan.server:disk1.
Created TPG 1.
Global pref auto_add_default_portal=true
Created default portal listening on all IPs (0.0.0.0), port 3260.

[root@server ~]# targetcli /iscsi/iqn.2024-12.cloud.shizhan.server:disk1/tpg1/luns \
> create /backstores/block/myblock1
Created LUN 0.

[root@server ~]# targetcli /iscsi/iqn.2024-12.cloud.shizhan.server:disk1/tpg1/acls \
> create iqn.2024-12.cloud.shizhan.client
Created Node ACL for iqn.2024-12.cloud.shizhan.client
Created mapped LUN 0.

[root@server ~]# targetcli /iscsi/iqn.2024-12.cloud.shizhan.server:disk1/tpg1/portals \
> delete 0.0.0.0 3260
Deleted network portal 0.0.0.0:3260

[root@server ~]# targetcli /iscsi/iqn.2024-12.cloud.shizhan.server:disk1/tpg1/portals \
> create 10.1.8.10 3260
Using default IP port 3260
Created network portal 172.25.250.10:3260.

[root@server ~]# targetcli saveconfig
Configuration saved to /etc/target/saveconfig.json

提示:与交互式使用targetcli不同,命令行模式必须显式运行saveconfig子命令以保存配置。

访问 iSCSI 存储

iSCSI 启动器通常以软件方式实现。 使用基于软件的iSCSI启动器需要连接到具有足够带宽的现有以太网网络,以承载存储流量。

您也可以使用硬件启动器-主机总线适配器(HBA),从而减轻了其他系统资源的负担。

准备系统

配置iSCSI客户端启动程序需要安装iscsi-initiator-utils 软件包,该软件包包括iscsiiscsid 服务以及**/etc/iscsi/iscsid.conf/etc/iscsi/initiatorname.iscsi**配置文件。

bash 复制代码
[root@client ~]# yum install -y iscsi-initiator-utils

作为iSCSI启动器,客户端需要其自己的唯一iSCSI合格名称(IQN)。在安装iscsi-initiator-utils的过程中,该软件包生成唯一的IQN,并存储到/etc/iscsi/initiatorname.iscsi文件中。 管理员通常需要更改该名称。

bash 复制代码
[root@client ~]# vim /etc/iscsi/initiatorname.iscsi
InitiatorName=iqn.2024-12.cloud.shizhan.client

/etc/iscsi/iscsid.conf文件包含您连接的目标的默认设置。 这些设置包括iSCSI超时,重试以及用于身份验证的用户名和密码参数。

软件包安装会自动配置iscsid服务,以便启动器在系统启动时自动重新连接到任何已发现的目标。 每当您修改启动程序的配置文件时,请重新启动iscsid服务。

连接 iSCSI 目标

在使用远程设备之前,首先需要发现目标。 发现过程使用/etc/iscsi/iscsid.conf中的配置将目标信息和设置存储在/var/lib/iscsi/nodes/目录中。

您可以使用以下命令执行远程目标的发现:

bash 复制代码
[root@client ~]# iscsiadm -m discovery -t st -p portal_ip[:port]

参数说明:

  • portal_ip参数是目标门户的IP地址。
  • 如果未指定port参数,它将使用默认端口3260。

示例:

bash 复制代码
[root@client ~]# iscsiadm -m discovery -t st -p server
10.1.8.10:3260,1 iqn.2024-12.cloud.shizhan.server:disk1

要使用列出的目标之一,请使用以下命令登录到该目标:

bash 复制代码
[root@client ~]# iscsiadm -m node -T Target -p portal_ip[:port] -l

示例:

bash 复制代码
[root@client ~]# iscsiadm -m node -T iqn.2024-12.cloud.shizhan.server:disk1 -l
Logging in to [iface: default, target: iqn.2024-12.cloud.shizhan.server:disk1, portal: 10.1.8.10,3260]
Login to [iface: default, target: iqn.2024-12.cloud.shizhan.server:disk1, portal: 10.1.8.10,3260] successful.

此时,系统将检测到新的SCSI块设备,就好像它是本地连接的硬盘驱动器一样。 您可以使用以下命令查看新设备,该命令以打印级别3显示有关当前iSCSI登录会话的信息。

bash 复制代码
[root@client ~]# iscsiadm -m session -P 3
iSCSI Transport Class version 2.0-870
version 6.2.0.877-0
Target: iqn.2024-12.cloud.shizhan.server:disk1 (non-flash)
Current Portal: 10.1.8.10:3260,1
...output omitted...
Attached scsi disk sdc State: running

或者,您可以查看dmesgtail /var/log/messagesls -l /dev/disk/by-path/*iscsi*命令的输出。 该登录过程在重新启动后将保持不变。 因此,启动后块设备将自动可用。

格式化 iSCSI 设备

如果发现的块设备已经具有分区,文件系统或LVM卷,则可以使用常规命令(如mount)访问该数据。 您可以使用lsblk --fs命令检查设备。

bash 复制代码
[root@client ~]# blkid
NAME FSTYPE LABEL UUID MOUNTPOINT
sda
├─sda1 xfs f7614c41-2835-4125-bb13-50772dc2f30c /boot
├─sda2 swap 78a5f1eb-a593-4db3-b15a-f49042e182a2 [SWAP]
└─sda3 xsf ac2790c4-cfbb-409e-88a9-fe8c963fcd00 /
sdb LVM2_member 4ALe1y-oEXe-XLer-PjYW-n5ud-Ryko-XZZ2PM
├─dbdata-log ext4 bd566c1f-01a1-404d-8f01-9495004f327c /data/db/log
└─dbdata-data ext4 5640b4ae-5868-4bf5-8715-51fc18d8656b /data/db/data
sdc

多个启动程序同时从同一目标安装同一文件系统,会导致文件系统损坏或尝试读取数据时出现不一致。 本地文件系统(例如ext4或XFS)不支持从多个系统并发安装。如果需要允许从多个系统同时访问基于iSCSI的块设备,请使用群集文件系统(例如GFS2)。

如果磁盘为空,则可以对其进行格式化,创建分区或将其用作LVM物理卷。

bash 复制代码
# 假设客户端发现的设备名称是/dev/sdb
[root@client ~]# mkfs.xfs /dev/sdb

持久化挂载

在/etc/fstab中的iSCSI目标上持久地挂载文件系统时,请确保遵循以下建议:

  • 使用带有--fs选项的lsblk命令来确定文件系统UUID,然后使用该UUID挂载文件系统。 不要使用设备名称(/dev/sd*)。 设备的名称取决于 iSCSI 设备通过网络响应的顺序,因此设备名称可能会在引导之后更改。如果在 /etc/fstab 中使用设备名称,则系统可能会将设备挂载在错误的挂载点下。
  • 在/etc/fstab中使用 _netdev 挂载选项。 因为iSCSI依赖网络访问远程设备,所以此选项可确保在网络和启动器启动之前,系统不会尝试挂载文件系统。

示例:

bash 复制代码
UUID="3d49d1dd-8209-43a1-a106-4de328762e00" /data xfs defaults,_netdev        0 0

还需要确保服务iscsi开机自动启动,该服务默认是开机自动启动的。

bash 复制代码
[root@client-shizhan ~ 09:48:46]# systemctl enable iscsi

断开目标连接

要停止使用iSCSI目标,请执行以下步骤:

  • 确保没有使用目标提供的任何设备。 例如,卸载文件系统。

  • 从/etc/fstab等位置删除对目标的所有持久引用。

  • 从iSCSI目标注销。

    bash 复制代码
    [root@client ~]# iscsiadm -m node -T iqn.2024-12.cloud.shizhan.server:disk1 \
    > -p 10.1.8.10:3260 -u
  • 删除 iSCSI目标的本地记录,以使启动器在引导过程中不会自动登录到目标。

    bash 复制代码
    [root@client ~]# iscsiadm -m node -T iqn.2024-12.cloud.shizhan.server:disk1 \
    > -p 10.1.8.10:3260 -o delete

故障处理

如果发现成功,但是启动器登录到发现的目标时遇到问题,则该问题很可能与访问控制或身份验证有关。客户端上的IQN与服务器上的IQN不匹配会导致目标登录失败。

如果问题是由于客户端上的启动器IQN不正确引起的,请在客户端的/etc/iscsi/initiatorname.iscsi文件中修复IQN,然后重新启动iscsid服务以使更改生效。

原因:iscsid 服务缓存了之前客户端扫描时使用的IQN。

处理方法:停止 iscsid 服务,释放之前客户端扫描时使用的IQN。

bash 复制代码
[root@client ~]# systemctl stop iscsid 

# 重新发现
[root@client ~]# iscsiadm -m discovery -t st -p server
10.1.8.10:3260,1 iqn.2024-12.cloud.shizhan.server:disk1

# 重新登录
[root@client ~]# iscsiadm -m node -T iqn.2024-12.cloud.shizhan.server:disk1 -l

多路径访问

服务端准备

准备两个网络,targetcli中的portal也配置两个。效果如下:

bash 复制代码
[root@server ~]# ip -br a
lo               UNKNOWN        127.0.0.1/8 ::1/128 
ens160           UP             10.1.8.10/24 fd15:4ba5:5a2b:1008:20c:29ff:fe18:d49e/64 fe80::20c:29ff:fe18:d49e/64 
ens224           UP             10.1.1.10/24 fe80::691c:af0d:551:9745/64 

[root@server ~]# targetcli /iscsi/iqn.2024-08.fun.linux.server:webapp/tpg1/portals ls
o- portals ........................................................ [Portals: 2]
  o- 10.1.1.10:3260 ....................................................... [OK]
  o- 10.1.8.10:3260 ....................................................... [OK]

什么是多路径

多路径是指服务器和存储阵列存在多个物理连接方式使用虚拟设备,这种方式可以提供更加弹性的存储连接(一个路径down掉不会影响连接性),也可以聚合存储带宽提供性能。

示例:

多路径由dm-multipath子系统提供,使用内核device mapper系统获得虚拟设备,有multipathd进程和multipath命令行工具管理。

软件包device-mapper-multipath提供必要的binaries daemon和kernel modules。安装、配置、启动后,多路径设备节点会创建在两个位置。

出于管理目的,multipath设备创建在/dev/mapper,如果选择了user-friendly名称,这些设备也可以命名为mpathN p**M**,或者配置在World Wide ID(WWID)之后。管理员也可以自定义多路径设备名,这些自定义名称在multipaths配置文件的multipaths部分使用alias选项定义。

多路径设备也会创建在/dev目录,格式/dev/dm-N与/dev/mapper下的文件匹配。这些设备提供给系统内部使用,禁止管理目的直接使用。

重要:多路径提供存储访问路径down情况的保护。如果存储本身不可用,访问访问存储也会不可用。

创建多路径设备,不同的路径将会合并到组中,取决于/etc/multipath.conf配置。典型情况,同一时刻只能激活一个组,一个组可以包含多个路径。当某个组故障,多路径进程将切换流量到不同组中。

配置多路径

安装软件包

bash 复制代码
[root@client ~]# yum install -y device-mapper-multipath

启用多路径

创建配置文件 /etc/multipath.conf 最简单的方法是使用mpathconf工具:

  • 如果文件不存在,使用以下命令生成配置文件。也可以从默认位置/usr/share/doc/device-mapper-multipath-*/multipath.conf拷贝过来。

    bash 复制代码
    [root@client ~]# mpathconf --enable
  • 如果文件已经存在,则以下命令会修改文件配置。

    bash 复制代码
    [root@client ~]# mpathconf --enable --with_multipathd y --with_chkconfig y

编辑配置文件后,使用 systemctl 命令 enable 和 start multipathd 进程。

bash 复制代码
[root@client ~]# systemctl enable multipathd
[root@client ~]# systemctl start multipathd

发现设备

过程省略。

确定设备是同一设备

WWN(World Wide Name) ,全球唯一名称,是由 IEEE 标准化的全球唯一标识符,用于标识存储设备(如硬盘、RAID 阵列、光纤交换机等),每个设备具有全球唯一名称。应用场景:在光纤通道(FC)、iSCSI 等存储网络中,用于识别和定位存储设备。

WWN 是判断多路径设备是否指向同一存储设备的 核心依据 :所有属于同一多路径设备的物理路径(如sdbsdc),其对应的存储设备 WWN 必然相同。

scsi_id 命令
bash 复制代码
[root@client ~]# /usr/lib/udev/scsi_id -g -u /dev/sdb
360014057202ac29e3cd4d24850ed82f3

[root@client ~]# /usr/lib/udev/scsi_id -g -u /dev/sdc
360014057202ac29e3cd4d24850ed82f3
udevadm 命令
bash 复制代码
[root@client ~]# udevadm info --query=property --name=/dev/sdb | grep ID_WWN_W
ID_WWN_WITH_EXTENSION=0x600140559c2883e039048cbbce4320b4
[root@client ~]# udevadm info --query=property --name=/dev/sdC | grep ID_WWN_W
ID_WWN_WITH_EXTENSION=0x600140559c2883e039048cbbce4320b4
通过 UUID 或其他标识符辅助判断
bash 复制代码
[root@client ~]# blkid /dev/sdb
/dev/sdb: UUID="3c4cd1fc-8e65-4ce5-a85d-0b9a79e582b4" TYPE="xfs" 
[root@client ~]# blkid /dev/sdc
/dev/sdc: UUID="3c4cd1fc-8e65-4ce5-a85d-0b9a79e582b4" TYPE="xfs" 

监控多路径

multipath命令也可用于多路径状态监控。

  • -l 选项,显示多路径拓扑简介。
  • -ll 选项,会检测所有路径是否active,如果没有问题,路径的状态为active和ready。命令输出还会包括每个多路径设备的信息,有三个部分组成:多路径设备,path group,path group成员。

示例:

bash 复制代码
[root@client ~]# multipath -ll
mpatha (360014057202ac29e3cd4d24850ed82f3) dm-3 LIO-ORG ,db01            
size=100G features='0' hwhandler='0' wp=rw
|-+- policy='service-time 0' prio=1 status=active
| `- 32:0:0:0 sdb 8:16 active ready running
`-+- policy='service-time 0' prio=1 status=enabled
  `- 33:0:0:0 sdc 8:32 active ready running
  • 第一部分是多路径设备信息。

    • 第一行:alias wwid 设备名 vendor 和产品信息。

      WWID(World Wide Identifier) ,全球唯一标识符,是 Linux 多路径软件(multipath)使用的逻辑标识符,用于标识多路径设备(由多个物理路径聚合而成的逻辑设备)。

    • 第二行:size enabled features hardware handlers和写权限。

  • 第二部分是多路径设备的path group,包括调度策略,优先级和path group 状态,紧随的是其成员path。对于每个path,也就是设备节点名,包括设备major和minor信息,path的状态。

    • 状态为up,随时可以执行IO操作的path,显示的状态为ready。
    • 状态为down,显示为faulty。

failover 的策略是active-passive配置,因此在任一时刻,只有一个路径是active状态,另外一个是enabled状态。

配置文件

配置文件 /etc/multipath.conf,包含5个部分:

  • defaults ,定义了所有多路径的默认配置,会被devicesmultipaths块配置覆盖。

  • blacklist,定义了多路径设备中不允许使用的设备。

  • blacklist_exceptions ,定义了多路径设备中应该包含的设备,即使设备已经定义在blacklist中。

  • devices ,指定特定设备类型,会被multipaths 块覆盖。device是通过他们的vendor productrevision(修正)关键字识别(来自于sysfs的正则表达式匹配)。

  • multipaths ,包含指定路径,会覆盖defaults 块和devices块中定义的设备。多路径基于他们的WWIDs识别(使用getuid_callout函数获得)。

覆盖方式:multipaths > devices > defaults。

Defaults

完整的默认设置可以参考/usr/share/doc/device-mapper-multipath-*/multipath.conf.defaults。

一些有趣的设置:

  • path_selector:定义了组中下一次IO路径选择的算法。默认是"service-time 0",提供给服务消耗时间最少的路径。备用算法,"round-robin 0",分发IO给组中所有路径。rr_min_io_rq,定义每个IO路径发送多少个请求后转换到下一个IO路径。"queue-length 0",定义下一个IO请求发送给最短队列长度的路径。

  • path_grouping_policy:多路径是如何合并到priority组中。默认是failover,每个路径放入单独的组。multibus,所有可能的路径都聚合到一个组中。在使用multibus前,确保存储控制器支持active-active连接。

  • path_check:定义multipathd进程如何确定路径是否healthy。包括硬件独立选项,directio和readsector0等,默认为directio,一般会被devices{}配置覆盖。

  • features :定义启用的多路径功能。语法格式:num list。num代表启用的功能,list代表启用的功能列表。例如,queue_if_no_path和no_partitions。

  • user_friendly_names:定义在未定义alias情况下,多路径名称是否为mpathN。

在mpathconf命令创建的默认配置文件中,默认开启了user_friendly_names选项,多路径设备名称以用户友好方式命名为mpathN。只有一个多路径设备的时候比较有用,但有多个多路径设备,这些设备名称就会混淆。禁用用户友好名称,mpathconf命令创建时指定选项--user_friendly_names n,多路径设备名称将命名在他们的WWIDs之后。

警告:如果启用了queue_if_no_path,设置features "1 queue_if_no_path",路径fail,处理IO的进程将挂起直到路径恢复。这个行为在集群部署中是不希望看到的,因为一个节点的IO挂起会导致集群其他节点访问存储。解决方法,指定no_path_retry参数值为fail,路径失败后将会立刻通知更高层,而非阻塞IO直到路径恢复。

multipaths

用于为特定多路径设定不同的path_grouping策略,设定多路径alias。

bash 复制代码
multipaths {
        multipath {
                wwid                    360014057202ac29e3cd4d24850ed82f3
                alias                   ClusterStorage
                path_grouping_policy    failover
        }
}

当path group配置了multibus策略时,多路径设备将所有路径组合到一个 group中。

复制代码
multipaths {
        multipath {
                wwid                    36001405bbc2fa575d0d46ec8951bc465
                alias                   ClusterStorage
                path_grouping_policy    multibus
        }
}
bash 复制代码
[root@client ~]# multipath -ll
ClusterStorage (360014057202ac29e3cd4d24850ed82f3) dm-0 LIO-ORG ,clusterstor   
size=4.0G features='0' hwhandler='0' wp=rw
`-+- policy='service-time 0' prio=1 status=active
  |- 2:0:0:0 sdb 8:16 active ready running
  `- 3:0:0:0 sda 8:0  active ready running
devices

devices 块定义了每个独立的设备。

示例:

json 复制代码
devices {
       device {
               vendor                  "COMPAQ  "
               product                 "HSV110 (C)COMPAQ"
               path_grouping_policy    multibus
               path_checker            readsector0
               path_selector           "round-robin 0"
               hardware_handler        "0"
               failback                15
               rr_weight               priorities
               no_path_retry           queue
       }
}
Blacklist

Blacklist 提供设备黑名单,通过WWID和device node指定设备,支持使用通配符。

bash 复制代码
blacklist {
        devnode "^vd[a-z]"
        wwid 1234567890abcde
}

查看磁盘设备WWID命令:

bash 复制代码
[root@client ~]# /usr/lib/udev/scsi_id -g -u /dev/sda
360014057202ac29e3cd4d24850ed82f3
blacklist_exceptions

blacklist_exceptions 提供设备黑名单。

bash 复制代码
blacklist_exceptions {
       device {
               vendor  "IBM"
               product "S/390.*"
       }
}

使用设备

多路径设备名称为 /dev/mapper/mpatha,识别到设备后就可以正常使用。

示例:划分分区,格式化,挂载。

bash 复制代码
[root@client ~]# parted /dev/mapper/mpatha mklabel gpt
[root@client ~]# parted /dev/mapper/mpatha unit MiB mkpart webapp 1 10241 <<< 'Ignore'

[root@client ~]# mkfs.xfs /dev/mapper/mpatha1
[root@client ~]# mount /dev/mapper/mpatha1 /usr/share/nginx/html

[root@client ~]# df -h /usr/share/nginx/html
Filesystem           Size  Used Avail Use% Mounted on
/dev/mapper/mpatha1   10G  104M  9.9G   2% /var/www/html

持久化挂载

bash 复制代码
[root@client ~]# vim /etc/fstab
# 最后增加一条
/dev/mapper/mpatha1 /usr/share/nginx/html xfs _netdev 0 0

[root@client ~]# systemctl daemon-reload
[root@client ~]# umount /usr/share/nginx/html
[root@client ~]# mount -a
[root@client ~]# df -h /usr/share/nginx/html
Filesystem           Size  Used Avail Use% Mounted on
/dev/mapper/mpatha1   10G  104M  9.9G   2% /var/www/html

高可用性测试

测试1:断开server端第二块网卡

bash 复制代码
[root@server ~]# nmcli device disconnect ens192

以下显示了passive状态的path group发生了故障。active状态的path group保持不变。

bash 复制代码
[root@client ~]# multipath -ll
mpatha (3600140559c2883e039048cbbce4320b4) dm-0 LIO-ORG ,clusterstor   
size=4.0G features='0' hwhandler='0' wp=rw
|-+- policy='service-time 0' prio=1 status=active
| `- 2:0:0:0 sdb 8:16 active ready running
`-+- policy='service-time 0' prio=1 status=enabled
  `- 3:0:0:0 sda 8:0  failed faulty offline

测试2:恢复server端第二块网卡

以下显示了active状态的path group发生了故障。active状态的path group变更为failed faulty offline,同时状态由active变更为enabled。passive状态的path group变更为active ready running,同时状态由enabled变更为active。

bash 复制代码
[root@client ~]# multipath -ll
mpatha (3600140559c2883e039048cbbce4320b4) dm-0 LIO-ORG ,clusterstor   
size=4.0G features='0' hwhandler='0' wp=rw
|-+- policy='service-time 0' prio=1 status=enabled
| `- 2:0:0:0 sdb 8:16 failed faulty offline
`-+- policy='service-time 0' prio=1 status=active
  `- 3:0:0:0 sda 8:0  active ready running

重要:故障路径恢复后,当前的active path保持不变,即使恢复的路径之前是active path,可以通过手动切换回来。

相关推荐
大树886 小时前
金刚石散热越强,管路越先见顶
大数据·运维·服务器·人工智能·ai
摇滚侠6 小时前
Linux CentOS7 rpm 安装 MySQL 5.7
linux·运维·mysql
霸道流氓气质6 小时前
领域驱动设计(DDD)在 Spring Boot 微服务中的实践指南
运维·spring boot·微服务
bush46 小时前
嵌入式linux学习记录十四、术语
linux·嵌入式
载数而行5206 小时前
Linux 11 动态监控指令top
linux
Inhand陈工7 小时前
基于台达PLC与映翰通IG502的智慧水产养殖精准投喂与远程运维解决方案
运维·人工智能·物联网·阿里云·信息与通信
酣大智7 小时前
ARP代理--工作原理
运维·网络·arp·arp代理
不会C语言的男孩8 小时前
Linux 系统编程 · 第 8 章:进程基础
linux·c语言
shushangyun_8 小时前
2026年快消品B2B系统推荐:支持终端门店订货、促销政策自动化的工具?
java·运维·网络·数据库·人工智能·spring·自动化
古城小栈8 小时前
Unix 与 Linux 异同小叙
linux·服务器·unix