溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶(hù)服務(wù)條款》

基于go的網(wǎng)絡(luò)存儲(chǔ)協(xié)議是什么

發(fā)布時(shí)間:2023-03-06 11:14:01 來(lái)源:億速云 閱讀:95 作者:iii 欄目:開(kāi)發(fā)技術(shù)

這篇“基于go的網(wǎng)絡(luò)存儲(chǔ)協(xié)議是什么”文章的知識(shí)點(diǎn)大部分人都不太理解,所以小編給大家總結(jié)了以下內(nèi)容,內(nèi)容詳細(xì),步驟清晰,具有一定的借鑒價(jià)值,希望大家閱讀完這篇文章能有所收獲,下面我們一起來(lái)看看這篇“基于go的網(wǎng)絡(luò)存儲(chǔ)協(xié)議是什么”文章吧。

    一.網(wǎng)絡(luò)存儲(chǔ)是什么?

    網(wǎng)絡(luò)存儲(chǔ)是一種將存儲(chǔ)資源連接到網(wǎng)絡(luò)上,以便多臺(tái)計(jì)算機(jī)可以共享和訪問(wèn)這些存儲(chǔ)資源的技術(shù)。網(wǎng)絡(luò)存儲(chǔ)可以是基于本地網(wǎng)絡(luò)的存儲(chǔ)(如局域網(wǎng)),也可以是基于廣域網(wǎng)的存儲(chǔ)(如云存儲(chǔ))。

    網(wǎng)絡(luò)存儲(chǔ)通常使用網(wǎng)絡(luò)文件系統(tǒng)(NFS)或存儲(chǔ)區(qū)域網(wǎng)絡(luò)(SAN)等協(xié)議來(lái)實(shí)現(xiàn)存儲(chǔ)資源的共享和訪問(wèn)。網(wǎng)絡(luò)存儲(chǔ)具有高可用性、可擴(kuò)展性和靈活性等優(yōu)點(diǎn),可以滿(mǎn)足不同場(chǎng)景下對(duì)存儲(chǔ)資源的需求。

    二.iSCSI是什么?

    iSCSI(Internet Small Computer System Interface)是一種基于網(wǎng)絡(luò)的存儲(chǔ)協(xié)議,它可以將遠(yuǎn)程存儲(chǔ)設(shè)備映射為本地磁盤(pán),使得計(jì)算機(jī)可以像訪問(wèn)本地磁盤(pán)一樣訪問(wèn)遠(yuǎn)程存儲(chǔ)設(shè)備。iSCSI協(xié)議可以在以太網(wǎng)、光纖通道等網(wǎng)絡(luò)上運(yùn)行,它可以在計(jì)算機(jī)和存儲(chǔ)設(shè)備之間建立虛擬的SCSI總線(xiàn),從而實(shí)現(xiàn)數(shù)據(jù)的傳輸和管理。iSCSI協(xié)議可以簡(jiǎn)化存儲(chǔ)系統(tǒng)的管理和部署,提高存儲(chǔ)系統(tǒng)的可靠性和性能。

    iSCSI 可以運(yùn)行在用戶(hù)態(tài)或內(nèi)核態(tài)。在 Linux 系統(tǒng)中,iSCSI 的實(shí)現(xiàn)通常是使用內(nèi)核模塊,即 iscsi_tcp.ko 和 scsi_transport_iscsi.ko,它們負(fù)責(zé)處理 iSCSI 傳輸和 SCSI 命令處理。但是,還有一些用戶(hù)態(tài)的 iSCSI 實(shí)現(xiàn),如 open-iscsi,它使用用戶(hù)態(tài)的 iSCSI 守護(hù)進(jìn)程(iscsid)和 iSCSI 庫(kù)(libiscsi)。用戶(hù)態(tài)的 iSCSI 實(shí)現(xiàn)可以提供更靈活的配置和管理,但通常性能不如內(nèi)核態(tài)的實(shí)現(xiàn)。

    Go 語(yǔ)言實(shí)現(xiàn)的 iSCSI 庫(kù)和工具可以用于構(gòu)建和管理 iSCSI 存儲(chǔ)系統(tǒng),例如:

    • go-iscsi:一個(gè)基于 Go 語(yǔ)言實(shí)現(xiàn)的 iSCSI 庫(kù),支持創(chuàng)建和管理 iSCSI 目標(biāo)和 LUN(邏輯單元)。它可以用于構(gòu)建自己的 iSCSI 存儲(chǔ)系統(tǒng)或集成到其他應(yīng)用程序中。

    • iscsid:一個(gè)基于 Go 語(yǔ)言實(shí)現(xiàn)的 iSCSI 守護(hù)進(jìn)程,可以用于創(chuàng)建和管理 iSCSI 目標(biāo)和 LUN。它支持多個(gè)后端存儲(chǔ)引擎,包括本地文件系統(tǒng)、Ceph、GlusterFS 等。

    • open-iscsi:一個(gè)開(kāi)源的 iSCSI 實(shí)現(xiàn),包括 iSCSI 客戶(hù)端(initiator)和服務(wù)器端(target)。它基于 C 語(yǔ)言實(shí)現(xiàn),但也有一些 Go 語(yǔ)言的工具和庫(kù)可以用于與之交互。

    • dqlite:一個(gè)基于 Go 語(yǔ)言實(shí)現(xiàn)的分布式 SQLite 數(shù)據(jù)庫(kù),支持多節(jié)點(diǎn)復(fù)制和高可用性。它可以用于構(gòu)建分布式 iSCSI 存儲(chǔ)系統(tǒng)或其他分布式應(yīng)用程序。

    iscsid

    iscsid 是 iSCSI 協(xié)議的守護(hù)進(jìn)程,主要負(fù)責(zé)與 iSCSI initiator(客戶(hù)端)通信,并將 iSCSI 請(qǐng)求轉(zhuǎn)發(fā)給 SCSI 設(shè)備。在文件系統(tǒng)中,iscsid 通常是使用內(nèi)核模塊實(shí)現(xiàn)的。

    iscsid 的內(nèi)核模塊通常由兩部分組成:iscsi_tcp.ko 和 scsi_transport_iscsi.ko。其中,iscsi_tcp.ko 負(fù)責(zé)處理 iSCSI 的傳輸層協(xié)議,如建立和維護(hù) TCP 連接、處理 iSCSI 登錄和退出等。而 scsi_transport_iscsi.ko 則負(fù)責(zé)處理 iSCSI 的 SCSI 命令,如將 iSCSI 請(qǐng)求轉(zhuǎn)發(fā)給 SCSI 設(shè)備、處理 SCSI 命令的響應(yīng)等。

    當(dāng) iscsid 啟動(dòng)時(shí),它會(huì)加載 iscsi_tcp.ko 和 scsi_transport_iscsi.ko 內(nèi)核模塊,并創(chuàng)建對(duì)應(yīng)的字符設(shè)備文件,如 /dev/sda、/dev/sdb 等。這些字符設(shè)備文件對(duì)應(yīng)著 iSCSI target(服務(wù)器)上的 SCSI 設(shè)備,它們可以被當(dāng)作普通的硬盤(pán)使用,可以格式化、掛載、讀寫(xiě)等。

    當(dāng) iSCSI initiator 發(fā)送 SCSI 命令時(shí),iscsid 守護(hù)進(jìn)程將命令轉(zhuǎn)發(fā)給對(duì)應(yīng)的字符設(shè)備文件,比如 /dev/sda。字符設(shè)備文件將命令轉(zhuǎn)發(fā)給 SCSI 設(shè)備,如硬盤(pán)。SCSI 設(shè)備執(zhí)行命令并返回結(jié)果。字符設(shè)備文件將結(jié)果返回給 iscsid 守護(hù)進(jìn)程。iscsid 守護(hù)進(jìn)程將結(jié)果返回給 iSCSI initiator。

    三.RDMA是什么?

    RDMA(Remote Direct Memory Access)是一種高性能、低延遲的網(wǎng)絡(luò)傳輸技術(shù),它可以讓計(jì)算機(jī)之間直接訪問(wèn)彼此的內(nèi)存,從而避免了數(shù)據(jù)在傳輸過(guò)程中的不必要的拷貝和上下文切換。RDMA 技術(shù)主要包括兩種協(xié)議:InfiniBand 和 RoCE(RDMA over Converged Ethernet)。

    在 RDMA 技術(shù)中,計(jì)算機(jī)之間的數(shù)據(jù)傳輸不再需要 CPU 的介入,而是直接通過(guò)網(wǎng)絡(luò)適配器和內(nèi)存控制器之間的 DMA 傳輸實(shí)現(xiàn)。這種方式可以大大減少 CPU 的負(fù)載和數(shù)據(jù)傳輸?shù)难舆t,從而提高傳輸?shù)男屎托阅堋?/p>

    RDMA 的工作流程通常包括以下幾個(gè)步驟:

    • 應(yīng)用程序?qū)?shù)據(jù)寫(xiě)入內(nèi)存中的緩沖區(qū)。

    • 應(yīng)用程序通過(guò) RDMA API 發(fā)送數(shù)據(jù)傳輸請(qǐng)求。

    • 網(wǎng)絡(luò)適配器將數(shù)據(jù)傳輸請(qǐng)求發(fā)送到目標(biāo)計(jì)算機(jī)。

    • 目標(biāo)計(jì)算機(jī)的網(wǎng)絡(luò)適配器接收到數(shù)據(jù)傳輸請(qǐng)求。

    • 目標(biāo)計(jì)算機(jī)的內(nèi)存控制器將請(qǐng)求的數(shù)據(jù)從內(nèi)存中讀取,并通過(guò)網(wǎng)絡(luò)適配器將數(shù)據(jù)傳輸給源計(jì)算機(jī)的內(nèi)存控制器。

    • 源計(jì)算機(jī)的內(nèi)存控制器將數(shù)據(jù)寫(xiě)入內(nèi)存中的緩沖區(qū),并通知應(yīng)用程序傳輸完成。

    RDMA 技術(shù)需要硬件和軟件的支持,包括網(wǎng)絡(luò)適配器、內(nèi)存控制器、驅(qū)動(dòng)程序和 RDMA API 等。此外,RDMA 技術(shù)也有一些限制和注意事項(xiàng),比如需要保證數(shù)據(jù)傳輸?shù)捻樞蚝鸵恢滦?,需要避免?nèi)存泄漏和數(shù)據(jù)溢出等。

    Go-IPoIB庫(kù)是一個(gè)Go語(yǔ)言實(shí)現(xiàn)的RDMA over IPoIB協(xié)議庫(kù),其底層原理主要是通過(guò)RDMA-CM API來(lái)實(shí)現(xiàn)RDMA通信。RDMA-CM是一種基于InfiniBand網(wǎng)絡(luò)的RDMA通信管理器,它提供了一種通用的RDMA通信接口,可以在不同的RDMA網(wǎng)絡(luò)上運(yùn)行。RDMA-CM API包括RDMA-CM庫(kù)和RDMA-CM頭文件,可以在Linux系統(tǒng)上使用。

    Go-IPoIB庫(kù)提供了一種使用RDMA-CM API來(lái)實(shí)現(xiàn)RDMA over IPoIB協(xié)議的方法。在使用Go-IPoIB庫(kù)時(shí),需要使用ipoib.DialIB函數(shù)來(lái)創(chuàng)建RDMA連接,并指定本地和遠(yuǎn)程的IP地址和端口號(hào)等參數(shù)。然后,可以使用RDMA通信的Write和Read函數(shù)來(lái)進(jìn)行數(shù)據(jù)的發(fā)送和接收。在數(shù)據(jù)傳輸過(guò)程中,Go-IPoIB庫(kù)會(huì)自動(dòng)封裝和解封裝IPoIB數(shù)據(jù)包,并使用RDMA-CM API來(lái)管理RDMA通信。

    Go-IPoIB庫(kù)的實(shí)現(xiàn)涉及到網(wǎng)絡(luò)協(xié)議、硬件設(shè)備、系統(tǒng)調(diào)用等多個(gè)方面,比較復(fù)雜。使用Go-IPoIB庫(kù)需要有一定的計(jì)算機(jī)網(wǎng)絡(luò)和系統(tǒng)編程基礎(chǔ),并且需要詳細(xì)了解RDMA-CM API的使用方法和相關(guān)的網(wǎng)絡(luò)協(xié)議規(guī)范。

    以下是一個(gè)簡(jiǎn)單的示例程序,實(shí)現(xiàn)了一個(gè)基本的RDMA寫(xiě)操作:

    package main
    import (
    	"fmt"
    	"log"
    	"net"
    	"time"
    	"github.com/infiniband/go-ipoib"
    )
    func main() {
    	// 創(chuàng)建RDMA連接
    	conn, err := ipoib.DialIB("192.168.1.1", "ib0", "192.168.1.2", "ib0", 1024)
    	if err != nil {
    		log.Fatal(err)
    	}
    	defer conn.Close()
    	// 發(fā)送數(shù)據(jù)
    	data := []byte("hello world")
    	err = conn.Write(data)
    	if err != nil {
    		log.Fatal(err)
    	}
    	// 接收數(shù)據(jù)
    	buf := make([]byte, len(data))
    	err = conn.Read(buf)
    	if err != nil {
    		log.Fatal(err)
    	}
    	fmt.Println(string(buf))
    }

    在此示例中,我們使用ipoib.DialIB函數(shù)創(chuàng)建了一個(gè)RDMA連接,指定了本地和遠(yuǎn)程的IP地址和端口號(hào),并設(shè)置了緩沖區(qū)大小為1024字節(jié)。然后,我們使用conn.Write函數(shù)向?qū)Ψ桨l(fā)送了一條消息,并使用conn.Read函數(shù)從對(duì)方接收了一條回復(fù)消息。最后,我們將接收到的數(shù)據(jù)轉(zhuǎn)換為字符串并打印出來(lái)。

    在實(shí)際應(yīng)用中,需要根據(jù)具體的需求進(jìn)行更復(fù)雜的RDMA通信實(shí)現(xiàn),如RDMA讀操作、多個(gè)連接的管理等。同時(shí),還需要考慮RDMA通信的安全性和穩(wěn)定性,避免出現(xiàn)數(shù)據(jù)丟失、死鎖等問(wèn)題。

    四.NVME-oF是什么?

    NVMe-oF(Non-Volatile Memory Express over Fabrics)是一種將NVMe協(xié)議擴(kuò)展到網(wǎng)絡(luò)存儲(chǔ)中的技術(shù)。它可以讓遠(yuǎn)程計(jì)算機(jī)通過(guò)網(wǎng)絡(luò)訪問(wèn)本地存儲(chǔ)設(shè)備,從而實(shí)現(xiàn)高性能、低延遲、高可用的存儲(chǔ)訪問(wèn)。

    NVMe-oF技術(shù)的實(shí)現(xiàn)需要硬件和軟件的支持,包括網(wǎng)絡(luò)適配器、存儲(chǔ)控制器、驅(qū)動(dòng)程序和協(xié)議棧等。在NVMe-oF架構(gòu)中,存儲(chǔ)設(shè)備被分為兩個(gè)部分:NVMe-oF Target和NVMe-oF Initiator。

    NVMe-oF Target是存儲(chǔ)設(shè)備的服務(wù)端,負(fù)責(zé)響應(yīng)NVMe-oF Initiator的請(qǐng)求,并將數(shù)據(jù)傳輸?shù)奖镜卮鎯?chǔ)設(shè)備中。NVMe-oF Initiator是存儲(chǔ)設(shè)備的客戶(hù)端,負(fù)責(zé)向NVMe-oF Target發(fā)送請(qǐng)求,并從本地存儲(chǔ)設(shè)備中讀取數(shù)據(jù)。

    在NVMe-oF技術(shù)中,數(shù)據(jù)傳輸是通過(guò)RDMA(Remote Direct Memory Access)技術(shù)實(shí)現(xiàn)的,可以實(shí)現(xiàn)高帶寬、低延遲的數(shù)據(jù)傳輸。同時(shí),NVMe-oF技術(shù)還支持多種傳輸協(xié)議,包括RoCE(RDMA over Converged Ethernet)、iWARP(Internet Wide Area RDMA Protocol)等。

    總的來(lái)說(shuō),NVMe-oF技術(shù)是一種將NVMe協(xié)議擴(kuò)展到網(wǎng)絡(luò)存儲(chǔ)中的技術(shù),可以實(shí)現(xiàn)高性能、低延遲、高可用的存儲(chǔ)訪問(wèn)。如果你需要更詳細(xì)的信息,可以查看相關(guān)的文檔或參考其他相關(guān)資料。謝謝!

    要在Go中實(shí)現(xiàn)NVMe-oF,可以使用GoNVMe庫(kù)。GoNVMe庫(kù)是一個(gè)基于Go語(yǔ)言實(shí)現(xiàn)的NVMe命令行工具和庫(kù),可以用于管理和測(cè)試NVMe設(shè)備和驅(qū)動(dòng)程序。

    使用GoNVMe庫(kù)時(shí),需要先安裝NVMe設(shè)備和驅(qū)動(dòng)程序,并安裝GoNVMe庫(kù)。然后,可以使用GoNVMe命令行工具來(lái)執(zhí)行各種NVMe操作,如列出NVMe設(shè)備、讀取NVMe設(shè)備的屬性、執(zhí)行NVMe命令等。

    以下是一個(gè)使用GoNVMe庫(kù)讀取NVMe設(shè)備屬性的示例程序:

    package main
    import (
    	"fmt"
    	"github.com/chenjie199234/GoNVMe/nvme"
    )
    func main() {
    	// 打開(kāi)NVMe設(shè)備
    	dev, err := nvme.Open("/dev/nvme0")
    	if err != nil {
    		panic(err)
    	}
    	defer dev.Close()
    	// 讀取NVMe設(shè)備屬性
    	id, err := dev.Identify()
    	if err != nil {
    		panic(err)
    	}
    	// 輸出NVMe設(shè)備屬性
    	fmt.Printf("%+v\\n", id)
    }

    在此示例中,我們使用nvme.Open函數(shù)打開(kāi)了一個(gè)NVMe設(shè)備,并使用dev.Identify函數(shù)讀取了NVMe設(shè)備的屬性。然后,我們將讀取到的屬性信息轉(zhuǎn)換為字符串并打印出來(lái)。

    使用GoNVMe庫(kù)需要有一定的計(jì)算機(jī)存儲(chǔ)和系統(tǒng)編程基礎(chǔ),并且需要了解NVMe協(xié)議和相關(guān)的存儲(chǔ)技術(shù)。同時(shí),NVMe設(shè)備和驅(qū)動(dòng)程序的支持也是使用GoNVMe庫(kù)的前提條件。

    以上就是關(guān)于“基于go的網(wǎng)絡(luò)存儲(chǔ)協(xié)議是什么”這篇文章的內(nèi)容,相信大家都有了一定的了解,希望小編分享的內(nèi)容對(duì)大家有幫助,若想了解更多相關(guān)的知識(shí)內(nèi)容,請(qǐng)關(guān)注億速云行業(yè)資訊頻道。

    向AI問(wèn)一下細(xì)節(jié)

    免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

    go
    AI