iSCSI

国杰响当当發表於2024-11-22

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

20161013234721997

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實現

20161013234722319

  • iSCSI Initiator

​ iSCSI 啟動器,從本質上說,iSCSI 啟動器是一個客戶端裝置,用於將請求連線並啟動到伺服器(iSCSI 目標)。

20161013234722778

​ 如上圖,iSCSI 啟動器有三種實現方式:可以完全基於硬體實現,比如 iSCSI HBA 卡;硬體TOE卡與軟體結合的方式;完全基於軟體實現,而軟體 iSCSI 啟動器適用於大部分主流作業系統平臺,下面就是用軟體方式來配置。

  • iSCSI Target

    即 iSCSI 目標,它是 iSCSI 網路的伺服器元件,通常是一個儲存裝置,用於包含所需的資料並回應來自 iSCSI 啟動器的請求。

  • 工作過程

20161013234723069

​ 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

20161013234723741

​ FC(FiberChannel,光纖通道)是利用光纖通道結合光纖通道交換機實現高速的資料儲存網路。FC效能很好,但價格卻貴得驚人,管理起來也非常困難。

​ 所以iSCSI利用現有的乙太網路,使用者只需要少量的投入,就可以方便、快捷地對資訊和資料進行互動式傳輸和管理。當然iSCSI與FC相比也存在明顯的不足,如速度效能、安全可靠性。

20161013234724263

2、SAN與NAS / iSCSI與NFS

20161013234725116

​ 透過前面文章知道,SAN與NAS是完全不同架構的儲存方案,前者支援Block協議,後者則支援File協議;SAN結構中,檔案管理系統(FS)還是分別在每一個應用伺服器上,會產生I/O操作,而NAS則是每個應用伺服器透過網路共享協議(如:NFS、CIFS)使用同一個檔案管理系統,所以CPU密集型應用可以選用NAS。SAN是將目光集中在磁碟、磁帶以及聯接它們的可靠的基礎結構,而NAS是將目光集中在應用、使用者和檔案以及它們共享的資料上,顯得更"高階"。將來從桌面系統到資料集中管理到儲存裝置的全面解決方案將是NAS加SAN。

​ 以上區別具體到iSCSI和NFS:iSCSI可最佳化空間更大,效能稍好,但技術難度更高;而NFS在系統層面的支援更多,像一些備份、恢復等操作較簡單。

2.1、相關準備配置

給伺服器加上硬碟,用於共享:

Snipaste_2024-05-10_21-42-40

關閉防火牆和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等。

Snipaste_2024-05-10_21-51-05

​ 建立卷資源

​ 使用cd進入/backstores/block目錄,

/> cd backstores/block

​ 然後建立卷資源,使用塊裝置/dev/sdb

/backstores/block> create dev=/dev/sdb name=sdb   #名字是隨意的

​ 如果提示sdb裝置正在被使用,則需要先解除安裝該磁碟分割槽。提示建立成功(readonly屬性表示讀寫許可權,wwn號為卷資源的唯一標號)

Snipaste_2024-05-10_21-55-07

2.3、建立iSCSI

快速建立一個iSCSI服務的步驟如下:

a.首先建立一個iqn

b.在iqn下新增提供服務的IP以及需要對映的卷

c.設定認證

1191664-20181025151327143-1908472078

操作如下:

這裡介紹一個技巧,在互動介面輸入cd,可以進入下圖介面,可以靈活快速地跳到指定目錄

Snipaste_2024-05-10_21-58-23

2.4、在iscsi目錄下建立iqn

/iscsi> create

Snipaste_2024-05-10_22-12-04

然後在iqn的對應目錄下新增服務IP,對映卷和許可權設定(預設應該是有0.0.0.0,就是允許所有IP訪問):

設定服務IP:

/iscsi> cd iqn.2003-01.org.linux-iscsi.localhost.x8664:sn.9520be3109ac/tpg1/portals/

Snipaste_2024-05-10_22-18-27

這裡可以使用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

Snipaste_2024-05-14_15-00-23

到這裡客戶端已經可以連線服務端,但是還需要將磁碟組繫結後端儲存,不然客戶端無法訪問:

/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“:

Snipaste_2024-05-14_15-05-44

重啟並設定開機自啟:

[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

Snipaste_2024-05-14_15-19-13

檢視磁碟就可以看到掛載成功。

Snipaste_2024-05-14_15-14-16

到這裡就可以正常對它格式化使用,注意生產可能要寫入/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:

Snipaste_2024-05-15_09-43-13

Snipaste_2024-05-10_22-28-21

Snipaste_2024-05-10_22-28-40

4.1、鏈路冗餘

​ 當客戶端到達伺服器端有多鏈路可達時,可以配置該方式,達到鏈路可靠的特點:

如下:

Snipaste_2024-05-17_17-35-26

服務端有四個IP,客戶端均能訪問這四個地址,我們就可以配置冗餘鏈路。

客戶端配置:

發現門戶這裡發現所有的服務端IP:

Snipaste_2024-05-17_17-38-27

按照如下步驟,依次把所有IP加入:

Snipaste_2024-05-17_17-40-48

Snipaste_2024-05-17_17-42-38

這裡就可以看見四個裝置:

Snipaste_2024-05-17_17-44-31

點解MPIO還可以選擇負載策略:

Snipaste_2024-05-17_17-46-23

配置完成之後可以測試鏈路是否達到冗餘效果。

相關文章