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

SCSI

SAN

ISCSI

SAN和NAS的对比

ISCSI+gfs2+cLVM的实现

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


SCSI

计算机体系结构

101813573.png

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

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

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

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

SCSI使用体系结构

104549352.png

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

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

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

SCSI的局限性

105949434.png

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

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



SAN

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

113205604.png


SCSI协议报文

113957158.png

  • 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的对比

120511922.png

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

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

IPSAN的传输过程

122335429.png

124959588.png

  • 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作比较:

123916442.png

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


ISCSI+gfs2+cLVM的实现

架构图如下:

140212644.png

部署Target端

安装软件包

1
yum  install  scsi-target-utils

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

1
2
3
4
5
6
7
[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

常用配置 

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

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

1
2
3
4
<target iqn.2013-08.com.soulboy:sdb1>
         backing-store  /dev/sdb2
         initator-address 192.168.1.0 /24
< /target >

启动服务

1
service tgtd start

命令行方式配置

1
2
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

部署各节点

安装软件包

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

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

1
2
3
4
[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

各节点时间同步

1
ntpdate 192.168.1.101

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

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

定义集群名称

1
ccs_tool create tcluster

添加fence设备

1
ccs_tool addfence meatware fence_manual

添加集群成员

1
2
3
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

在各节点依次启动服务

1
2
service  cman  start               
service  rgmanager start

查看各节点信息

1
2
3
4
5
6
[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配置并启动服务

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

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

1
2
3
4
[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)

1
fdisk  /dev/sdc

在其他节点上执行

1
partprobe  /dev/sdb

在节点三创建物理卷

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

在节点二使用pvs命令查看

1
2
3
4
[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

在节点三创建创建卷组

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

在节点二使用vgs命令查看

1
2
3
4
[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

在节点二创建逻辑卷

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

在节点三使用lvs命令查看

1
2
3
4
5
[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个日志区域,加入两个节点)

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

各节点创建/mydata目录

1
mkdir  /mydata

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

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

查看信息

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
[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%

补充

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
#####立刻同步到磁盘
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,添加入卷组即可不在演示过程。

测试

节点二

1
2
3
4
5
6
[root@node2 mydata] # pwd
/mydata
[root@node2 mydata] # ls
[root@node2 mydata] # touch node2
[root@node2 mydata] # ls
node2

节点三

1
2
3
4
5
[root@node3 mydata] # pwd
/mydata
[root@node3 mydata] # ls
node2
[root@node3 mydata] # rm -rf node2

节点二

1
2
3
[root@node2 mydata] # pwd
/mydata
[root@node2 mydata] # ls