###############################

SCSI

SAN

ISCSI

SAN和NAS的对比

ISCSI+gfs2+cLVM的实现

###############################


SCSI

计算机体系结构

  • CPU:核心组件,负责从memory中读取数据并进行处理。

  • Memory:核心组件,通过北桥与外围存储设备进行交换,作为易失性存储有极高的存储效率,但断电后数据会丢失。

  • IDE:有限的接口上,能够连接的设备有限,IDE的控制器在数据传输过程中的协议封装能力很差,整个传输过程需要大量CPU时钟周期的参与,这就意味着CPU要花费大量的时候完成数据的读入和写出,在业务处理比较繁忙和CPU资源极尤为重要的场合下是无法忍受的。

  • SCSI:是一种I/O技术,SCSI规范了一种并行的I/O总线和相关的协议,除了硬盘转速上的提升外,总线的适配器HBAHostBusAdapter)卡中内置了控制芯片,此控制芯片可以完成协议的封装,可以大量降低CPU的参与,此外由于SCSI的数据传输是以块的方式进行的,因此它具有以下特点设备无关性、多设备并行、高带宽、低系统开销

SCSI使用体系结构

  • 窄SCSI总线:最多允许8个SCSI设备和它进行连接。

  • 宽SCSI总线:最多允许16个不同的SCSI设备和它进行连接

  • SCSI ID:一个独立的SCSI总线按照规格不同可以支持8或16个SCSI设备,设备的编号需要通过SCSI ID(Target)来进行控制,系统中每个SCSI设备都必须有自己唯一的SCSI ID,SCSI ID实际上就是这些设备的地址。

SCSI的局限性

  • 传输距离:由于SCSI线缆的长度有限,限制了SCSI的延展性。

  • 服务主机:Target数量限制了可服务的主机数。



SAN

  • 能够通过非SCSI线缆传输SCSI协议报文,并且能将其路由至目标存储设备的网络成为Storage Area Network(区域存储网络)。


SCSI协议报文

  • Physical Interconnects and Transport Protocols:定义物理传输介质和传输报文格式,通过光信道传输就成为FCSAN,通过IP网络传输就成为IPSAN

  • Shared Command Set:SCSI共享(公共)命令集,定义存储或读取等相关命令。

  • SCSI Device-Type Specific Command Sets:不同SCSI设备类型特有的命令。

  • Common Access Method:公共访问方法。


ISCSI

IPSAN和FCSAN的对比

  • FCSAN:需要FC的HBA,存储端互相也需要FC的交换机或者SCSI线缆,应用程序存储数据由Adapter Driver向存储网络发起请求并完成数据存取。

  • IPSAN:应用程序的请求先交由SCSI驱动封装(协议报文各种指令),再由ISCSI驱动封装(用于联系ISCSI服务器端),借助于TCP/IP网络发送至ISCSI服务器端。

IPSAN的传输过程

  • ISCSI服务端:通过安装一款成熟的存储管理软件ISCSI Target,也称为Target。

  • ISCSI客户端:可以是硬件,也可以是安装iscsi客户端软,称为Initiator。客户端的连接方式有以下三种:

  • 以太网+initiator软件成本低,但需要占用客户端主机部分资源用于ISCSI和TCP/IP协议之间的解析, 适用于低I/O带宽的环境下。

  • 硬件TOE网卡+initiatorTOETCP Offload Engine)功能的智能以太网卡可以完成ISCSI的封装,但SCSI封装仍以软件方式运作,使得客户端主机可以从繁忙的协议中解脱出来,大幅度提高数据传输速率,降低了客户端主机资源消耗。但TOE功能的网卡,成本较高。

  • ISCSI HBA卡连接:不需要安装客户端软件,全部靠硬件,数据传输性能最好,但成本很高,客户端数量和性价比成反比。


SAN和NAS的对比

注释:由于SAN是在DAS的基础之上增加了延展性,因此下图以DAS作比较:

结论:从图中可以看出NAS的文件系统在服务器端,而SAN的文件系统在客户端,因为SAN的客户端可以实现对分区的创建格式化等操作,而NAS不可以。因此SAN经常配合集群文件系统(gfs2、ocfs)一起使用,为的就是避免多个Initiator对Target的同一资源在同一时刻进行征用带来的脑裂。


ISCSI+gfs2+cLVM的实现

架构图如下:

部署Target端

安装软件包

yum install scsi-target-utils

查看当前磁盘状况(将/dev/sdb2发布出去3GB)

[root@localhost yum.repos.d]# fdisk -l
Disk /dev/sdb: 21.4 GB, 21474836480 bytes
255 heads, 63 sectors/track, 2610 cylinders
Units = cylinders of 16065 * 512 = 8225280 bytes
   Device Boot      Start         End      Blocks   Id  System
/dev/sdb1               1        1217     9775521   83  Linux
/dev/sdb2            1218        1583     2939895   83  Linux

常用配置

/etc/tgt/targets.conf   配置文件的方式来管理target
/etc/sbin/tgt-admin     通过配置文件定义
/usr/sbin/tgtadm        通过命令行的方式管来target
service tgtd start      启动服务

编辑配置文件vim /etc/tgt/targets.conf


        backing-store /dev/sdb2
        initator-address 192.168.1.0/24

启动服务

service tgtd start

命令行方式配置

tgtadm --lld iscsi --mode logicalunit --op new --tid 2 --lun 1 --backing-store /dev/sdb2
    tgtadm --lld iscsi --mode target --op bind --tid 2 --initiator-address 192.168.1.0/24

部署各节点

安装软件包

yum install -y cman rgmanager gfs2-utils vm2-cluster

确保个节点hosts文件和hostname为如下

[root@node3 ~]# cat /etc/hosts
192.168.1.21    node1.soulboy.com node1
192.168.1.22    node2.soulboy.com node2
192.168.1.23    node3.soulboy.com node3

各节点时间同步

ntpdate 192.168.1.101

集群逻辑卷 cLVM共享存储做成LVM,借用HA的机制,让多个节点可以同时对一个卷发起管理操作。

vim /etc/lvm/lvm.conf
locking_type = 3

定义集群名称

ccs_tool create tcluster

添加fence设备

ccs_tool addfence meatware fence_manual

添加集群成员

ccs_tool addnode -v 1 -n 1 -f meatware node1.soulboy.com
ccs_tool addnode -v 1 -n 2 -f meatware node2.soulboy.com
ccs_tool addnode -v 1 -n 3 -f meatware node3.soulboy.com

在各节点依次启动服务

service  cman  start                
service  rgmanager start

查看各节点信息

[root@node3 ~]#  ccs_tool lsnode
Cluster name: tcluster, config_version: 7
Nodename                        Votes Nodeid Fencetype
node1.soulboy.com                  1    1
node2.soulboy.com                  1    2
node3.soulboy.com

各节点安装initator配置并启动服务

yum --nogpgcheck localinstall iscsi-initiator-utils-6.2.0.872-16.el5.i386.rpm
service iscsi start 启动服务

各节点客户端执行发现和登陆操作

[root@localhost mydata]#  iscsiadm -m discovery -t sendtargets -p 192.168.1.50
192.168.1.50:3260,1 iqn.2013-08.com.soulboy:sdb1
192.168.1.50:3260,1 iqn.2013-08.com.soulboy:sdb2
[root@localhost mydata]#  iscsiadm -m node -T iqn.2013-08.com.soulboy:sdb2 -p 192.168.1.50 -l

在任意initator上对共享设备创建分区(各节点在本地识别成sdc)

fdisk /dev/sdc

在其他节点上执行

partprobe /dev/sdb

在节点三创建物理卷

[root@node3 ~]# pvcreate /dev/sdc

在节点二使用pvs命令查看

[root@node2 ~]# pvs
PV         VG         Fmt  Attr PSize  PFree
/dev/sda2  VolGroup00 lvm2 a--  19.88G    0
/dev/sdc              lvm2 a--   2.80G 2.80G

在节点三创建创建卷组

[root@node3 ~]# vgcreate clustervg /dev/sdc

在节点二使用vgs命令查看

[root@node2]# vgs
  VG         #PV #LV #SN Attr   VSize  VFree
  VolGroup00   1   2   0 wz--n- 19.88G      0
  clustervg    1   1   0 wz--nc  2.80G  2.80G

在节点二创建逻辑卷

[root@node2]# lvcreate -L 1G -n clusterlv clustervg

在节点三使用lvs命令查看

[root@node3 ~]# lvs
LV        VG         Attr   LSize  Origin Snap%  Move Log Copy%  Convert
LogVol00  VolGroup00 -wi-ao 17.88G                              
LogVol01  VolGroup00 -wi-ao  2.00G                              
clusterlv clustervg  -wi-a-  1.00G

在集群逻辑上使用集群文件系统(暂时先创建2个日志区域,加入两个节点)

mkfs.gfs2 -j 2 -p lock_dlm -t tcluster:lktb1 /dev/clustervg/clusterlv

各节点创建/mydata目录

mkdir /mydata

各节点挂载逻辑卷clustervg至本地/mydata目录中

mount -t gfs2 /dev/clustervg/clusterlv /mydata

查看信息

[root@node3 ~]# gfs2_tool df /mydata
/mydata:
  SB lock proto = "lock_dlm"
  SB lock table = "tcluster:lktb1"
  SB ondisk format = 1801
  SB multihost format = 1900
  Block size = 4096
  Journals = 2
  Resource Groups = 8
  Mounted lock proto = "lock_dlm"
  Mounted lock table = "tcluster:lktb1"
  Mounted host data = "jid=1:id=196610:first=0"
  Journal number = 1
  Lock module flags = 0
  Local flocks = FALSE
  Local caching = FALSE
  Type           Total Blocks   Used Blocks    Free Blocks    use%   
  ------------------------------------------------------------------------
  data           524196         66195          458001         13%
  inodes         458018         17             458001         0%

补充

#####立刻同步到磁盘
gfs2_tool settune /mydata new_files_directio 1
#####默认是60秒,日志刷新次数
log_flush_secs = 60                   
#####扩展逻辑卷物理边界至2GB(可以指定选项,不指默认就是扩展全部)
lvextend -L 2G /dev/clustervg/clusterlv
mount -t gfs2 /dev/clustervg/clusterlv /mnt
#####扩展逻辑卷逻辑编辑至2GB
gfs2_grow /dev/clustervg/clusterlv
#####磁盘检测命令
fsck.gfs2
#####冻结gfs文件系统(只能读,不能写)
gfs2_tool freeze /mydata
#####解冻,备份数据的时候可以用到。
gfs2_tool unfreeze /mydata
注释:扩展卷组需要iSCSI添加新的设备,和使用LVM一样创建PV,添加入卷组即可不在演示过程。

测试

节点二

[root@node2 mydata]# pwd
/mydata
[root@node2 mydata]# ls
[root@node2 mydata]# touch node2
[root@node2 mydata]# ls
node2

节点三

[root@node3 mydata]# pwd
/mydata
[root@node3 mydata]# ls
node2
[root@node3 mydata]# rm -rf node2

节点二

[root@node2 mydata]# pwd
/mydata
[root@node2 mydata]# ls