一、几种流行的存储技术

  1、NAS(Network Attached Storage,网络附加存储)基于标准网络协议实现数据传输,为网络中的各种不同操作系统的计算机提供文件共享和数据备份,NAS采用的是File Protocal存取方式;实现方案如nfs;

  2、DAS(Direct Attached Storage,直接附加存储)是指将存储设备通过总线(SCSI、PCI、IDE等)接口直接连接到一台服务器上使用,是最流行的存储方式。

    缺点:

       服务器本身容易成为系统瓶颈;

       服务器发生故障,数据不可访问; 
       对于多个服务器或多台PC的环境,每台PC或服务器单独拥有自己的存储设备,设备分散,不便管理;且存储空间不能在服务器之间动态分配,可能造成相当的资源浪费

  3、SAN(Storage Area Network,存储区域网络)是一种将存储设备、连接设备和接口集成在一个高速网络中的技术。在SAN网络中,所有的数据传输在高速、高带宽的网络中进行,SAN存储实现的是直接对物理硬件的块级存储访问

    早期的SAN采用的是光纤通道(FC,Fiber Channel)技术,iSCSI协议出现以后,可以直接利用现有的TCP/IP网络传输,因此SAN分为FC SANIP SAN

    优点:

      相比DAS,SAN使存储设备从服务器中独立了出来,实现了服务器层次上的存储资源共享,服务器和存储设备之间可以相隔更远的距离;

      集中的存储设备替代多个独立的存储设备,支持存储容量共享,提高了空间利用率;

      可以通过软件集中管理和控制SAN上的存储设备;

  ◆NAS和SAN的区别

      DAS和SAN输出的是存储设备接口,前端各节点的内核分别维护文件锁,若前端节点之间要求同时读写而又不能共享锁信息,则可能产生资源争用问题,而NAS输出是的文件系统接口,文件锁由提供NAS的主机维护,所以不会产生资源争用问题

wKiom1c97oTR01EAAApAJ6nQWVE953.png

   ◆NAS和SAN各自的适用场景:

      NAS直接输出的是文件系统,客户端容易接入;

      NAS适用于高效的文件共享任务中,基于网络的文件级锁提供了高级并发访问保护的功能;

      NAS直接在公共区域网络上进行数据传输,没有距离限制,但会消耗网络带宽,尤其不适用于数据备份恢复等大数据量的场景


      SAN在数据块传输和扩展性方面表现优秀,并能够有效地管理设备。特别是FC SAN,有独立于LAN的专用通道,传输速度很快。SAN适用于关键任务应用、存储集中、备份恢复和高可用性计算等方面


二、IP SAN原理解析

wKioL1c9wcWw85KiAALr6OAAEL4359.png

   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存储网络

wKiom1c-xgDiSGQCAAA7OIEbXsA375.png


  说明:

    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服务端程序

       # yum -y install scsi-target-utils

       # service tgtd start

       # chkconfig tgtd on

       # netstat -tnlp | grep 3260   #监听在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客户端程序包

       # yum install iscsi-initiator-utils 

       # echo "InitiatorName=`iscsi-iname -p iqn.2016-05.com.magedu`" > /etc/iscsi/initiatorname.iscsi

           #给initiator一个名称,可用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 [ -d debug_level ] [ -P printlevel ] [ -I iface -t type -p ip:port [ -l ] ]

          例:iscsiadm -m discovery -t st -p 192.168.30.10

        iscsiadm -m node [ -d debug_level ] [ -P printlevel ] [ -L all,manual,automatic ] [ -U all,manual,automatic ] [ [ -T tar-getname -p ip:port -I iface ] [ -l | -u | -R | -s] ] [ [ -o operation ]

          例: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主机地址可按实际情况修改