iSCSI詳解及配置
1、認識iSCSI
iSCSI(Internet Small Computer System Interface,Internet 小型計算機系統介面)是一種由IBM公司研究開發的IP SAN技術,該技術是將現有SCSI介面與乙太網路(Ethernet)技術結合,基於 TCP/IP的協議連線iSCSI服務端(Target)和客戶端(Initiator),使得封裝後的SCSI資料包可以在通用網際網路傳輸,最終實現iSCSI服務端對映為一個儲存空間(磁碟)提供給已連線認證後的客戶端。
1.1、SCSI
SCSI(Small Computer System Interface)是一種I/O技術,規範了一種並行的I/O匯流排和相關的協議,SCSI的資料傳輸是以塊的方式進行的。
如上圖,SCSI匯流排透過SCSI控制器來和硬碟之類的裝置進行通訊, SCSI控制器稱為Target,訪問的客戶端應用稱為Initiator。窄SCSI匯流排最多允許8個、寬SCSI匯流排最多允許16個不同的SCSI裝置和它進行連線,每個SCSI裝置都必須有自己唯一的SCSI ID(裝置的地址)。
LUN(Logical Unit Number,邏輯單元號)是為了使用和描述更多裝置及物件而引進的一個方法,每個SCSI ID上最多有32個LUN,一個LUN對應一個邏輯裝置。
廣泛應用於小型機上,正在成為PC 伺服器的標準介面,實現高速資料傳輸(可達320MB/s),常見的SCSI裝置:硬碟、磁碟陣列、印表機、光碟燒錄機等。
1.2、iSCSI實現
- iSCSI Initiator
iSCSI 啟動器,從本質上說,iSCSI 啟動器是一個客戶端裝置,用於將請求連線並啟動到伺服器(iSCSI 目標)。
如上圖,iSCSI 啟動器有三種實現方式:可以完全基於硬體實現,比如 iSCSI HBA 卡;硬體TOE卡與軟體結合的方式;完全基於軟體實現,而軟體 iSCSI 啟動器適用於大部分主流作業系統平臺,下面就是用軟體方式來配置。
-
iSCSI Target
即 iSCSI 目標,它是 iSCSI 網路的伺服器元件,通常是一個儲存裝置,用於包含所需的資料並回應來自 iSCSI 啟動器的請求。
-
工作過程
Initiator發出請求後,會在本地的作業系統會生成了相應的SCSI命令和資料I/O請求,然後這些命令和請求被封裝加密成IP資訊包,透過乙太網(TCP/IP)傳輸到Targer。
當Targer接收到資訊包時,將進行解密和解析,將SCSI命令和I/O請求分開。SCSI命令被髮送到SCSI控制器,再傳送到SCSI儲存裝置。
裝置執行SCSI命令後的響應,經過Target封裝成iSCSI響應PDU,再透過已連線的TCP/IP網路傳送給Initiator。
nitiator會從iSCSI響應PDU裡解析出SCSI響應並傳送給作業系統,作業系統再響應給應用程式。
1.3、iSCSI與FC SAN
FC(FiberChannel,光纖通道)是利用光纖通道結合光纖通道交換機實現高速的資料儲存網路。FC效能很好,但價格卻貴得驚人,管理起來也非常困難。
所以iSCSI利用現有的乙太網路,使用者只需要少量的投入,就可以方便、快捷地對資訊和資料進行互動式傳輸和管理。當然iSCSI與FC相比也存在明顯的不足,如速度效能、安全可靠性。
2、SAN與NAS / iSCSI與NFS
透過前面文章知道,SAN與NAS是完全不同架構的儲存方案,前者支援Block協議,後者則支援File協議;SAN結構中,檔案管理系統(FS)還是分別在每一個應用伺服器上,會產生I/O操作,而NAS則是每個應用伺服器透過網路共享協議(如:NFS、CIFS)使用同一個檔案管理系統,所以CPU密集型應用可以選用NAS。SAN是將目光集中在磁碟、磁帶以及聯接它們的可靠的基礎結構,而NAS是將目光集中在應用、使用者和檔案以及它們共享的資料上,顯得更"高階"。將來從桌面系統到資料集中管理到儲存裝置的全面解決方案將是NAS加SAN。
以上區別具體到iSCSI和NFS:iSCSI可最佳化空間更大,效能稍好,但技術難度更高;而NFS在系統層面的支援更多,像一些備份、恢復等操作較簡單。
2.1、相關準備配置
給伺服器加上硬碟,用於共享:
關閉防火牆和selinux:
[root@ISCSI_Server ~]# systemctl stop firewalld && systemctl disable firewalld
[root@ISCSI_Server ~]# setenforce 0
[root@ISCSI_Server ~]# sed -i 's/SELINUX=enforcing/SELINUX=disabled/g' /etc/selinux/config
安裝服務並設定開機自啟動:
[root@ISCSI_Server ~]# yum install -y targetd targetcli
[root@ISCSI_Server ~]# systemctl start targetd && systemctl enable targetd
2.2、建立IPSAN
命令列輸入targetcli進入互動介面,在互動介面可以使用ls,cd等命令靈活簡單的操作,如圖所示,最上層目錄包括backstores、iscsi等,如果有FC或Infiniband的話,還會有其餘的一些子模組如qla2xxx等。
建立卷資源
使用cd進入/backstores/block目錄,
/> cd backstores/block
然後建立卷資源,使用塊裝置/dev/sdb
/backstores/block> create dev=/dev/sdb name=sdb #名字是隨意的
如果提示sdb裝置正在被使用,則需要先解除安裝該磁碟分割槽。提示建立成功(readonly屬性表示讀寫許可權,wwn號為卷資源的唯一標號)
2.3、建立iSCSI
快速建立一個iSCSI服務的步驟如下:
a.首先建立一個iqn
b.在iqn下新增提供服務的IP以及需要對映的卷
c.設定認證
操作如下:
這裡介紹一個技巧,在互動介面輸入cd,可以進入下圖介面,可以靈活快速地跳到指定目錄
2.4、在iscsi目錄下建立iqn
/iscsi> create
然後在iqn的對應目錄下新增服務IP,對映卷和許可權設定(預設應該是有0.0.0.0,就是允許所有IP訪問):
設定服務IP:
/iscsi> cd iqn.2003-01.org.linux-iscsi.localhost.x8664:sn.9520be3109ac/tpg1/portals/
這裡可以使用delete刪除,create建立如下:
/iscsi> cd iqn.2003-01.org.linux-iscsi.localhost.x8664:sn.9520be3109ac/tpg1/portals/
/iscsi/iqn.20.../tpg1/portals> delete 0.0.0.0 ip_port=3260 # 刪除/iscsi/iqn.20.../tpg1/portals> create 0.0.0.0 #建立
設定ACLS:
/iscsi> cd /iscsi/iqn.2003-01.org.linux-iscsi.iscsiserver.x8664:sn.2d5a4bb56c28/tpg1/acls
/iscsi/iqn.20...c28/tpg1/acls> create iqn.2003-01.org.linux-iscsi.iscsiserver.x8664:sn.2d5a4bb56c28:client
到這裡客戶端已經可以連線服務端,但是還需要將磁碟組繫結後端儲存,不然客戶端無法訪問:
/iscsi/iqn.20...95939114/tpg1> cd /iscsi/iqn.2003-01.org.linux-iscsi.localhost.x8664:sn.c1da95939114/tpg1/luns
/iscsi/iqn.20...114/tpg1/luns> create /backstores/block/sdb
退出並重啟:
/iscsi/iqn.20...be3109ac/tpg1> exit
[root@ISCSI_Server ~]# systemctl restart targetd
2.5、linux使用ISCSI發起連線
2.5.1、和服務端一樣初始化
[root@ISCSI_Client ~]# systemctl stop firewalld && systemctl disable firewalld
[root@ISCSI_Client ~]# setenforce 0
[root@ISCSI_Client ~]# sed -i 's/SELINUX=enforcing/SELINUX=disabled/g' /etc/selinux/config
2.5.2、安裝客戶端軟體
[root@ISCSI_Client yum.repos.d]# yum -y install iscsi-initiator-utils
2.5.3、發現服務端網路磁碟並連線
[root@ISCSI_Client ~]# iscsiadm --mode discoverydb --type sendtargets --portal 10.1.1.2 --discover
這裡10.1.1.2是服務端IP
修改客戶端iqn,這裡要改成服務端acls裡面那個,後面加了個“:client“:
重啟並設定開機自啟:
[root@ISCSI_Client ~]# systemctl restart iscsid
[root@ISCSI_Client ~]# systemctl enable iscsid
登入:
[root@ISCSI_Client ~]# iscsiadm -m node -T iqn.2003-01.org.linux-iscsi.iscsiserver.x8664:sn.2d5a4bb56c28 -p 10.1.1.2 --login
IP要換成自己服務端IP,iqn也要換成自己服務端的iqn
檢視磁碟就可以看到掛載成功。
到這裡就可以正常對它格式化使用,注意生產可能要寫入/etc/fstab,開機自動掛載。
3、linux使用multipath實現多鏈路掛載實現負載
作業系統 | 角色 | ip |
---|---|---|
centos7.9 | 儲存端 | 192.168.126.101 & 192.168.126.102 |
Ubuntu 22.04 | 掛載端 | 192.168.126.100 |
3.1 儲存端
配置兩張網路卡和準備好儲存磁碟(這裡是sdb):
[root@localhost ~]# ip a
2: ens33: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000
link/ether 00:0c:29:56:44:61 brd ff:ff:ff:ff:ff:ff
inet 192.168.126.101/24 brd 192.168.126.255 scope global noprefixroute ens33
valid_lft forever preferred_lft forever
inet6 fe80::d00d:7855:42d:698e/64 scope link noprefixroute
valid_lft forever preferred_lft forever
3: ens36: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000
link/ether 00:0c:29:56:44:6b brd ff:ff:ff:ff:ff:ff
inet 192.168.126.102/24 brd 192.168.126.255 scope global noprefixroute ens36
valid_lft forever preferred_lft forever
inet6 fe80::30db:c281:174e:9a75/64 scope link noprefixroute
valid_lft forever preferred_lft forever
[root@localhost ~]# lsblk
NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINT
sda 8:0 0 40G 0 disk
├─sda1 8:1 0 1G 0 part /boot
└─sda2 8:2 0 39G 0 part
├─centos-root 253:0 0 35G 0 lvm /
└─centos-swap 253:1 0 4G 0 lvm [SWAP]
sdb 8:16 0 80G 0 disk
服務端環境初始化以及安裝軟體:
[root@localhost ~]# systemctl stop firewalld && systemctl disable firewalld
[root@localhost ~]# sed -i 's/SELINUX=enforcing/SELINUX=disabled/g' /etc/selinux/config
[root@localhost ~]# setenforce 0
[root@localhost ~]# yum install -y targetd targetcli
[root@localhost ~]# systemctl start targetd && systemctl enable targetd
建立相關儲存資源:
[root@localhost ~]# targetcli
/> cd backstores/block
/backstores/block> create dev=/dev/sdb name=sdb
/backstores/block> cd /iscsi
/iscsi> create
/iscsi> cd iqn.2003-01.org.linux-iscsi.localhost.x8664:sn.ca29c0f85866/tpg1/portals/
/iscsi/iqn.20.../tpg1/portals> delete 0.0.0.0 ip_port=3260
/iscsi/iqn.20.../tpg1/portals> create 0.0.0.0
/iscsi/iqn.20.../tpg1/portals> cd /iscsi/iqn.2003-01.org.linux-iscsi.localhost.x8664:sn.ca29c0f85866/tpg1/acls
/iscsi/iqn.20...866/tpg1/acls> create iqn.2003-01.org.linux-iscsi.iscsiserver.x8664:sn.2d5a4bb56c28:client
/iscsi/iqn.20...866/tpg1/acls> cd /iscsi/iqn.2003-01.org.linux-iscsi.localhost.x8664:sn.ca29c0f85866/tpg1/luns
/iscsi/iqn.20...866/tpg1/luns> create /backstores/block/sdb
/iscsi/iqn.20...866/tpg1/luns> exit
[root@localhost ~]# systemctl restart targetd
3.2 客戶端
配置掛載儲存,首先要把自己的InitiatorName改成儲存端在acls中定義的名字,否則無法掛載
root@guojie:~# egrep -v '^#|^$' /etc/iscsi/initiatorname.iscsi
InitiatorName=iqn.2003-01.org.linux-iscsi.iscsiserver.x8664:sn.2d5a4bb56c28:client
再把連線方式改成自動,預設是手動,如果設定了認證之類的還要額外配置其他項:
root@guojie:~# cat /etc/iscsi/iscsid.conf | grep "^node.startup"
node.startup = automatic
連線儲存:
儲存發現,這裡由於是同一個所以iqn都是一樣的:
iscsiadm -m discovery -t sendtargets -p <儲存ip>
root@guojie:~# iscsiadm -m discovery -t sendtargets -p 192.168.126.101
192.168.126.101:3260,1 iqn.2003-01.org.linux-iscsi.localhost.x8664:sn.ca29c0f85866
root@guojie:~# iscsiadm -m discovery -t sendtargets -p 192.168.126.102
192.168.126.102:3260,1 iqn.2003-01.org.linux-iscsi.localhost.x8664:sn.ca29c0f85866
連線luns,有多少鏈路就連多少次,我這裡只有兩條:
iscsiadm -m node -T <TARGET_IQN> -p <儲存ip> --login
root@guojie:~# iscsiadm -m node -T iqn.2003-01.org.linux-iscsi.localhost.x8664:sn.ca29c0f85866 -p 192.168.126.101 --login
root@guojie:~# iscsiadm -m node -T iqn.2003-01.org.linux-iscsi.localhost.x8664:sn.ca29c0f85866 -p 192.168.126.102 --login
擴充:
取消連線的命令是:
iscsiadm -m node -T <TARGET_IQN> -p <儲存ip> --logout
配置多鏈路工具multipath連線規則:
defaults {
user_friendly_names yes # 啟用友好名稱功能如果為no,那麼wwid必須全網唯一
find_multipaths no # 所有符合條件的裝置都會被配置為多路徑裝置
}
blacklist {
devnode "^sd[a][0-9]*" # 該部分定義了不應該被multipath管理的裝置,即排除本地磁碟,支援正則。
} # 如果本地還有sdb,那麼就寫成"^sd[a-b][0-9]*"
blacklist_exceptions { # 定義了應該被multipath管理的裝置,它們即使在黑名單中也會被作為例外處理
device {
vendor ".*" # 表示所有供應商的裝置都應該作為例外被多路徑管理。
product ".*" # 表示所有供應商的產品都應該作為例外被多路徑管理。
}
}
multipaths {
multipath {
wwid 36001405c282bc2caba14175a7384f2bb # 如果你已經掛載全部鏈路的磁碟,可以使用multipath -ll命令檢視
alias mpath0 # wwid會顯示在第一行別名在後面的括號中
}
}
devices {
device {
vendor ".*"
product ".*"
path_selector "round-robin 0" # 設定路徑選擇策略為 round-robin。這意味著 I/O 會在每個路徑之間輪流分配負載。
path_grouping_policy multibus # 設定路徑分組策略為 multibus。這意味著所有路徑將被視為一個路徑組。
path_checker directio #設定路徑檢查器為 directio。這將透過直接 I/O 操作檢查路徑的可用性。
rr_min_io 100 #策略下每個路徑至少處理的 I/O 請求數為 100。
}
}
上面的配置當中一般只用修改wwid、alias、path_selector前一個是硬碟uuid,後一個則是取得別名,掛載之後需要用別名掛載硬碟到客戶端上,最後一個是策略,"round-robin 0"是輪詢即負載均衡模式,"queue-length 0"是最少連線,"service-time 0"是根據未完成的IO數量選擇下一組IO的路徑
配置完成之後
root@guojie:~# systemctl reload multipathd
root@guojie:~# systemctl start multipathd
root@guojie:~# systemctl enable multipathd
root@guojie:~# systemctl restart multipath-tools
看見兩個磁碟狀態都為runing即可:
root@guojie:~# multipath -ll
mpath0 (36001405caffe1f1c1b542088f5cfa11a) dm-1 LIO-ORG,sdb
size=80G features='0' hwhandler='1 alua' wp=rw
`-+- policy='round-robin 0' prio=50 status=active
|- 33:0:0:0 sdb 8:16 active ready running
`- 34:0:0:0 sdc 8:32 active ready running
磁碟格式化分割槽掛載—》fdisk /dev/mapper/mpath0 -> g -> 回車-> 回車-> 回車 ->w
root@guojie:~# mkfs.ext4 /dev/mapper/mpath0-part1
root@guojie:~# mount /dev/mapper/mpath0-part1 /data
可以測驗一下是否正常:
如下,在儲存端編輯一個指令碼分別監控兩個網路卡流量:
[root@localhost ~]# cat monitor_traffic.sh
#!/bin/bash
eth0=$1
echo -e "流量進入--流量傳出 "
while true; do
old_in=$(cat /proc/net/dev |grep $eth0 |awk '{print $2}')
old_out=$(cat /proc/net/dev |grep $eth0 |awk '{print $10}')
sleep 1
new_in=$(cat /proc/net/dev |grep $eth0 |awk '{print $2}')
new_out=$(cat /proc/net/dev |grep $eth0 |awk '{print $10}')
in=$(printf "%.1f%s" "$((($new_in-$old_in)/1024))" "KB/s")
out=$(printf "%.1f%s" "$((($new_out-$old_out)/1024))" "KB/s")
echo "$in $out"
done
[root@localhost ~]# chmod +x monitor_traffic.sh
分別開啟兩個視窗一個監控ens33,一個監控ens36網路卡:
[root@localhost ~]# sh monitor_traffic.sh ens33
[root@localhost ~]# sh monitor_traffic.sh ens36
然後在終端上覆制較大檔案到/data中之後檢視兩塊網路卡流量:
root@guojie:~# cp /home/guojie/CentOS-7-x86_64-Everything-2009.iso /data
觀察流量可以看見只是走了一跳鏈路,但是那條鏈路異常他會遷移到另一條。
4、使用windows ISCSI發起連線
使用ISSCSI發起程式連線服務端:
先把配置發起程式的名稱,改成之前伺服器端設定的哪個acl:
4.1、鏈路冗餘
當客戶端到達伺服器端有多鏈路可達時,可以配置該方式,達到鏈路可靠的特點:
如下:
服務端有四個IP,客戶端均能訪問這四個地址,我們就可以配置冗餘鏈路。
客戶端配置:
發現門戶這裡發現所有的服務端IP:
按照如下步驟,依次把所有IP加入:
這裡就可以看見四個裝置:
點解MPIO還可以選擇負載策略:
配置完成之後可以測試鏈路是否達到冗餘效果。