iSCSI

iSCSI详解及配置

1、认识iSCSI

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

1.1、SCSI

20161013234721997

SCSI(Small Computer System Interface)是一种I/O技术,规范了一种并行的I/O总线和相关的协议,SCSI的数据传输是以块的方式进行的。

​ 如上图,SCSI总线通过SCSI控制器来和硬盘之类的设备进行通信, SCSI控制器称为Target,访问的客户端应用称为Initiator。窄SCSI总线最多允许8个、宽SCSI总线最多允许16个不同的SCSI设备和它进行连接,每个SCSI设备都必须有自己唯一的SCSI ID(设备的地址)。

​ LUN(Logical Unit Number,逻辑单元号)是为了使用和描述更多设备及对象而引进的一个方法,每个SCSI ID上最多有32个LUN,一个LUN对应一个逻辑设备。

​ 广泛应用于小型机上,正在成为PC 服务器的标准接口,实现高速数据传输(可达320MB/s),常见的SCSI设备:硬盘、磁盘阵列、打印机、光盘刻录机等。

1.2、iSCSI实现

20161013234722319

  • iSCSI Initiator

​ iSCSI 启动器,从本质上说,iSCSI 启动器是一个客户端设备,用于将请求连接并启动到服务器(iSCSI 目标)。

20161013234722778

​ 如上图,iSCSI 启动器有三种实现方式:可以完全基于硬件实现,比如 iSCSI HBA 卡;硬件TOE卡与软件结合的方式;完全基于软件实现,而软件 iSCSI 启动器适用于大部分主流操作系统平台,下面就是用软件方式来配置。

  • iSCSI Target

    即 iSCSI 目标,它是 iSCSI 网络的服务器组件,通常是一个存储设备,用于包含所需的数据并回应来自 iSCSI 启动器的请求。

  • 工作过程

20161013234723069

​ Initiator发出请求后,会在本地的操作系统会生成了相应的SCSI命令和数据I/O请求,然后这些命令和请求被封装加密成IP信息包,通过以太网(TCP/IP)传输到Targer。

​ 当Targer接收到信息包时,将进行解密和解析,将SCSI命令和I/O请求分开。SCSI命令被发送到SCSI控制器,再传送到SCSI存储设备。

​ 设备执行SCSI命令后的响应,经过Target封装成iSCSI响应PDU,再通过已连接的TCP/IP网络传送给Initiator。

​ nitiator会从iSCSI响应PDU里解析出SCSI响应并传送给操作系统,操作系统再响应给应用程序。

1.3、iSCSI与FC SAN

20161013234723741

​ FC(FiberChannel,光纤通道)是利用光纤信道结合光纤通道交换机实现高速的数据存储网络。FC性能很好,但价格却贵得惊人,管理起来也非常困难。

​ 所以iSCSI利用现有的以太网络,用户只需要少量的投入,就可以方便、快捷地对信息和数据进行交互式传输和管理。当然iSCSI与FC相比也存在明显的不足,如速度性能、安全可靠性。

20161013234724263

2、SAN与NAS / iSCSI与NFS

20161013234725116

​ 通过前面文章知道,SAN与NAS是完全不同架构的存储方案,前者支持Block协议,后者则支持File协议;SAN结构中,文件管理系统(FS)还是分别在每一个应用服务器上,会产生I/O操作,而NAS则是每个应用服务器通过网络共享协议(如:NFS、CIFS)使用同一个文件管理系统,所以CPU密集型应用可以选用NAS。SAN是将目光集中在磁盘、磁带以及联接它们的可靠的基础结构,而NAS是将目光集中在应用、用户和文件以及它们共享的数据上,显得更"高级"。将来从桌面系统到数据集中管理到存储设备的全面解决方案将是NAS加SAN。

​ 以上区别具体到iSCSI和NFS:iSCSI可优化空间更大,性能稍好,但技术难度更高;而NFS在系统层面的支持更多,像一些备份、恢复等操作较简单。

2.1、相关准备配置

给服务器加上硬盘,用于共享:

Snipaste_2024-05-10_21-42-40

关闭防火墙和selinux:

[root@ISCSI_Server ~]# systemctl stop firewalld && systemctl disable firewalld
[root@ISCSI_Server ~]# setenforce 0
[root@ISCSI_Server ~]# sed -i 's/SELINUX=enforcing/SELINUX=disabled/g' /etc/selinux/config

安装服务并设置开机自启动:

[root@ISCSI_Server ~]# yum install -y targetd targetcli
[root@ISCSI_Server ~]# systemctl start targetd && systemctl enable targetd

2.2、创建IPSAN

​ 命令行输入targetcli进入交互界面,在交互界面可以使用ls,cd等命令灵活简单的操作,如图所示,最上层目录包括backstores、iscsi等,如果有FC或Infiniband的话,还会有其余的一些子模块如qla2xxx等。

Snipaste_2024-05-10_21-51-05

​ 创建卷资源

​ 使用cd进入/backstores/block目录,

/> cd backstores/block

​ 然后创建卷资源,使用块设备/dev/sdb

/backstores/block> create dev=/dev/sdb name=sdb   #名字是随意的

​ 如果提示sdb设备正在被使用,则需要先卸载该磁盘分区。提示创建成功(readonly属性表示读写权限,wwn号为卷资源的唯一标号)

Snipaste_2024-05-10_21-55-07

2.3、创建iSCSI

快速创建一个iSCSI服务的步骤如下:

a.首先创建一个iqn

b.在iqn下添加提供服务的IP以及需要映射的卷

c.设置认证

1191664-20181025151327143-1908472078

操作如下:

这里介绍一个技巧,在交互界面输入cd,可以进入下图界面,可以灵活快速地跳到指定目录

Snipaste_2024-05-10_21-58-23

2.4、在iscsi目录下创建iqn

/iscsi> create

Snipaste_2024-05-10_22-12-04

然后在iqn的对应目录下添加服务IP,映射卷和权限设置(默认应该是有0.0.0.0,就是允许所有IP访问):

设置服务IP:

/iscsi> cd iqn.2003-01.org.linux-iscsi.localhost.x8664:sn.9520be3109ac/tpg1/portals/

Snipaste_2024-05-10_22-18-27

这里可以使用delete删除,create创建如下:

/iscsi> cd iqn.2003-01.org.linux-iscsi.localhost.x8664:sn.9520be3109ac/tpg1/portals/
/iscsi/iqn.20.../tpg1/portals> delete 0.0.0.0 ip_port=3260 # 删除

/iscsi/iqn.20.../tpg1/portals> create 0.0.0.0 #创建

设置ACLS:

/iscsi> cd /iscsi/iqn.2003-01.org.linux-iscsi.iscsiserver.x8664:sn.2d5a4bb56c28/tpg1/acls
/iscsi/iqn.20...c28/tpg1/acls> create iqn.2003-01.org.linux-iscsi.iscsiserver.x8664:sn.2d5a4bb56c28:client

Snipaste_2024-05-14_15-00-23

到这里客户端已经可以连接服务端,但是还需要将磁盘组绑定后端存储,不然客户端无法访问:

/iscsi/iqn.20...95939114/tpg1> cd /iscsi/iqn.2003-01.org.linux-iscsi.localhost.x8664:sn.c1da95939114/tpg1/luns
/iscsi/iqn.20...114/tpg1/luns> create /backstores/block/sdb

退出并重启:

/iscsi/iqn.20...be3109ac/tpg1> exit
[root@ISCSI_Server ~]# systemctl restart targetd

2.5、linux使用ISCSI发起连接

2.5.1、和服务端一样初始化

[root@ISCSI_Client ~]# systemctl stop firewalld && systemctl disable firewalld
[root@ISCSI_Client ~]# setenforce 0
[root@ISCSI_Client ~]# sed -i 's/SELINUX=enforcing/SELINUX=disabled/g' /etc/selinux/config

2.5.2、安装客户端软件

[root@ISCSI_Client yum.repos.d]# yum -y install iscsi-initiator-utils

2.5.3、发现服务端网络磁盘并连接

[root@ISCSI_Client ~]# iscsiadm --mode discoverydb --type sendtargets --portal 10.1.1.2 --discover

这里10.1.1.2是服务端IP

修改客户端iqn,这里要改成服务端acls里面那个,后面加了个“:client“:

Snipaste_2024-05-14_15-05-44

重启并设置开机自启:

[root@ISCSI_Client ~]# systemctl restart iscsid
[root@ISCSI_Client ~]# systemctl enable iscsid

登录:

[root@ISCSI_Client ~]# iscsiadm -m node -T iqn.2003-01.org.linux-iscsi.iscsiserver.x8664:sn.2d5a4bb56c28 -p 10.1.1.2 --login

IP要换成自己服务端IP,iqn也要换成自己服务端的iqn

Snipaste_2024-05-14_15-19-13

查看磁盘就可以看到挂载成功。

Snipaste_2024-05-14_15-14-16

到这里就可以正常对它格式化使用,注意生产可能要写入/etc/fstab,开机自动挂载。

3、linux使用multipath实现多链路挂载实现负载

操作系统 角色 ip
centos7.9 存储端 192.168.126.101 & 192.168.126.102
Ubuntu 22.04 挂载端 192.168.126.100

3.1 存储端

配置两张网卡和准备好存储磁盘(这里是sdb):

[root@localhost ~]# ip a
2: ens33: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000
    link/ether 00:0c:29:56:44:61 brd ff:ff:ff:ff:ff:ff
    inet 192.168.126.101/24 brd 192.168.126.255 scope global noprefixroute ens33
       valid_lft forever preferred_lft forever
    inet6 fe80::d00d:7855:42d:698e/64 scope link noprefixroute 
       valid_lft forever preferred_lft forever
3: ens36: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000
    link/ether 00:0c:29:56:44:6b brd ff:ff:ff:ff:ff:ff
    inet 192.168.126.102/24 brd 192.168.126.255 scope global noprefixroute ens36
       valid_lft forever preferred_lft forever
    inet6 fe80::30db:c281:174e:9a75/64 scope link noprefixroute 
       valid_lft forever preferred_lft forever
[root@localhost ~]# lsblk 
NAME            MAJ:MIN RM  SIZE RO TYPE MOUNTPOINT
sda               8:0    0   40G  0 disk 
├─sda1            8:1    0    1G  0 part /boot
└─sda2            8:2    0   39G  0 part 
  ├─centos-root 253:0    0   35G  0 lvm  /
  └─centos-swap 253:1    0    4G  0 lvm  [SWAP]
sdb               8:16   0   80G  0 disk

服务端环境初始化以及安装软件:

[root@localhost ~]# systemctl stop firewalld && systemctl disable firewalld
[root@localhost ~]# sed -i 's/SELINUX=enforcing/SELINUX=disabled/g' /etc/selinux/config 
[root@localhost ~]# setenforce 0
[root@localhost ~]# yum install -y targetd targetcli
[root@localhost ~]# systemctl start targetd && systemctl enable targetd

创建相关存储资源:

[root@localhost ~]# targetcli
/> cd backstores/block
/backstores/block> create dev=/dev/sdb name=sdb
/backstores/block> cd /iscsi 
/iscsi> create
/iscsi> cd iqn.2003-01.org.linux-iscsi.localhost.x8664:sn.ca29c0f85866/tpg1/portals/
/iscsi/iqn.20.../tpg1/portals> delete 0.0.0.0 ip_port=3260
/iscsi/iqn.20.../tpg1/portals> create 0.0.0.0
/iscsi/iqn.20.../tpg1/portals> cd /iscsi/iqn.2003-01.org.linux-iscsi.localhost.x8664:sn.ca29c0f85866/tpg1/acls 

/iscsi/iqn.20...866/tpg1/acls> create iqn.2003-01.org.linux-iscsi.iscsiserver.x8664:sn.2d5a4bb56c28:client
/iscsi/iqn.20...866/tpg1/acls> cd /iscsi/iqn.2003-01.org.linux-iscsi.localhost.x8664:sn.ca29c0f85866/tpg1/luns 

/iscsi/iqn.20...866/tpg1/luns> create /backstores/block/sdb
/iscsi/iqn.20...866/tpg1/luns> exit
[root@localhost ~]# systemctl restart targetd

3.2 客户端

配置挂载存储,首先要把自己的InitiatorName改成存储端在acls中定义的名字,否则无法挂载

root@guojie:~# egrep -v '^#|^$' /etc/iscsi/initiatorname.iscsi
InitiatorName=iqn.2003-01.org.linux-iscsi.iscsiserver.x8664:sn.2d5a4bb56c28:client

再把连接方式改成自动,默认是手动,如果设置了认证之类的还要额外配置其他项:

root@guojie:~# cat /etc/iscsi/iscsid.conf | grep "^node.startup"
node.startup = automatic

连接存储:

存储发现,这里由于是同一个所以iqn都是一样的:

iscsiadm -m discovery -t sendtargets -p <储存ip>

root@guojie:~# iscsiadm -m discovery -t sendtargets -p 192.168.126.101
192.168.126.101:3260,1 iqn.2003-01.org.linux-iscsi.localhost.x8664:sn.ca29c0f85866
root@guojie:~# iscsiadm -m discovery -t sendtargets -p 192.168.126.102
192.168.126.102:3260,1 iqn.2003-01.org.linux-iscsi.localhost.x8664:sn.ca29c0f85866

连接luns,有多少链路就连多少次,我这里只有两条:

iscsiadm -m node -T <TARGET_IQN> -p <储存ip> --login

root@guojie:~# iscsiadm -m node -T iqn.2003-01.org.linux-iscsi.localhost.x8664:sn.ca29c0f85866 -p 192.168.126.101 --login
root@guojie:~# iscsiadm -m node -T iqn.2003-01.org.linux-iscsi.localhost.x8664:sn.ca29c0f85866 -p 192.168.126.102 --login

拓展:

取消连接的命令是:iscsiadm -m node -T <TARGET_IQN> -p <储存ip> --logout

配置多链路工具multipath连接规则:

defaults {
    user_friendly_names yes     # 启用友好名称功能如果为no,那么wwid必须全网唯一
    find_multipaths no          # 所有符合条件的设备都会被配置为多路径设备
}

blacklist {
    devnode "^sd[a][0-9]*"      # 该部分定义了不应该被multipath管理的设备,即排除本地磁盘,支持正则。
}                               # 如果本地还有sdb,那么就写成"^sd[a-b][0-9]*"

blacklist_exceptions {          # 定义了应该被multipath管理的设备,它们即使在黑名单中也会被作为例外处理
    device {
        vendor ".*"             # 表示所有供应商的设备都应该作为例外被多路径管理。
        product ".*"            # 表示所有供应商的产品都应该作为例外被多路径管理。
    }
}

multipaths {
    multipath {
        wwid 36001405c282bc2caba14175a7384f2bb # 如果你已经挂载全部链路的磁盘,可以使用multipath -ll命令查看
        alias mpath0                           # wwid会显示在第一行别名在后面的括号中
    }
}

devices {
    device {
        vendor ".*"
        product ".*"
        path_selector "round-robin 0"  # 设置路径选择策略为 round-robin。这意味着 I/O 会在每个路径之间轮流分配负载。
        path_grouping_policy multibus  # 设置路径分组策略为 multibus。这意味着所有路径将被视为一个路径组。
        path_checker directio  #设置路径检查器为 directio。这将通过直接 I/O 操作检查路径的可用性。
        rr_min_io 100  #策略下每个路径至少处理的 I/O 请求数为 100。
    }
}

上面的配置当中一般只用修改wwid、alias、path_selector前一个是硬盘uuid,后一个则是取得别名,挂载之后需要用别名挂载硬盘到客户端上,最后一个是策略,"round-robin 0"是轮询即负载均衡模式,"queue-length 0"是最少连接,"service-time 0"是根据未完成的IO数量选择下一组IO的路径

配置完成之后

root@guojie:~# systemctl reload multipathd
root@guojie:~# systemctl start multipathd
root@guojie:~# systemctl enable multipathd
root@guojie:~# systemctl restart multipath-tools

看见两个磁盘状态都为runing即可:

root@guojie:~# multipath -ll
mpath0 (36001405caffe1f1c1b542088f5cfa11a) dm-1 LIO-ORG,sdb
size=80G features='0' hwhandler='1 alua' wp=rw
`-+- policy='round-robin 0' prio=50 status=active
  |- 33:0:0:0 sdb 8:16 active ready running
  `- 34:0:0:0 sdc 8:32 active ready running

磁盘格式化分区挂载—》fdisk /dev/mapper/mpath0 -> g -> 回车-> 回车-> 回车 ->w

root@guojie:~# mkfs.ext4 /dev/mapper/mpath0-part1
root@guojie:~# mount /dev/mapper/mpath0-part1 /data

可以测验一下是否正常:

如下,在存储端编辑一个脚本分别监控两个网卡流量:

[root@localhost ~]# cat monitor_traffic.sh
#!/bin/bash
eth0=$1
echo  -e    "流量进入--流量传出    "
while true; do
    old_in=$(cat /proc/net/dev |grep $eth0 |awk '{print $2}')
    old_out=$(cat /proc/net/dev |grep $eth0 |awk '{print $10}')
    sleep 1
    new_in=$(cat /proc/net/dev |grep $eth0 |awk '{print $2}')
    new_out=$(cat /proc/net/dev |grep $eth0 |awk '{print $10}')
    in=$(printf "%.1f%s" "$((($new_in-$old_in)/1024))" "KB/s")
    out=$(printf "%.1f%s" "$((($new_out-$old_out)/1024))" "KB/s")
    echo "$in $out"
done
[root@localhost ~]# chmod +x monitor_traffic.sh

分别打开两个窗口一个监控ens33,一个监控ens36网卡:

[root@localhost ~]# sh monitor_traffic.sh ens33
[root@localhost ~]# sh monitor_traffic.sh ens36

然后在终端上复制较大文件到/data中之后查看两块网卡流量:

root@guojie:~# cp /home/guojie/CentOS-7-x86_64-Everything-2009.iso /data

观察流量可以看见只是走了一跳链路,但是那条链路异常他会迁移到另一条。

4、使用windows ISCSI发起连接

使用ISSCSI发起程序连接服务端:

先把配置发起程序的名称,改成之前服务器端设置的哪个acl:

Snipaste_2024-05-15_09-43-13

Snipaste_2024-05-10_22-28-21

Snipaste_2024-05-10_22-28-40

4.1、链路冗余

​ 当客户端到达服务器端有多链路可达时,可以配置该方式,达到链路可靠的特点:

如下:

Snipaste_2024-05-17_17-35-26

服务端有四个IP,客户端均能访问这四个地址,我们就可以配置冗余链路。

客户端配置:

发现门户这里发现所有的服务端IP:

Snipaste_2024-05-17_17-38-27

按照如下步骤,依次把所有IP加入:

Snipaste_2024-05-17_17-40-48

Snipaste_2024-05-17_17-42-38

这里就可以看见四个设备:

Snipaste_2024-05-17_17-44-31

点解MPIO还可以选择负载策略:

Snipaste_2024-05-17_17-46-23

配置完成之后可以测试链路是否达到冗余效果。

posted @   国杰响当当  阅读(78)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
点击右上角即可分享
微信分享提示