一、几种流行的存储技术
1、NAS(Network Attached Storage,网络附加存储)基于标准网络协议实现数据传输,为网络中的各种不同操作系统的计算机提供文件共享和数据备份,NAS采用的是File Protocal存取方式;实现方案如nfs;
2、DAS(Direct Attached Storage,直接附加存储)是指将存储设备通过总线(SCSI、PCI、IDE等)接口直接连接到一台服务器上使用,是最流行的存储方式。
缺点:
服务器本身容易成为系统瓶颈;
服务器发生故障,数据不可访问;
对于多个服务器或多台PC的环境,每台PC或服务器单独拥有自己的存储设备,设备分散,不便管理;且存储空间不能在服务器之间动态分配,可能造成相当的资源浪费
SAN(Storage Area Network,存储区域网络)是一种将存储设备、连接设备和接口集成在一个高速网络中的技术。在SAN网络中,所有的数据传输在高速、高带宽的网络中进行,SAN存储实现的是直接对物理硬件的块级存储访问。
早期的SAN采用的是光纤通道(FC,Fiber Channel)技术,iSCSI协议出现以后,可以直接利用现有的TCP/IP网络传输,因此SAN分为FC SAN和IP SAN。
优点:
相比DAS,SAN使存储设备从服务器中独立了出来,实现了服务器层次上的存储资源共享,服务器和存储设备之间可以相隔更远的距离;
集中的存储设备替代多个独立的存储设备,支持存储容量共享,提高了空间利用率;
可以通过软件集中管理和控制SAN上的存储设备;
NAS和SAN的区别:
DAS和SAN输出的是存储设备接口,前端各节点的内核分别维护文件锁,若前端节点之间要求同时读写而又不能共享锁信息,则可能产生资源争用问题,而NAS输出是的文件系统接口,文件锁由提供NAS的主机维护,所以不会产生资源争用问题
◆NAS和SAN各自的适用场景:
NAS直接输出的是文件系统,客户端容易接入;
NAS适用于高效的文件共享任务中,基于网络的文件级锁提供了高级并发访问保护的功能;
NAS直接在公共区域网络上进行数据传输,没有距离限制,但会消耗网络带宽,尤其不适用于数据备份恢复等大数据量的场景。
SAN在数据块传输和扩展性方面表现优秀,并能够有效地管理设备。特别是FC SAN,有独立于LAN的专用通道,传输速度很快。SAN适用于关键任务应用、存储集中、备份恢复和高可用性计算等方面。
二、IP SAN原理解析
SCSI协议是在主机和存储设备之间传送命令、状态和块数据的一种接口标准。类似的接口标准还有IDE,SATA等
iSCSI可以实现在IP网络上运行SCSI协议,进行SCSI指令和数据块的传输。
具体的工作流程如下:
①iSCSI系统由SCSI适配器发送一个SCSI命令。
②SCSI指令被封装到TCP/IP包中并送入以太网络。
③接收方从TCP/IP包中提取SCSI指令并执行相关操作。
④把返回的SCSI指令和数据封装到TCP/IP包中,将它们发回到发送方。
⑤系统提取出数据或SCSI指令,并把它们传回SCSI子系统。
target的存储设备并非必须为支持SCSI协议的块设备,target的内核在解码SCSI指令后完全可以以其它的接口标准如IDE、SATA等与本地的块设备交互,只是反馈给initiator时再采用SCSI协议和ISCSI封装即可。
三、使用iscsi构建IP SAN存储网络
说明:
iscsi服务端主机上可配置多个target,一个target内可配置多个LUN。LUN的全称是Logical Unit Number,即逻辑单元号,LUN ID用来标记存储设备,一个存储设备可加入多个target,在各个target内的LUN ID可能不同。
每个target及initiator都要有一个名字,其格式为:
iqn.yyyy-mm.reverse-domain-name:string[.substring]
iqn.2014-09.com.magedu:ttarget
1、配置target
⑴准备要共享的设备,这里使用本地磁盘上的新分区
# fdisk /dev/sda
# partprobe
[root@node1 ~]# fdisk /dev/sda
...
[root@node1 ~]# partx -a /dev/sda
...
[root@node1 ~]# partx -a /dev/sda
...
[root@node1 ~]# fdisk -l
Disk /dev/sda: 32.2 GB, 32212254720 bytes
255 heads, 63 sectors/track, 3916 cylinders
Units = cylinders of 16065 * 512 = 8225280 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disk identifier: 0x000f3804
Device Boot Start End Blocks Id System
/dev/sda1 * 1 26 204800 83 Linux
Partition 1 does not end on cylinder boundary.
/dev/sda2 26 1332 10485760 83 Linux
/dev/sda3 1332 1593 2097152 82 Linux swap / Solaris
/dev/sda4 1593 3916 18666534 5 Extended
/dev/sda5 1593 2246 5252227+ 83 Linux
/dev/sda6 2247 2900 5253223+ 83 Linux
⑵安装iscsi服务端程序
scsi-target-utils
# service tgtd start
# chkconfig tgtd on
3260端口上
[root@node1 ~]# yum -y install scsi-target-utils
...
[root@node1 ~]# rpm -ql scsi-target-utils
/etc/rc.d/init.d/tgtd #服务脚本
/etc/sysconfig/tgtd
/etc/tgt/targets.conf #配置文件
/usr/sbin/tgt-admin
/usr/sbin/tgt-setup-lun
/usr/sbin/tgtadm #配置命令
/usr/sbin/tgtd
/usr/sbin/tgtimg
/usr/share/doc/scsi-target-utils-1.0.24
...
[root@node1 ~]# chkconfig tgtd on
[root@node1 ~]# service tgtd start
Starting SCSI target daemon: [ OK ]
[root@node1 ~]# netstat -tlnp | grep tgtd
tcp 0 0 0.0.0.0:3260 0.0.0.0:* LISTEN 61228/tgtd
tcp 0 0 :::3260 :::* LISTEN 61228/tgtd
⑶scsi-target-utils有两种配置方式:
命令行配置方式:tgtadm
注意:使用tgtadm配置的target信息在tdtd服务重启后会消失
用法:tgtadm --lld [driver] --op [operation] --mode [mode] [OPTION]...
①添加一个新的 target,且其ID为 [id],名字为 [name];target0已被系统预留
--lld [driver] --op new --mode target --tid [id] --targetname [name]
tgtadm --lld iscsi --op new --mode target --tid 1 -T iqn.2013-05.com.magedu:tsan
②显示所有或某个特定的target
--lld [driver] --op show --mode target [--tid [id]]
tgtadm --lld iscsi --op show --mode target
③向某ID为[id]的设备上添加一个新的LUN,其号码为[lun],且此设备提供给initiator使用。[path]是某“块设备”的路径,此块设备也可以是raid或lvm设备。lun0已被系统预留。
--lld [driver] --op new --mode logicalunit --tid [id] --lun [lun] --backing-store [path]
tgtadm --lld iscsi --op new --mode logicalunit --tid 1 --lun 1 -b /dev/sda5
④删除ID为[id]的target
--lld [driver] --op delete --mode target --tid [id]
⑤删除target [id]中的LUN [lun]:
-lld [driver] --op delete --mode logicalunit --tid [id] --lun [lun]
⑥定义某target的基于主机的访问控制列表,其中,[address]表示允许访问此target的initiator客户端的列表:
--lld [driver] --op bind --mode target --tid [id] --initiator-address [address]
tgtadm --lld iscsi --op bind --mode target --tid 1 -I 192.168.30.0/24
⑦解除target [id]的访问控制列表中[address]的访问控制权限:
--lld [driver] --op unbind --mode target --tid [id] --initiator-address [address]
[root@node1 ~]# tgtadm --lld iscsi --op new --mode target --tid 1 --targetname iqn.2016-05.com.magedu:target1
[root@node1 ~]# tgtadm --lld iscsi --op new --mode logicalunit --tid 1 --lun 1 -b /dev/sda5
[root@node1 ~]# tgtadm --lld iscsi --op new --mode logicalunit --tid 1 --lun 2 -b /dev/sda6
[root@node1 ~]# tgtadm --lld iscsi --op show --mode target
Target 1: iqn.2016-05.com.magedu:target1
System information:
Driver: iscsi
State: ready
I_T nexus information:
LUN information:
LUN: 0
Type: controller
SCSI ID: IET 00010000
SCSI SN: beaf10
Size: 0 MB, Block size: 1
Online: Yes
Removable media: No
Prevent removal: No
Readonly: No
Backing store type: null
Backing store path: None
Backing store flags:
LUN: 1
Type: disk
SCSI ID: IET 00010001
SCSI SN: beaf11
Size: 5378 MB, Block size: 512
Online: Yes
Removable media: No
Prevent removal: No
Readonly: No
Backing store type: rdwr
Backing store path: /dev/sda5
Backing store flags:
LUN: 2
Type: disk
SCSI ID: IET 00010002
SCSI SN: beaf12
Size: 5379 MB, Block size: 512
Online: Yes
Removable media: No
Prevent removal: No
Readonly: No
Backing store type: rdwr
Backing store path: /dev/sda6
Backing store flags:
Account information:
ACL information:
[root@node1 ~]# tgtadm --lld iscsi --op bind --mode target --tid 1 -I 192.168.30.0/24
/etc/tgt/targets.conf,定义target和lun等
<target iqn.2016-05.com.magedu:target1>
backing-store /dev/sda5
backing-store /dev/sda6
initiator-address 192.168.30.0/24
</target>
[root@node1 ~]# tgtadm --lld iscsi --op delete --mode target --tid 1 #删除指定的target
[root@node1 ~]# tgtadm --lld iscsi --op show --mode target
[root@node1 ~]# vim /etc/tgt/targets.conf
...
<target iqn.2016-05.com.magedu:target1>
backing-store /dev/sda5
backing-store /dev/sda6
initiator-address 192.168.30.0/24
</target>
...
[root@node1 ~]# service tgtd reload #重读配置文件
Updating SCSI target daemon configuration: [ OK ]
[root@node1 ~]# tgtadm --lld iscsi --op show --mode target
Target 1: iqn.2016-05.com.magedu:target1
System information:
Driver: iscsi
State: ready
I_T nexus information:
LUN information:
LUN: 0
Type: controller
......
LUN: 1
......
Backing store type: rdwr
Backing store path: /dev/sda5
Backing store flags:
LUN: 2
......
Backing store type: rdwr
Backing store path: /dev/sda6
Backing store flags:
Account information:
ACL information:
192.168.30.0/24
2、initiator配置
⑴安装iscsi客户端程序包
iscsi-initiator-utils
# echo "InitiatorName=`iscsi-iname -p iqn.2016-05.com.magedu`" > /etc/iscsi/initiatorname.iscsi
iscsi-iname命令生成,也可自定义。安装程序包时默认已在initiatorname.iscsi生成了一个名称。
# echo "InitiatorAlias=initiator1" >> /etc/iscsi/initiatorname.iscsi
# service iscsi start
# chkconfig iscsi on
[root@node2 ~]# yum -y install iscsi-initiator-utils
...
[root@node2 ~]# rpm -ql iscsi-initiator-utils
/etc/NetworkManager
/etc/NetworkManager/dispatcher.d
/etc/NetworkManager/dispatcher.d/04-iscsi
/etc/iscsi
/etc/iscsi/iscsid.conf #配置文件
/etc/logrotate.d/iscsiuiolog
/etc/rc.d/init.d/iscsi
/etc/rc.d/init.d/iscsid
/sbin/brcm_iscsiuio
/sbin/iscsi-iname #用于给initiator生成一个名称
/sbin/iscsiadm
/sbin/iscsid
/sbin/iscsistart
/sbin/iscsiuio
...
/var/lib/iscsi/ifaces
/var/lib/iscsi/isns
/var/lib/iscsi/nodes
/var/lib/iscsi/send_targets #inititor会将发现的target信息保存于该目录中
/var/lib/iscsi/slp
/var/lib/iscsi/static
/var/lock/iscsi
[root@node2 ~]# vim /etc/iscsi/initiatorname.iscsi
InitiatorName=iqn.2016-05.com.magedu:node2
[root@node2 ~]# service iscsi start
[root@node2 ~]# lsmod | grep scsi
mptscsih 36700 1 mptspi
mptbase 93615 2 mptspi,mptscsih
scsi_transport_spi 25863 1 mptspi
⑵iscsiadm工具的使用:
iscsiadm是个模式化的工具,其模式可通过-m或--mode选项指定,常见的模式有discovery、node、fw、session、host、iface几个,如果没有额外指定其它选项,则discovery和node会显示其相关的所有记录;session用于显示所有的活动会话和连接,fw显示所有的启动固件值,host显示所有的iSCSI主机,iface显示/var/lib/iscsi/ifaces目录中的所有ifaces设定。
iscsiadm -m discovery
iscsiadm -m discovery -t st -p 192.168.30.10
iscsiadm -m node
iscsiadm -m node -T iqn.2016-05.com.magedu:target1 -p 192.168.30.10 -l
选项:
-d, --debug=debug_level 显示debug信息,级别为0-8;
-l, --login
-t, --type=type 这里可以使用的类型为sendtargets(可简写为st)、slp、fw和 isns,此选项仅用于discovery模式,且目前仅支持st、fw和isns;其中st表示允许每个iSCSI target发送一个可用target列表给initiator;
-p, --portal=ip[:port] 指定target服务的IP和端口;
-m, --mode op 可用的mode有discovery, node, fw, host iface 和 session
-T, --targetname=targetname 用于指定target的名字
-u, --logout
-o, --op=OPEARTION:指定针对discoverydb数据库的操作,其仅能为new、delete、update、show和nonpersistent其中之一;
-I, --interface=[iface]:指定执行操作的iSCSI接口,这些接口定义在/var/lib/iscsi/ifaces中;
查看会话信息:iscsiadm -m session -s
[root@node2 ~]# iscsiadm -m discovery -t st -p 192.168.30.10 #发现target
Starting iscsid: [ OK ]
192.168.30.10:3260,1 iqn.2016-05.com.magedu:target1
[root@node2 ~]# ls /var/lib/iscsi/send_targets/ #initiator会给发现的target保存一份记录
192.168.30.10,3260
[root@node2 ~]# iscsiadm -m node -T iqn.2016-05.com.magedu:target1 -p 192.168.30.10 -l #登录指定iscsi服务器上的指定target
Logging in to [iface: default, target: iqn.2016-05.com.magedu:target1, portal: 192.168.30.10,3260] (multiple)
Login to [iface: default, target: iqn.2016-05.com.magedu:target1, portal: 192.168.30.10,3260] successful.
[root@node2 ~]# iscsiadm -m session -s
Stats for session [sid: 4, target: iqn.2016-05.com.magedu:target1, portal: 192.168.30.10,3260]
iSCSI SNMP:
txdata_octets: 38068
rxdata_octets: 1177772
noptx_pdus: 0
scsicmd_pdus: 341
tmfcmd_pdus: 0
login_pdus: 0
......
[root@node2 ~]# lsblk
NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINT
sda 8:0 0 30G 0 disk
├─sda1 8:1 0 200M 0 part /boot
├─sda2 8:2 0 10G 0 part /
└─sda3 8:3 0 2G 0 part [SWAP]
sr0 11:0 1 4.2G 0 rom
sdb 8:16 0 5G 0 disk
sdc 8:32 0 5G 0 disk
[root@node2 ~]# fdisk -l /dev/sd[b-c]
Disk /dev/sdb: 5378 MB, 5378280960 bytes
166 heads, 62 sectors/track, 1020 cylinders
Units = cylinders of 10292 * 512 = 5269504 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disk identifier: 0x00000000
Disk /dev/sdc: 5379 MB, 5379300864 bytes
166 heads, 62 sectors/track, 1020 cylinders
Units = cylinders of 10292 * 512 = 5269504 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disk identifier: 0x00000000
[root@node2 ~]# fdisk /dev/sdb #可对iscsi存储设备进行分区格式化
...
Command (m for help): n
Command action
e extended
p primary partition (1-4)
p
Partition number (1-4): 1
First cylinder (1-1020, default 1):
Using default value 1
Last cylinder, +cylinders or +size{K,M,G} (1-1020, default 1020): 2G
Command (m for help): p
Disk /dev/sdb: 5378 MB, 5378280960 bytes
166 heads, 62 sectors/track, 1020 cylinders
Units = cylinders of 10292 * 512 = 5269504 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disk identifier: 0x1aca869b
Device Boot Start End Blocks Id System
/dev/sdb1 1 2 10261 83 Linux
Command (m for help): w
The partition table has been altered!
Calling ioctl() to re-read partition table.
Syncing disks.
[root@node2 ~]# partx -a /dev/sdb
BLKPG: Device or resource busy
error adding partition 1
[root@node2 ~]# mke2fs -t ext4 /dev/sdb1
...
Writing inode tables: done
Creating journal (1024 blocks): done
Writing superblocks and filesystem accounting information: done
This filesystem will be automatically checked every 20 mounts or
180 days, whichever comes first. Use tune2fs -c or -i to override.
[root@node2 ~]# mount /dev/sdb1 /mnt
[root@node2 ~]# cp /etc/fstab /mnt/
[root@node2 ~]# umount /mnt
配置另一个initiator:
[root@node3 ~]# yum -y install iscsi-initiator-utils
...
[root@node3 ~]# vim /etc/iscsi/initiatorname.iscsi
InitiatorName=iqn.2016-05.com.magedu:node3
[root@node3 ~]# service iscsi start
[root@node3 ~]# iscsiadm -m discovery -t st -p 192.168.30.10
Starting iscsid: [ OK ]
192.168.30.10:3260,1 iqn.2016-05.com.magedu:target1
[root@node3 ~]# iscsiadm -m node -T iqn.2016-05.com.magedu:target1 -p 192.168.30.10 -l
Logging in to [iface: default, target: iqn.2016-05.com.magedu:target1, portal: 192.168.30.10,3260] (multiple)
Login to [iface: default, target: iqn.2016-05.com.magedu:target1, portal: 192.168.30.10,3260] successful.
[root@node3 ~]# lsblk
NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINT
sda 8:0 0 30G 0 disk
├─sda1 8:1 0 200M 0 part /boot
├─sda2 8:2 0 10G 0 part /
└─sda3 8:3 0 2G 0 part [SWAP]
sr0 11:0 1 4.2G 0 rom
sdb 8:16 0 5G 0 disk
└─sdb1 8:17 0 10M 0 part
sdc 8:32 0 5G 0 disk
[root@node3 ~]# mount /dev/sdb1 /mnt
[root@node3 ~]# ls /mnt #可以看到上一个initiator存入的文件
fstab lost+found
#若想结束会话并将该target的发现记录删除,可这样做:
[root@node3 ~]# umount /mnt
[root@node3 ~]# iscsiadm -m node -T iqn.2016-05.com.magedu:target1 -p 192.168.30.10 -u #登出会话
Logging out of session [sid: 2, target: iqn.2016-05.com.magedu:target1, portal: 192.168.30.10,3260]
Logout of [sid: 2, target: iqn.2016-05.com.magedu:target1, portal: 192.168.30.10,3260] successful.
[root@node3 ~]# iscsiadm -m node -T iqn.2016-05.com.magedu:target1 -p 192.168.30.10 -o delete
[root@node3 ~]# ls /var/lib/iscsi/send_targets/
192.168.30.10,3260
[root@node3 ~]# rm -rf /var/lib/iscsi/send_targets/192.168.30.10,3260
注意:target不宜被多个initiator同时挂载使用,否则会产生资源争用。
3、target的认证机制
⑴方式一:基于IP认证
例如:tgtadm --lld iscsi --op bind --mode target --tid 1 -I 192.168.30.0/24
实际环境中建议在×××的基础上做基于IP的认证
⑵方式二:基于用户认证,CHAP,单方向认证;
initiator端不能验证target端,不建议使用这种方式。
①在target端创建帐号christina,并为其授予访问某tid的权限:
# tgtadm --lld iscsi --op new --mode account --user magedu --password 123456
接下来还要将用户与某target进行绑定:
# tgtadm --lld iscsi --op bind --mode account --tid 1 --user magedu
# tgtadm --lld iscsi --op show --mode account
②编辑initiator端主配置文件,配置客户端登录target时使用此帐号和密码:
# vim /etc/iscsi/iscsid.conf
取消如下项的注释:
# node.session.auth.authmethod = CHAP
# node.session.auth.username = username
# node.session.auth.password = password
而后,将后两项的用户名密码设置为target端设置的用户名和密码:
node.session.auth.username = magedu
node.session.auth.password = 123456
如果此前尚未登录过此target,接下来直接发现并登入即可。否则,则需要按照下面的第三步实现认证的启用。
③如果initiator端已经登录过此target,此时还需要先注销登录后重启iscsid服务,并在删除此前生成的database后重新发现target,并重新登入,过程如下:
# iscsiadm -m session -r sid -u
# iscsiadm -m node -T iqn.2010-8.com.example.ts:disk1 -p 192.168.0.11:3260 -u
# iscsiadm -m node -T iqn.2010-8.com.example.ts:disk1 -p 192.168.0.11:3260 -o delete
# rm -rf /var/lib/iscsi/send_targets/192.168.0.11,3260
# service iscsid restart
# iscsiadm -m discovery -t sendtargets -p 192.168.0.11
# iscsiadm -m node -T iqn.2010-8.com.example.ts:disk1 -p 192.168.0.11:3260 -l
说明:其中的target名称和target主机地址可按实际情况修改
https://blog.51cto.com/9124573/1775663