iSCSI 及 iSCSI配置

来源:互联网 发布:keras与tensorflow 编辑:程序博客网 时间:2024/05/21 06:37

iSCSI 及 iSCSI配置

       在集群系统中存储是很重要的一部分,而且存储相关的内容:从硬件设备、接口到文件系统、传输网络、数据协议等,涉及的知识非常多,这里不发散,重点认识iSCSI。在前面《高可用集群》简单认识了DAS/NAS/SAN,下面将会认识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

       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实现

1、iSCSI Initiator

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

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

2、iSCSI Target

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

3、工作过程

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

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

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

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

1-3、iSCSI与FC SAN

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

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

1-4、SAN与NAS / iSCSI与NFS

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

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

2、相关准备配置

2-1、具体使用资源

1、各主机系统:RHEL 5.8 64bit

2、Target:

Soft:scsi-target-utils

IP:192.168.18.240

LUN1:/dev/sda5 50G(以分区代替)

LUN2:/dev/sda6 20G

2、三台节点主机node1,node2,node3:

Soft:iscsi-initiator-utils

Node1: IP:192.168.18.241 host name:node1.tjiyu,com;

Node2: IP:192.168.18.242 host name:node2.tjiyu.com;

Node3: IP:192.168.18.243 host name:node3.tjiyu.com;

2-2、配置前所需要的准备

       各节点Initiator和Target端需要做以下准备:

1、配置IP、关闭防火墙/SELINUX;

2、配置各节点名称;

3、时间同步;

       在前面《heartbeat v2 haresource 配置可用集群》说到的高可用集群已有详细介绍,这里就不再给出了。

       当然我们这里可以用Target端主机作为跳板机,因为很多相同的命令都要在各节点上执行,可以另外加一台跳板机,可以SSH连接各节点,这样就可以在跳板机上给各节点分发命令了。

       首先在Target上配置各节点的hostname,方便操作:

       然后生成Target端的SSH KEY,再发给到各主机,如下:

    [root@localhost ~]# ssh-keygen -t rsa -f ~/.ssh/id_rsa -P ''    [root@localhost ~]# ssh-copy-id -i .ssh/id_rsa.pub root@node3.tjiyu.com    [root@localhost ~]# ssh-copy-id -i .ssh/id_rsa.pub root@node3.tjiyu.com    [root@localhost ~]# ssh-copy-id -i .ssh/id_rsa.pub root@node3.tjiyu.com

       接着为命令前面常规部分设置为别名,方便操作,最后尝试给各节点同步时间,如下:

        [root@localhost ~]# alias ssh_node='for I in {1..3}; do ssh node$I'        [root@localhost ~]# ssh_node 'ntpdate cn.ntp.org.cn'; done

3、下载安装

       配置好yum源,直接在target端安装scsi-target-utils,这个只是iSCSI软件的管理工具(类似ipvsadm),具体的数据处理模块已整合在内核中,如下:

[root@localhost ~]# yum install scsi-target-utils

       各节点上分别执行安装iscsi-initiator-utils,当然也可以在Target上通过SSH执行,但那是串行的,不如分别在各节点上分别执行快,如下:

[root@node1 ~]# yum install iscsi-initiator-utils

4、认识配置工具

4-1、target端配置工具(tatadm)

       Target端安装scsi-target-util后,提供了相应的管理配置工具tgtadm,可以用target、LUN、用户都进管理,不过因为iSCSI模块工作在内核,tgtadm的配置只在内存中,下次开机重启不会生效,所以可以用过配置文件/etc/tgt/targets.conf来配置,启动时另一个工具tgt-adm会读取该文件。

       tatadm使用语法如下:

        tgtadm --lld [driver] --op [operation] --mode [mode] [OPTION]...        (1)、添加一个新的 target 且其ID为 [id], 名字为 [name].            --lld [driver] --op new --mode target --tid=[id] --targetname [name]        (2)、显示所有或某个特定的target:            --lld [driver] --op show --mode target [--tid=[id]]        (3)、向某ID为[id]的设备上添加一个新的LUN,其号码为[lun],且此设备提供给initiator使用。[path]是某"块设备"的路径,此块设备也可以是raid或lvm设备。lun0已经被系统预留。            --lld [driver] --op new --mode=logicalunit --tid=[id] --lun=[lun] --backing-store [path]        (4)、删除ID为[id]的target:            --lld [driver] --op delete --mode target --tid=[id]        (5)、删除target [id]中的LUN [lun]:            -lld [driver] --op delete --mode=logicalunit --tid=[id] --lun=[lun]        (6)、定义某target的基于主机的访问控制列表,其中,[address]表示允许访问此target的initiator客户端的列表:            --lld [driver] --op bind --mode=target --tid=[id] --initiator-address=[address]        (7)、解除target [id]的访问控制列表中[address]的访问控制权限:            --lld [driver] --op unbind --mode=target --tid=[id] --initiator-address=[address]

4-2、Initiator端配置工具(iscsiadm)

       而Initiator各节点安装iscsi-initiator-utils后,也提供了一些配置管理工具,其中最主要的是iscsiadm 命令,提供了对 iSCSI 目标节点、会话、连接以及发现记录的操作,iscsiadm使用语法如下:

        iscsiadm        -m, 同 --mode, 其选项有 discovery, node, fw(启动值), host, iface(iSCSI 接口)和 session。        -I,同 --interface, 表示接口。        -o, 同 --op, 可实现对数据库的操作,其选项有 new, delete, update 和 show。        -n, 同 --name, 指定其数据记录里的名字。        -t, 同 --type, 其选项有 sendtargets(st), fw 和 isns, 仅在 -m 模式为 discovery 时有效。        -p, 同 --portal, 指定其目标主机的 IP 地址和端口,默认端口为 3260。        -L, 同 --loginall,其选项有 all,manual 和 automatic,指定其登录会话时的类型。        -T, 同 --targetname,表示其目标名字。        -v, 同 --value,通常在 --op=update 时指定其值。

5、配置target端

5-1、创建分区当作LUN

       按上面的资源分配,在target端创建两个分区/dev/sda5和/dev/sda6,分别当作LUN,注意这时并不需要格式化文件系统,因为文件系统不在target端,过程如下:

        [root@localhost ~]# fdisk /dev/sda        [root@localhost ~]# partprobe /dev/sda        [root@localhost ~]# fdisk -l

5-2、启动tgtd服务

       启动target端的tgtd服务,并配置开机启动,查看网络连接情况,可以看到tgtd监听了tcp的3260端口,如下:

        [root@localhost ~]# chkconfig tgtd on        [root@localhost ~]# chkconfig tgtd --list        [root@localhost ~]# service tgtd start        [root@localhost ~]# netstat -tunlp |grep tgtd

5-3、创建target及LUN,并绑定网络

       先创建一个target,ID为1,名称为iqn.2016-10.com.tjiyu:mystore.disk1(全局唯一标识名);然后给该target绑定网络192.168.18.0/24,也就是对这个网络内的主机可以发现该target;接着给该target创建两个LUN,使用上面创建的两个分区,注意LUN的ID从1开始分配,因为0已经被target控制器占用了,如下:

         [root@localhost ~]# tgtadm --lld iscsi -o new -m target -t 1 -T iqn.2016-10.com.tjiyu:mystore.disk1        [root@localhost ~]# tgtadm -L iscsi -o bind -m target -t 1 -I 192.168.18.0/24        [root@localhost ~]# tgtadm -L iscsi -o new -m logicalunit -t 1 -l 1 -b /dev/sda5        [root@localhost ~]# tgtadm -L iscsi -o new -m logicalunit -t 1 -l 2 -b /dev/sda6

       查看下配置的信息,LUN的0已经被target控制器占用了,如下:

[root@localhost ~]# tgtadm -L iscsi -o show -m target

5-4、配置访问用户

       iSCSI可以配置基于IP或基于用户(CHAP)的认证方式,基于IP像上面绑定开放网络就可以了;基于用户除了绑定网络,还需要配置访问用户(如果使用基于用户的认证,必须首先开放基于IP的认证),CHAP是双向的认证机制,我们这里只配置单向的用户认证。

       先创建帐号tjiyu,并为其授予访问上面ID为1的target的权限(绑定),如下:

        [root@localhost ~]# tgtadm --lld iscsi --op new --mode account --user tjiyu --password 123456        [root@localhost ~]# tgtadm --lld iscsi --op bind --mode account --tid 1 --user tjiyu        [root@localhost ~]# tgtadm --lld iscsi --op show --mode account

6、配置各initiator节点

6-1、配置initiator名称

       分别在各节点配置initiator名称,名称也是iqn格式的(可以用iscsi-name生成),直接配置在文件/etc/iscsi/initiatorname.iscsi中就好,如下:

        [root@node1 ~]# vim /etc/iscsi/initiatorname.iscsi        [root@node1 ~]# cat /etc/iscsi/initiatorname.iscsi        InitiatorName=iqn.2016-10.com.tjiyu:node1_4rs3r3        InitiatorAlias=node1

6-2、配置target访问用户

       因为上面在target端创建并绑定了用户tjiyu,所以各Initiator节点需要先开放CHAP认证,并配置该用户信息,initiator配置文件为/etc/iscsi/iscsid.conf,在文件中修改这三项即可,注意,看清楚是哪三项,因为有几个配置相似,过程如下:

[root@node1 ~]# vim /etc/iscsi/iscsid.conf

6-3、启动各节点iscsi服务

       各节点执行的命令一样,可以在跳板机上执行,先配置开机启动,然后启动iscsi服务,注意,上面查看安装信息看到还有一个iscsid服务,它会随着iscsi服务一起启动的,如下:

        [root@localhost ~]# ssh_node 'chkconfig iscsi on'; done        [root@localhost ~]# ssh_node 'service iscsi start'; done

6-4、各节点发现target,并登录

       各节点要使用target的LUN必须先发现,再登录后才能用,发现操作指定target的IP地址,登录需要指定发现的target名称和IP/端口;注意,如果登录不成功,可能是因为上面的配置用户不对,修改正确后需要重启iscsi服务,重新发现target,不然还是登录不了,过程如下,

        [root@localhost ~]# ssh_node 'iscsiadm -m discovery -t st -p 192.168.18.240'; done        [root@localhost ~]# ssh_node 'iscsiadm -m node -T iqn.2016-10.com.tjiyu:mystore.disk1 -p 192.168.18.240:3260 -l'; done

       发现登录成功后,相关信息保存在/var/lib/iscsi/send_targets/目录下,下次启动会自动登录的;

       查看会话相关信息:

        Initiator:[root@node1 ~]# iscsiadm -m session -s        Target:[root@localhost ~]# tgtadm --lld iscsi --op show --mode target

7、测试

    Target的两个LUN在initiator端识别为两个磁盘设备,可以在上面进行分区、格式化文件系统等操作,就是本地的磁盘设备一样。不过它们在各节点上的设备名称可能不一样,这里因为开始都是一个硬盘,所有都一样。

7-1、创建分区,并格式化

       上面登录成功后,查看各节点的存储空间,发现各节点都多了两个磁盘设备,这两个磁盘设备就是我们上面创建target分区模拟的LUN,一个50G,另一个20G,如下:

[root@localhost ~]# ssh_node 'fdisk -l'; done

       然后在node1上操作,在50G的/dev/sdb上创建一个10G的分区,并格式化为ext3文件系统,如下:

        [root@node1 ~]# fdisk /dev/sdb        [root@node1 ~]# partprobe /dev/sdb        [root@node1 ~]# fdisk –l        [root@node1 ~]# mkfs.ext3 /dev/sdb1

7-2、各节点挂载测试

       上面在node1上分区/dev/sdb1后,在另外两个节点上可以查看到分区及创建的文件系统,不过却挂载不上去,需要partprobe /dev/sdb内核识别后才能挂载,在node3上挂载如下:

        [root@node3 ~]# partprobe /dev/sdb        [root@node3 ~]# mount /dev/sdb1 /mnt        [root@node3 ~]# ls /mnt 


       然后,在node1上复制/etc/fstab进去,然后在node2上也挂载,可以发现复制进去的文件,但在已经挂载的node3上却长时间看不到复制进去的文件,重新挂载后才能看到,如下:

       这说明多个节点同时挂载后,一个节点的操作和另外节点不是实时同步的,是在内存中有缓存的,所以这样用同时操作一个文件很可能会发生成崩溃,待后面解决

8、删除操作及target端文件配置

8-1、删除各节点登录信息

       先使各节点登出,然后再删除发现的的信息,最后把残留的目录也删除,过程如下:

        [root@localhost ~]# ssh_node 'iscsiadm -m node -T iqn.2016-10.com.tjiyu:mystore.disk1 -p 192.168.18.240:3260 -u'; done        [root@localhost ~]# ssh_node 'iscsiadm -m node -T iqn.2016-10.com.tjiyu:mystore.disk1 -p 192.168.18.240:3260 -o delete'; done        [root@localhost ~]# ssh_node 'rm -rf /var/lib/iscsi/send_targets/192.168.18.240*'; done

8-2、删除target端配置

       先解除绑定,再删除LUN,最后删除target,过程如下:

        [root@localhost ~]# tgtadm -L iscsi -o unbind -m target -t 1 -I 192.168.18.0/24        [root@localhost ~]# tgtadm -L iscsi -o delete -m logicalunit -t 1 -l 2        [root@localhost ~]# tgtadm -L iscsi -o delete -m logicalunit -t 1 -l 1        [root@localhost ~]# tgtadm -L iscsi -o delete -m target -t 1        [root@localhost ~]# tgtadm -L iscsi -o show -m target

8-3、文件配置target信息

       上面我们说过tgtadm配置的信息,重启后会失效,需要通过/etc/tgt//targets.conf配置文件来配置才不会;该配置文件里有很多样例,如配置不使用缓存等,配置信息如下:

        <target iqn.2016-10.com.tjiyu:mystore.disk1> #配置target名称            <backing-store /dev/sda5> #配置共享磁盘                vendor_id test #配置发行商(任意)                lun 6 #配置LUN号            </backing-store>            <backing-store /dev/sda6> #配置共享磁盘                vendor_id test #配置发行商(任意)                lun 8 #配置LUN号            </backing-store>            incominguser tjiyu 123456 #配置认证的用户名和密码            initiator-address 192.168.18.0/24 #配置允许的网段        </target>

       过程如下:

        [root@localhost ~]# vim /etc/tgt//targets.conf        [root@localhost ~]# service tgtd restart        [root@localhost ~]# tgtadm -L iscsi -o show -m target

8-4、各节点重新发现并登录

       和上面6-4一样,各节点重新发现target,并登录,如下:

        [root@localhost ~]# ssh_node 'iscsiadm -m discovery -t st -p 192.168.18.240'; done        [root@localhost ~]# ssh_node 'iscsiadm -m node -T iqn.2016-10.com.tjiyu:mystore.disk1 -p 192.168.18.240:3260 -l'; done

       然后在node1上查看,可以看到前面测试格式化的分区还在,不过从/dev/sdb1变为了/dev/sdc1,重新挂载,发现复制进去的文件也还在,如下:

 

 

       到这里,配置iSCSI应用就可以正常运行了,关于测试中发现的共享存储带来的问题,待后面解决,后面将在本文件的基础上进行集群文件系统gfs2及clvm的相关配置……

 

 

【参考资料】

1、iSCSI:http://baike.baidu.com/link?url=5OlHGOXZ8Su0TpG1GmAzHrlsJw6GHaAvo4IHjddVZ9RuKtZQANsq1lHe0WFURzBofmNVIVZGeNscvBZw-k6Kwa

2、常见的三种存储技术以及iSCSI协议:http://xslwahaha.blog.51cto.com/4738972/1617781

3、详解Linux配置iSCSI方法:http://tech.watchstor.com/storage-module-121394.htm

4、linux系统简单搭建iSCSI:http://cuchadanfan.blog.51cto.com/9940284/1696408

5、CentOS6.4+cman+rgmanager+iscsi+gfs2+cLVM 实现廉价的可扩展的集群共享存储:http://freeloda.blog.51cto.com/2033581/1279063

0 0