在這篇部落格中,小編要來講講SAN的原理以及實作啦,讀者應該還記得小編在前面在講HA和LB群集的時候解決後端的存儲用的技術是什麼麼,NAS(網絡附加存儲),當然這種技術的效率是比較低的啦,如果企業對于資料存儲的速率要求比較高的話,這種技術果斷不能滿足需求啦,是以就引出了SAN(存儲區域網絡)啦,簡單的說它提供一種塊級别的檔案共享,前方伺服器直接可以将後方存儲媒體當做本地磁盤來使用啦,人們采用包括光纖通道技術(這個速度可是相當的快啦,一般IDC都會采用這種技術)、磁盤陣列、錄音帶櫃、CD光牒櫃(en)的各種技術進行實作。
實作SAN的網絡類型
讀者想想在大多數的實體存儲中都是使用SCSI接口進行伺服器和磁盤驅動器裝置之間的通信。因為它們的總線拓撲結構(系統總線)并不适用于網絡環境,是以它們并沒有使用底層實體連接配接媒體(比如連接配接電纜)。相對地,它們采用其它底層通信協定作為鏡像層來實作網絡連接配接:
1.光纖通道協定 (FCP, Fibre Channel Protocol), 最常見的通過光纖通道來映射SCSI的一種連接配接方式(FC-SAN); 這一種的連接配接方式的效率是最高的,但是同時代價是最高的,主要貴在硬體裝置上,如光纖交換機,一般IDC都會使用這種技術 2.iSCSI, 基于TCP/IP的SCSI映射(IP-SAN); 這一種的效率要低很多,但是代價也要低太多啦,今天小編要實作的就是這一種啦 3.HyperSCSI, 基于以太網的SCSI映射; 4.ATA over Ethernet, 基于以太網的ATA映射; 5.使用光纖通道連接配接的FICON,常見與大型機環境; 6.Fibre Channel over Ethernet (FCoE),基于以太網的FC協定; 7.iSCSI Extensions for RDMA (iSER), 基于InfiniBand (IB)的iSCSI連接配接; 8.iFCP[1] 或 SANoIP[2] 基于IP網絡的光纖通道協定(FCP).
IP-SAN的實作
1. 網絡拓撲
<a href="http://wnqcmq.blog.51cto.com/attachment/201306/8/5200614_1370682711hOvg.jpg"></a>
2. 具體實作
這裡要使用到iSCSI技術,小編簡單介紹一下iSCSI,iSCSI利用了TCP/IP的port 860 和 3260 作為溝通的管道。透過兩部計算機之間利用iSCSI的協定來交換SCSI指令,讓計算機可以透過高速的區域網路集線來把SAN模拟成為本地的儲存裝置。
iSCSI使用 TCP/IP 協定(一般使用TCP端口860和3260)。 本質上,iSCSI 讓兩個主機通過 IP 網絡互相協商然後交換 SCSI 指令。這樣一來,iSCSI 就是用廣域網仿真了一個常用的高性能本地存儲總線,進而建立了一個存儲區域網路(SAN)。不像某些 SAN 協定,iSCSI 不需要專用的電纜;它可以在已有的交換和 IP 基礎架構上運作。
在使用上,前端的伺服器充當着initiator(發起者),後端的存儲充當着target,由前端伺服器找到後端的存儲,然後使用
軟體需求:
小編這裡的OS是linux 5.4 CD光牒自帶有相關的軟體包
1.後端存儲: scsi-target-utils-0.0-5.20080917snap.el5.i386.rpm //将後端存儲伺服器模拟成為target perl-Config-General-2.40-1.el5.noarch.rpm //target的依賴包 2.前端伺服器: iscsi-initiator-utils-6.2.0.871-0.10.el5.i386.rpm //将前端服務改變成為initiator
後端存儲配置:
Step 1. 安裝軟體包并啟動服務
# rpm -ivh perl-Config-General-2.40-1.el5.noarch.rpm
# rpm -ivh scsi-target-utils-0.0-5.20080917snap.el5.i386.rpm
安裝完成之後查詢一下軟體包都産生了哪些檔案
# rpm -ql scsi-target-utils
/etc/rc.d/init.d/tgtd //服務腳本
/etc/sysconfig/tgtd
/etc/tgt/targets.conf //配置檔案
/usr/sbin/tgt-admin
/usr/sbin/tgt-setup-lun
/usr/sbin/tgtadm //這個比較的常用啦,就是将存儲作為一種target資源,以便前端伺服器能找到
/usr/sbin/tgtd
/usr/share/doc/scsi-target-utils-0.0
/usr/share/doc/scsi-target-utils-0.0/README
/usr/share/doc/scsi-target-utils-0.0/README.iscsi
/usr/share/doc/scsi-target-utils-0.0/README.iser
/usr/share/doc/scsi-target-utils-0.0/README.lu_configuration
/usr/share/doc/scsi-target-utils-0.0/README.mmc
/usr/share/man/man8/tgt-admin.8.gz
/usr/share/man/man8/tgt-setup-lun.8.gz
/usr/share/man/man8/tgtadm.8.gz
啟動服務
# service tgtd start
Step 2. 建立target資源
tgtadm 文法
--lld [driver] --op new --mode target --tid=[id] --targetname [name] //添加資源
--lld [driver] --op delete --mode target --tid=[id] //删除資源
--lld [driver] --op show --mode target //檢視資源
--lld [driver] --op new --mode=logicalunit --tid=[id] --lun=[lun] --backing-store [path] //綁定磁盤
--lld [driver] --op bind --mode=target --tid=[id] --initiator-address=[address] //指定哪些IP端的伺服器能夠通路到target資源
# tgtadm --lld iscsi --op new --mode target --tid=1 --targetname iqn.2013-06.com.back:disk
小編這裡有/dev/sdb1可以作為target的磁盤
# tgtadm --lld iscsi --op new --mode=logicalunit --tid=1 --lun=1 --backing-store /dev/sdb1
# tgtadm --lld iscsi --op show --mode target //檢視資源情況
Target 1: iqn.2013-06.com.back:disk
System information:
Driver: iscsi
State: ready //狀态已經準備好了
I_T nexus information:
LUN information:
LUN: 0
Type: controller
SCSI ID: deadbeaf1:0
SCSI SN: beaf10
Size: 0 MB
Online: Yes
Removable media: No
Backing store: No backing store
LUN: 1 //這裡就是小編添加進的磁盤資訊啦
Type: disk
SCSI ID: deadbeaf1:1
SCSI SN: beaf11
Size: 10734 MB
Backing store: /dev/sdb1
Account information:
ACL information:
Step 3. 建立是算完成啦,還要考慮安全性啦,這裡基于IP位址進行限制
# tgtadm --lld iscsi --op bind --mode=target --tid=1 --initiator-address=192.168.30.0/24 //隻允許30網段的通路
再檢視一下資訊後方會多出下面的資訊啦
<a href="http://wnqcmq.blog.51cto.com/attachment/201306/8/5200614_1370682717VFqV.jpg"></a>
當然上述的配置可以直接寫在配置文檔中,以便以後使用
在/etc/tgt/targets.conf中添加下面内容就是了
<target iqn.2013-06.com.back:disk>
List of files to export as LUNs
backing-store /dev/sdb1
# Authentication :
# if no "incominguser" is specified, it is not used
#incominguser backup secretpass12
# Access control :
# defaults to ALL if no "initiator-address" is specified
initiator-address 192.168.30.0/24
</target>
Step 4. 基于CHAP的登陸認證(雙向認證)
依然修改/etc/tgt/targets.conf,找到# Authentication :添加下面的兩行
incominguser web1totarget 123456 //web1登陸的使用者名和密碼
incominguser web2totarget 123456 //web2登陸的使用者名和密碼
outgoinguser targettoweb 654321 //target向web伺服器進行認證
再次查詢一下target資源狀态
<a href="http://wnqcmq.blog.51cto.com/attachment/201306/8/5200614_1370682720G54u.jpg"></a>
前端伺服器配置
拿web1為例
# yum install iscsi-initiator-utils # service iscsi start Step 2. 初始化發起端名稱以及CHAP認證配置 # vim /etc/iscsi/initiatorname.iscsi InitiatorName=iqn.2013-06.com.web1 chap認證配置(雙向) # vim /etc/iscsi/iscsid.conf node.session.auth.authmethod = CHAP node.session.auth.username = web1totarget node.session.auth.password = 123456 node.session.auth.username_in = targettoweb node.session.auth.password_in = 654321 Step 3. 發起連接配接 # iscsiadm --mode discovery --type sendtargets --portal 192.168.30.3 Step 4. 登陸 # iscsiadm --mode node --targetname iqn.2013-06.com.back:disk --portal 192.168.30.3 --login Logging in to [iface: default, target: iqn.2013-06.com.back:disk, portal: 192.168.30.3,3260] Login to [iface: default, target: iqn.2013-06.com.back:disk, portal: 192.168.30.3,3260]: successful 此時如果在後端存儲檢視資訊的話會看到 # tgtadm --lld iscsi --op show --mode=target State: ready I_T nexus: 1 Initiator: iqn.2013-06.com.web2 Connection: 0 IP Address: 192.168.30.2 I_T nexus: 2 Initiator: iqn.2013-06.com.web1 IP Address: 192.168.30.1 Step 5.前端伺服器檢視磁盤清單 讀者會發現多了一塊磁盤啦 <a href="http://wnqcmq.blog.51cto.com/attachment/201306/8/5200614_1370682729OKvh.jpg"></a> 6.進行相關的格式化分區挂載(用的ext3檔案系統) 切換到挂載目錄下進行檔案操作 # mount /dev/sdb1 /mnt/back/ # cd /mnt/back/ # touch f1 # ll 總計 16 -rw-r--r-- 1 root root 0 06-07 21:39 f1 drwx------ 2 root root 16384 06-07 21:37 lost+found
但是這種方式是有問題的,ext3檔案系統沒有鎖機制和推送機制,意思就是如果兩個web站點同時建立的新檔案沒法互相看見,為了解決這個問題,那就要使用新的檔案系統啦,小編這裡就用oracle的檔案系統OCFS2來實作啦。
7.OCFS2檔案系統的實作 <a href="https://oss.oracle.com/projects/ocfs2/dist/files/RedHat/RHEL5/i386/1.4.7-1/2.6.18-164.el5/ocfs2-2.6.18-164.el5-1.4.7-1.el5.i686.rpm">ocfs2-2.6.18-164.el5-1.4.7-1.el5.i686.rpm</a> <a href="https://oss.oracle.com/projects/ocfs2-tools/dist/files/RedHat/RHEL5/i386/1.4.4-1/ocfs2-tools-1.4.4-1.el5.i386.rpm">ocfs2-tools-1.4.4-1.el5.i386.rpm</a> <a href="https://oss.oracle.com/projects/ocfs2-tools/dist/files/RedHat/RHEL5/i386/1.4.4-1/ocfs2console-1.4.4-1.el5.i386.rpm">ocfs2console-1.4.4-1.el5.i386.rpm</a> 這裡小編還是在web1的伺服器上做配置為例 Step 1:安裝軟體包: # rpm -ivh ocfs2* //web2的伺服器上也需要安裝 Step 2:修改hosts檔案和hostname # vim /etc/hosts 192.168.30.1 reserver1.com 192.168.30.2 reserver2.com # vim /etc/sysconfig/network HOSTNAME=reserver1.com //web2的主機名就是reserver2.com啦 兩個web伺服器的hosts檔案是一緻的,這裡可以用scp将web1的hosts檔案傳遞給web2 # scp /etc/hosts 192.168.30.2:/etc/ Step 3:配置群集節點 # o2cb_ctl -C -n ocfs2 -t cluster –i //建立一個名為ocfs2的群集 # o2cb_ctl -C -n reserver1.com -t node -a number=0 -a ip_address=192.168.30.1 -a ip_port=7777 -a cluster=ocfs2 //在群集中加入節點(web1) # o2cb_ctl -C -n reserver2.com -t node -a number=1 -a ip_address=192.168.30.2 -a ip_port=7777 -a cluster=ocfs2 //在群集中加入節點(web2) 這樣一來就會在/etc/ocfs2/的目錄下産生群集配置檔案cluster.conf ,同樣小編用scp傳輸過去 # scp /etc/ocfs2/cluster.conf 192.168.30.2:/etc/ocfs2/ //注意web2的/etc/ocfs2目錄要事先建立 Step 4:啟動群集服務 這裡記着兩邊伺服器都要啟動 # service o2cb enable //确認配置是否有效 Writing O2CB configuration: OK Loading filesystem "configfs": OK Mounting configfs filesystem at /sys/kernel/config: OK Loading filesystem "ocfs2_dlmfs": OK Mounting ocfs2_dlmfs filesystem at /dlm: OK Starting O2CB cluster ocfs2: OK # service o2cb start //啟動服務 Cluster ocfs2 already online # service o2cb status //檢視服務狀态(web1的) Driver for "configfs": Loaded Filesystem "configfs": Mounted Driver for "ocfs2_dlmfs": Loaded Filesystem "ocfs2_dlmfs": Mounted Checking O2CB cluster ocfs2: Online Heartbeat dead threshold = 31 Network idle timeout: 30000 Network keepalive delay: 2000 Network reconnect delay: 2000 Checking O2CB heartbeat: Not active Step 5:格式化檔案系統并挂載 先格式化檔案系統,這裡的-N參數指明的是最大的連結節點數 # mkfs -t ocfs2 -N 2 /dev/sdb1 //這裡隻需要在一個伺服器上做就是了 挂載 # mount /dev/sdb1 /mnt/back/ //挂載的工作兩邊伺服器都要做 檢視一下兩邊的群集狀态 # service o2cb status //web1的狀态 Checking O2CB heartbeat: Active //激活狀态 # service o2cb status //web2的狀态 Step 6:檢查是否可推送和鎖機制 在web1伺服器上建立一個檔案看看能不能在web2上看到 # touch web1 在web2上查詢 <a href="http://wnqcmq.blog.51cto.com/attachment/201306/8/5200614_13706827358EPV.jpg"></a> 先在web1上編輯檔案web1,同時在web2上也編輯 [root@reserver1 back]# vim web1 [root@reserver2 back]# vim web1 <a href="http://wnqcmq.blog.51cto.com/attachment/201306/8/5200614_1370682741KbBm.jpg"></a>
好啦,到此為止小編我要将的東東就完成啦,讀者你要是感覺有用的話就自己動手做做吧。。。。。。。
本文轉自 chenming421 51CTO部落格,原文連結:http://blog.51cto.com/wnqcmq/1219054