###############################
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