SCSI
小型計算機系統接口(SCSI,Small Computer System Interface)是一種用於計算機及其周邊設備之間(硬盤、軟驅、光驅、打印機、掃描儀等)系統級接口的獨立處理器標准。SCSI標准定義命令、通信協議以及實體的電氣特性(換成OSI的說法,就是占據物理層、鏈接層、套接層、應用層),最大部分的應用是在存儲設備上(例如硬盤、磁帶機);但,其實SCSI可以連接的設備包括有掃描儀、光學設備(像CD、DVD)、打印機……等等,SCSI命令中有條列出支持的設備SCSI周邊設備。理論上,SCSI不可能連接所有的設備,所以有“1Fh - unknown or no device type”這個參數存在。
SAS
(Serial Attached SCSI,串列SCSI)是由並行SCSI物理存儲接口演化而來,是由ANSI INCITS T10技術委員會開發的新的存儲接口標准。與並行方式相比,串列方式提供更快速的通信傳輸速度以及更簡易的配置。此外SAS支持與串列ATA設備兼容,且兩者可以使用相類似的電纜。SATA的硬盤可接在SAS的控制器使用,但SAS硬盤並不能接在SATA的控制器使用。
- 第一代SAS為數組中的每個驅動器提供3.0 Gbps(約3000 Mbps)的傳輸速率。
- 第二代SAS為數組中的每個驅動器提供6.0 Gbps(約6000 Mbps)的傳輸速率。
- 第三代SAS為數組中的每個驅動器提供12.0 Gbps(約12000 Mbps)的傳輸速率。
SATA
串行ATA(Serial ATA: Serial Advanced Technology Attachment)是串列SCSI(SAS: Serial Attached SCSI)的孿生兄弟。兩者的排線兼容,SATA硬盤可接上SAS接口。它是一種電腦總線,主要功能是用作主板和大量存儲設備(如硬盤及光盤驅動器)之間的數據傳輸之用。SATA主要用於個人電腦。
SATA版本 | 帶寬 | 速度 |
---|---|---|
SATA Express | 16Gb/s | 1969MB/s |
SATA 3.0 | 6Gb/s | 600MB/s |
SATA 2.0 | 3Gb/s | 300MB/s |
SATA 1.0 | 1.5Gb/s | 150MB/s |
iSCSI(Internet Small Computer System Interface,發音為/аɪskʌzi/),Internet小型計算機系統接口,又稱為IP-SAN,是一種基於因特網及SCSI-3協議下的存儲技術,由IETF提出,並於2003年2月11日成為正式的標准。與傳統的SCSI技術比較起來,iSCSI技術有以下三個革命性的變化:
- 把原來只用於本機的SCSI協義通過TCP/IP網絡發送,使連接距離可作無限的地域延伸;
- 連接的服務器數量無限(原來的SCSI-3的上限是15);
- 由於是服務器架構,因此也可以實現在線擴容以至動態部署。
功能
iSCSI利用了TCP/IP的port 860 和 3260 作為溝通的渠道。透過兩部計算機之間利用iSCSI的協議來交換SCSI命令,讓計算機可以透過高速的局域網集線來把SAN模擬成為本地的儲存裝置。
iSCSI使用 TCP/IP 協議(一般使用TCP端口860和3260)。 本質上,iSCSI 讓兩個主機通過 IP 網絡相互協商然后交換 SCSI 命令。這樣一來,iSCSI 就是用廣域網仿真了一個常用的高性能本地存儲總線,從而創建了一個存儲局域網(SAN)。不像某些 SAN 協議,iSCSI 不需要專用的電纜;它可以在已有的交換和 IP 基礎架構上運行。然而,如果不使用專用的網絡或者子網( LAN 或者 VLAN ),iSCSI SAN 的部署性能可能會嚴重下降。於是,iSCSI 常常被認為是光纖通道(Fiber Channel)的一個低成本替代方法,而光纖通道是需要專用的基礎架構的。但是,基於以太網的光纖通道(FCoE)則不需要專用的基礎架構。
雖然 iSCSI 可以與任意類型的 SCSI 設備進行通信,系統管理員幾乎總是使用它來連接服務器計算機 (例如,數據庫服務器) 和磁盤卷上存儲陣列。 使用iSCSI SAN 的目的通常有以下兩個:
存儲集成 公司希望將不同的存儲資源從分散在網絡上的服務器移動到統一的位置(常常是數據中心); 這可以讓存儲的分配變得更為有效。 SAN 環境中的服務器無需任何更改硬件或電纜連接就可以得到新分配的磁盤卷。
災難恢復 公司希望把存儲資源從一個數據中心鏡像到另一個遠程的數據中心上,后者在出現長時間停電的情況下可以用作熱備份。 特別是,iSCSI SAN 使我們只需要用最小的配置更改就可以在 WAN 上面遷移整個磁盤陣列,實質上就是,把存儲變成了“可路由的”,就像普通的網絡通信一樣。
Ceph-iSCSI Gateways
https://www.suse.com/documentation/ses-3/book_storage_admin/data/ceph_iscsi_iscsi.html
LIO
歷史
- Linux 2.6.38 為分界線,此前的標准是 Linux SCSI Target , STGT 之后迄今為止的
標准是 Linux-IO Target , LIO 確切的說 Linus Torvalds 在 2011年1月15日將
LIO SCSI Target engine merge 到 Linux 2.6.38 中 - 暫時使用LIO作為IET替代,因為IET當前已不更新,最新版2010年。而LIO已進入內核,
怎么說這幾年應該都會持續發展,屬於主流應用。
開源iSCSI Target調研
- SCST與LIO
- SCST是一個相對較早且比較成熟的SCSI Target開源實現。
- LIO相比SCST是一個更晚的SCSI Target開源實現,但在與SCST競爭進入Linux內核中,
卻以LIO勝出告終。關於二者之間進入Linux內核時的爭論,LWN上一篇很 有趣的文章,
A tale of two SCSI Targets,中文翻譯為“SCSI Target之 雙城記”。 - 雖然LIO因為進入Linux內核而有了更好的發展前景,但SCST也不差,Fusion-io 公司
剛剛收購了SCST的商業支持公司ID7。
- Tgt
- Tgt也是一個通用的SCST Target開源實現,與前兩者不同的是,在支持iSCSI協 議上,
Tgt的所有代碼是完全工作在用戶態的。 - Tgt將LU視為backstore,支持backstore可以模塊化,也就是說,你可以寫一個模塊來
支持你自己定義的LU。Tgt提供了多線程api接口,使得編寫backstore時 ,可以使用多
個線程同時處理SCSI請求。 - Tgt的主線程使用epoll LT模型,監聽並接收Initiator發來
的讀寫請求與命令 ,而調用對應的backstore處理模塊。
- Tgt也是一個通用的SCST Target開源實現,與前兩者不同的是,在支持iSCSI協 議上,
- iSCSI Target支持LU是分布式文件系統時的優化
- iSCSI Target與LU之間支持多連接並發讀寫請求,對於不要求排序的SCSI命令與數據,可以並發發給LU
- iSCSI Target對SCSI命令與數據進行合並,然后發給LU。
- 比較
- 無論是SCST還是LIO,我都不認為它們是支持分布式文件系統的最佳選擇。
首先,它們都是工作在內核態的,一旦出問題,會導致系統掛掉,直接影響跑在系統上的其他線上服務。
其次,SCSI與LIO作為通用的SCSI Target實現,在處理完iSCSI協議后,會把SCSI的
處理交給內核SCSI Driver去處理,這對支持分布式文件做二次開發來說,相對更加困難。 - LIO對於一個LU,分配一個recv線程與一個send線程,recv線程接收Initiator發來的
iSCSI PDU,解析成SCSI請求后交給send線程,send線程將請求發給LU,並將LU返回
的結果返回給Initiator。對於LU是分布式文件系統時,一個send線程的框架讓支持
iSCSI Target與LU之間多連接並發讀寫相對比較困難。而且LIO對iSCSI協議的支持,
很難針對LU是分布式文件系統做優化。LIO的send線程 與recv線程使用一個隊列進行
通信,該隊列中的SCSI請求,有些不關心順序,有些卻關心,這些都是在send線程遍
歷隊列時才進行處理的。如果要支持LU的多連接並發讀寫,需要額外的隊列來維護SCSI
請求,這個隊列對SCSI請求到達LU的順序沒有要求。當然,也要額外支持多線程等處理。 - Tgt由於工作在用戶態,沒有缺點1,而且Tgt的backstore可以模塊化,開發起來非常方便,
同時backstore支持多線程處理,而且Tgt交給backstore的多線程處理的 list已經對順序不作要求了。 - 從以上分析來看,使用Tgt讓分布式文件系統支持iSCSI更加有優勢,而且更加方便。
目前,開源分布式存儲項目sheepdog與hlfs都是基於Tgt開發模塊來支持 iSCSI協議的。
- 無論是SCST還是LIO,我都不認為它們是支持分布式文件系統的最佳選擇。
- Tgt的缺點與改進
- Tgt的backstore在使用多線程時,多個線程競爭一個list,開銷較大。可以讓 每個線程維護
一個list,主線程通過CAS無鎖隊列的方式,將SCSI請求根據rr算 法加入到每個線程的list中。 - Tgt的backstore與LU之間連接數與線程數,是1:1關系,且線程數為4,寫死了的。
可以修改代碼,將連接數改為可配置的。 - Tgt使用一個主線程通過epoll接受所有Initiator的讀寫請求,當登陸的Initiator較多時,
這里可能成為瓶頸。通常來說,這不是問題,因為會iSCSI Target會部署多個的。
- Tgt的backstore在使用多線程時,多個線程競爭一個list,開銷較大。可以讓 每個線程維護