Linux中三種SCSI target的介紹之各個target的優劣


 

版權聲明:本文為博主原創文章,遵循 CC 4.0 BY-SA 版權協議,轉載請附上原文出處鏈接和本聲明。
本文鏈接:https://blog.csdn.net/scaleqiao/article/details/46761993

通過之前的三篇博文,我介紹了目前Linux中廣泛使用的三個SCSI target的架構和使用方法。那如何在這三者之間做一個選擇呢?這里給出我對它們之間優劣點的總結,歡迎高手指正錯誤。

1. STGT

在2.6.38之后,STGT默認只剩下用戶態的實現,這對於iSCSI target來說,用戶態即可滿足要求。如果需要iSER等,需要自己將kernel的部分打上。另外從以上功能圖表上可以看出,STGT主要專注於iSCSI上。

它的優點是:
1)簡單,方便使用和維護;
2)另外已經有ceph的target driver,只是需要做性能優化;
3)因為工作在用戶態,所以即使掛掉了,也不會對其他運行的程序產生影響;

它的缺點是:
1)支持的傳輸協議較少;
2)對SCSI協議支持比較簡單,一些cluster中的特性比如PR等都不支持,所以基於stgt的方案不能在cluster中使用;
3)對於多initiator訪問同一target的場景,性能表現不好,這個主要是因為tgt的實現所致,即它目前的策略是針對一個lun創建16個線程處理IO。不過可以通過one lun per target的方案解決;

2. SCST

SCST的核心模塊工作在內核里,可以支持通過系統模塊(VFS、塊層)訪問的后端存儲如塊設備、文件設備以及passthrough的scsi設備。對於通過library庫訪問的ceph rbd以及glusterfs等后端存儲,SCST也提供了一個模塊scst_user,不過你得自己寫插件。

 

它的優點是:
1)支持更多傳輸協議
2)針對性能做了特殊的優化
3)除了基本的SCSI協議支持外,還有一些高級支持:
SCST支持永久性預留(Persistent Reservation, PR);這是一個用於高可用集群中的存儲設備的 I/O 隔離與存儲設備故障切換、接管的特性。通過使用 PR 命令,initiator 可以在一個 target 上建立、搶占、查詢、重置預留策略。在故障接管過程中,新的虛擬資源可以重置老的虛擬資源的預留策略,從而讓故障切換更快、更容易地進行。
SCST 可以使用異步事件通知(AEN)來通告會話狀態的變更。AEN 是一個 SCSI target 用來向 initiator 進行 target 端的事件告知的協議特性,即使在沒有服務請求的時候也可以進行。於是 initiator 就可以在 target 端發生事件時,如設備插入、移除、調整尺寸或更換介質時,可以得到通知。這讓 initiator 可以以即插即用的方式看到 target 的變化。
4)SCST 的開發者聲稱,它們的設計在健壯性和安全性方面更加符合 SCSI 標准。SCSI 協議要求,如果一個 initiator 要清除另一個 initiator 的預留資源時,預留者必須要得到清除通知,否則,多個 initiator 都可能來改變預留數據,就可能會破壞數據。SCST 可以實現安全的預留、釋放操作,避免類似事情發生。
5)SCST 也支持非對稱邏輯卷分配(ALUA)。ALUA 允許 target 管理員來管理 target 的訪問狀態和路徑屬性。這讓多路徑路由機制可以選擇最好的路徑,從而根據 target 的訪問狀態,優化帶寬的使用。換句話說,在多路徑環境下,target 管理員可以通過改變訪問狀態來調整 initiator 的路徑。
6)各大存儲服務提供商都是基於SCST。
7)提供更細粒度的訪問控制策略以及QoS保證機制(限制initiator連接的個數)。

 

它的缺點是:
1)結構復雜,二次開發成本較高。
2)工作在kernel,如果掛了,會導致整個機器down掉,影響其他程序。
3)kernel部分沒有並入linux,需要手工編譯。

關於scst_user,這里多說一點它的工作原理。它在內核創建一個字符設備作為用戶態存儲和SCST內核模塊之間的接口,通過IOCTL,用戶態存儲可以向SCST注冊一個塊設備以及進行IO。當然就我了解到的情況是,你要擴展scst_user對你的存儲的支持,你只能自己搞,目前沒有任何案例可以參考,只有一個接口spec文檔:
http://scst.sourceforge.net/scst_user_spec.txt

 

3. LIO

LIO的核心模塊也工作在內核,和SCST一樣即支持通過內核模塊訪問的后端存儲,也支持通過library訪問的分布式存儲,對應的模塊是TCMU。這個模塊已經在3.17並入linux內核里了,可以參考它的設計文檔:
https://www.kernel.org/doc/Documentation/target/tcmu-design.txt

 

優點:
1)支持較多傳輸協議
2)代碼並入linux內核,減少了手動編譯內核的麻煩。
3)提供了python版本的編程接口rtslib。
4)LIO在不斷backport SCST的功能到linux內核,社區的力量是強大的。
5)LIO也支持一些SCST沒有的功能。

LIO 還支持“會話多連接”(MC/S)。MC/S 讓 initiator 可以和 target 在一條或多條物理路徑上建立多條連接。這樣,在一條路徑發生錯誤的時候,已經建立好的會話可以不中斷會話,直接使用其他的路徑。MC/S 還可以用來進行所有連接之間的負載均衡。這種情況下,會在所有通信路徑上保持會話命令的順序性。
不過我覺得MCS是一個比較雞肋的feature,因為現在Linux內核已經有Device Mapper的支持。
6)LIO支持最高級別的ERL。iSCSI 連接的錯誤可能會發生在三個層面上:會話、校驗或是連接層。錯誤恢復工作也可以在這三個層面開始進行,這樣就可以在當前的層面開始進行恢復,不會讓錯誤到達下一個層面。錯誤恢復首先是檢查斷開的連接。在這種情況下,iSCSI initiator 驅動會主動建立新的到 target 的 TCP 連接它會告訴 target,SCSI 指令路徑已經變到新的連接上了。這樣 target 就可以在新的連接上處理 SCSI 命令了。這時,上層的 SCSI 驅動對新的連接已經建立、控制信息已經通過新連接傳輸的事還是毫無知覺的。iSCSI 會話在這期間會保持正常,不會重新變換狀態。LIO 支持的最大錯誤恢復級別(ERL)為2,這就是說,它可以在會話、校驗或連接層進行錯誤恢復。而SCST 支持的 ERL 為 0,也就是說,它智能恢復會話級別的錯誤,所有連接層面的錯誤都會轉到 SCSI 驅動層面來處理。

缺點:
1)不支持AEN,所以target狀態發生變化時,只能通過IO或者用戶手動觸發以檢測處理變化。
2)結構相對復雜,二次開發成本較高。
3)工作在內核態,出現問題會影響其他程序的運行。

4. 總結

總的來說,如果你的需求只是構建一個iSCSI target,並且規模不是很大,stgt是一個不錯的選擇。
如果你要構建一個企業級的存儲方案,即高性能、高穩定性的,並且圍繞這個有長遠計划的,本人覺得SCST是正確的選擇。
如果你對性能、穩定性要求不是那么高,但又想支持FC、SRP等協議,你可以選擇LIO。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM