###############################
SCSI
SAN
ISCSI
SAN和NAS的对比
ISCSI+gfs2+cLVM的实现
###############################
SCSI
计算机体系结构
CPU:核心组件,负责从memory中读取数据并进行处理。
Memory:核心组件,通过北桥与外围存储设备进行交换,作为易失性存储有极高的存储效率,但断电后数据会丢失。
IDE:有限的接口上,能够连接的设备有限,IDE的控制器在数据传输过程中的协议封装能力很差,整个传输过程需要大量CPU时钟周期的参与,这就意味着CPU要花费大量的时候完成数据的读入和写出,在业务处理比较繁忙和CPU资源极尤为重要的场合下是无法忍受的。
SCSI:是一种I/O技术,SCSI规范了一种并行的I/O总线和相关的协议,除了硬盘转速上的提升外,总线的适配器HBA(HostBusAdapter)卡中内置了控制芯片,此控制芯片可以完成协议的封装,可以大量降低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网卡+initiator:TOE(TCP 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
<target iqn.2013-08.com.soulboy:sdb1> backing-store /dev/sdb2 initator-address 192.168.1.0/24 </target>
启动服务
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
本文出自 “星矢” 博客,转载请与作者联系!