企业级iSCSI配置,聊聊iSCSI的多路径技术
前文我们介绍了IP-SAN的基本概念和基于Linux操作系统的配置使用。最后我们提到在企业级应用中,通常在启动器和目标器之间会有多条物理链路。而且iSCSI支持将多条链路聚合为一个链路来提供存储服务,具体如下图所示。
iSCSI对多条链路的支持源于企业级应用高可用的要求。以银行、证券和电商等领域的业务为例,中断一分钟可能就会有上百万的损失。因此在计算节点和存储节点之间通常会有两条链路,这样,链路上的部件故障不会影响计算节点的业务,这些故障包括网线松动、交换机故障、网卡故障等等。
在IP-SAN中(iSCSI),启动器要访问目标器中的资源必须建立一个持久的访问状态,这种状态称为会话(Session)。iSCSI的一个会话可以包含一个或者多个连接,这里的连接是一个TCP连接。为了区分会话中的不同的连接,每个连接都有一个连接ID(Connection ID),简称CID。
我们这里不过多的介绍概念,直接动手操作一下,看看如何通过多个链路访问存储系统。照例,考虑到大多数人不太可能找到一个企业级磁盘阵列,所以我们这里都是通过Linux虚拟机模拟的。
首先需要进行目标器端的配置,也就是在存储端创建一个LUN,然后映射出来。具体配置方法请参考《SAN存储的概念与基于iSCSI的操作实战》,本文不再赘述。我们这里重点介绍一下启动器端的配置。
由于启动器端(主机端)需要通过两个独立的接口访问存储系统,因此我们首先需要创建接口,并于网卡绑定。首先需要创建一个新的接口,我们可以使用 `iscsiadm` 的 `-m iface` 选项来创建新的接口,具体命令如下:
iscsiadm -m iface -I iface01 --op new
iscsiadm -m iface -I iface02 --op new
上面一共创建了两个接口,接下来我们需要做一些设置,主要是绑定网卡和IP地址。具体可以通过如下命令完成。具体的网卡名称和IP地址请根据实际情况修改。在Ubuntu中,网卡名称和IP地址可以通过命令’ip addr’获取。
iscsiadm -m iface -I iface01 --op=update -n iface.net_ifacename -v enp0s3
iscsiadm -m iface -I iface01 --op=update -n iface.ipaddress -v 192.168.2.137
iscsiadm -m iface -I iface02 --op=update -n iface.net_ifacename -v enp0s9
iscsiadm -m iface -I iface02 --op=update -n iface.ipaddress -v 192.168.2.200
完成上述设置后,我们就完成接口创建和相关绑定了。接下来的操作与单连接的没有太大差别,首先是发现目标器的操作,具体命令如下。下面命令中的IP地址是存储端的IP地址,接口名称是刚才创建的接口。
iscsiadm -m discovery -t sendtargets -p 192.168.2.138 -I iface01
iscsiadm -m discovery -t sendtargets -p 192.168.2.201 -I iface02
最后是登录操作,具体命令如下所示。如果没有任何报错,那么会在/dev目录下面看到新增加的硬盘。
iscsiadm -m node -T iqn.2023-12.sunnyzhang.srv:test.target01 -p 192.168.2.138 -I iface01 –login
iscsiadm -m node -T iqn.2023-12.sunnyzhang.srv:test.target01 -p 192.168.2.201 -I iface02 --login
大家可以通过fdisk命令查看一下/dev下面的硬盘,作者新加的硬盘如下图所示。
大家可能注意到了,这里是两块相同的硬盘。因为登录了两次,所以是两块硬盘。大家可能会问了,那如何保证高可用呢?这个时候该多路径软件上场了!
在《SAN存储的概念与基于iSCSI的操作实战》我们提到多路径软件可以实现物理链路的聚合,将多个物理硬盘聚合为一个虚拟的硬盘。我们在后面使用这个虚拟的硬盘就可以实现高可用,原理就是这么简单。在Ubuntu下面,通过下面命令就可以安装多路径软件。
sudo apt-get install multipath-tools
安装完成多路径软件后并不能马上生效,我们首先需要一个简单的配置文件,具体内容如下所示。在这个配置文件中,黑名单、黑名单例外等内容都比较容易理解,我们暂时不做介绍。本文重点介绍一下设备列表(devices)中的内容,可以看到本配置文件中只有一个设备,实际可以有多个设备。
设备的配置信息中比较重要的是厂商(vendor)和产品(product)的配置信息。多路径软件就是通过这个信息来识别需要做多路径的硬盘,并采取不同的策略的。在本例中,我们采取的是轮询(round-robin)的策略。
defaults { user_friendly_names yes } blacklist { devnode "^sd[a-h]" } blacklist_exceptions { wwid "36001405321489c9dd3a45d0be9bb6960" property "(SCSI_IDENT_|ID_WWN)" } devices { device { vendor "LIO-ORG" product "lun01" path_grouping_policy "multibus" path_selector "round-robin 0" prio "alua" hardware_handler "1 alua" } } multipaths { multipath { wwid "36001405321489c9dd3a45d0be9bb6960" alias mpathsunny } } |
基于上述配置,我们可以如下命令重新加载配置项,重新加载配置项后上述两个块设备就会被聚合为一个块设备。
systemctl reload multipath-tools.service
通过fdisk -l命令可以看到聚合的设备,具体如下图所示。本例中设备名称为mpathsunny,大家可以思考一下为什么是这个名字?
通过multipath -ll可以查看多路径的状态,如下是本文配置的多路径的状态,具体如下图所示。这里包含聚合后的设备的信息和原始设备的信息。原始设备包含设备的ID信息、设备名称和主从设备ID以及路径状态等内容。
如果没有发现聚合后的设备,可以通过如下命令将块设备的wwid添加到multipath的配置中。然后重新加载配置项。
multipath -a /dev/sdi
执行上述命令其实是在wwids文件中添加一个WWID项,本例中添加后wwids文件的内容如下所示。
接下来我们再简要的介绍一下上述配置文件的。上述配置中,内容被划分为defaults、blacklist、blacklist_exceptions、multipath s和devices等不同的段。
其中defaults定义一些缺省的属性,有些属性如果在multipaths和devices没有设置,会使用这里的属性,比如轮询间隔和优先级策略等。本例中的user_friendly_names用于告诉多路径软件聚合设备命名的规则。如果是yes则采用比较友好的方式命名聚合后的设备,看到的是一个字符串的名称,如下图的上半部分所示。如果是no则直接采用设备的WWID作为聚合后设备的名称。
其中blacklist和blacklist_exception用定义多路径的黑名单和例外。如果我们不想让多路径软件处理某些块设备,可以将其加入黑名单中。
其中devices定义特定设备相关的规则,该段可以包含多个设备配置,每个设备可以是不同厂商的不同产品。多路径软件通过厂商ID和产品ID来进行区分,并采用不同的聚合策略。
其中multipaths用于定义路径的别名,通过该段的配置,我们可以让聚合设备的名称更加有意义。如下图所示,在使用multipaths配置前设备名称为mpatha,通过本文的配置后名称为一个更加有意义的mpathsunny。这个配置在主机端硬盘特别多的情况下非常有用。
上述配置中,,prio用于设置路径优先级的策略。这个策略决定了当有多条路径可用时,多路径软件应该优先使用哪一条路径进行 I/O 操作。目前多路径软件常见的策略包括如下几种:
·alua:使用非对称逻辑单元访问( Asymmetric Logical Unit Access ,简称ALUA )的优先级策略。该策略是相对比较通用的策略,大多数存储系统都支持该策略。
·emc:EMC公司私有的优先级策略,一般为EMC VNX和Unity等存储产品会用到该策略。
·ontap:NetApp ONTAP产品线使用的优先级策略。另外如IBM OEM的产品也会使用该策略。
·rdac:LSI、富士通和NetApp E系列产品使用的优先级策略。
很多大的存储厂商为了优化存储系统的性能都有一些自己私有的策略。所以,如果主机连接的是特定厂商的存储设备,我们就需要根据厂商来选择策略,这样性能是最优的。一般存储厂商的白皮书也会有说明。
如下图所示是富士通存储产品的配置模板,可以看到其厂商ID、产品ID和策略都是跟我们前面的配置不一样的。所以,我们上述配置只是针对我们使用LIO来模拟一个存储设备的场景。
除了上面介绍的最有路径策略外,还有一个比较重要的配置项是path_selector。在本文中我们使用的是最简单的的算法,也就是轮询算法(round-robin)。所谓轮询算法,简单的来说就是往多条活动链路上逐个发送请求,而不关心链路的状态。
除了轮询算法外,多路径软件还支持队列深度和服务时间两种算法。所谓队列深度算法是多路径软件会侦测各个活动链路上未处理的IO数量,下次发送IO的时候会往队列深度最小的链路发送IO请求。所谓服务时间也是类似,多路径软件会侦测IO处理的响应时间,发送请求时优先向延时低的链路发送请求。
至此,我们完成了Linux多路径软件使用相关的介绍,并简要介绍了配置文件中关键字段的含义。如果大家想进一步了解多路径软件相关的内容,可以关注本号“数据存储张”,后面我会给大家介绍一下多路径软件的软件架构和实现原理。
计算机数据存储简史,从纸到云的变迁 基于Fuse的最简单的文件系统 代码覆盖率测试,聊聊gcov和lcov SAN存储的概念与基于iSCSI的操作实战 全面了解SSD,SSD关键术语全面解析 分布式虚拟文件系统,数据编排小能手 高性能的基础RAID0,实操与代码实现解析 网络文件系统,年近五十岁,老当益壮 弹性空间之道,逻辑卷管理(LVM)技术 计算机数据存储简史,从纸到云的变迁 基于树莓派和硬盘柜搭建一个几十TB的家用NAS Linux存储软件栈到底有多复杂,存储软件栈全景概览 分布式存储的软件架构与案例解析 数万客户端NFS服务的困境,聊聊自动挂载技术 深入了解一下SSD的相关内容 什么是文件系统,以Linux中的Ext4为例细聊一下 对象存储,从单机到分布式的演进 为什么都说NFS读写性能差,如何进行优化?