基于go实例网络存储协议详解

目录
  • 主要内容
  • 一.网络存储是什么?
  • 二.iSCSI是什么?
    • iscsid
  • 三.RDMA是什么?
  • 四.NVME-oF是什么?

主要内容

一.网络存储是什么?

二.iSCSI是什么?

三.RDMA是什么?

四.NVME-oF是什么?

一.网络存储是什么?

网络存储是一种将存储资源连接到网络上,以便多台计算机可以共享和访问这些存储资源的技术。网络存储可以是基于本地网络的存储(如局域网),也可以是基于广域网的存储(如云存储)。

网络存储通常使用网络文件系统(NFS)或存储区域网络(SAN)等协议来实现存储资源的共享和访问。网络存储具有高可用性、可扩展性和灵活性等优点,可以满足不同场景下对存储资源的需求。

二.iSCSI是什么?

iSCSI(Internet Small Computer System Interface)是一种基于网络的存储协议,它可以将远程存储设备映射为本地磁盘,使得计算机可以像访问本地磁盘一样访问远程存储设备。iSCSI协议可以在以太网、光纤通道等网络上运行,它可以在计算机和存储设备之间建立虚拟的SCSI总线,从而实现数据的传输和管理。iSCSI协议可以简化存储系统的管理和部署,提高存储系统的可靠性和性能。

iSCSI 可以运行在用户态或内核态。在 Linux 系统中,iSCSI 的实现通常是使用内核模块,即 iscsi_tcp.ko 和 scsi_transport_iscsi.ko,它们负责处理 iSCSI 传输和 SCSI 命令处理。但是,还有一些用户态的 iSCSI 实现,如 open-iscsi,它使用用户态的 iSCSI 守护进程(iscsid)和 iSCSI 库(libiscsi)。用户态的 iSCSI 实现可以提供更灵活的配置和管理,但通常性能不如内核态的实现。

Go 语言实现的 iSCSI 库和工具可以用于构建和管理 iSCSI 存储系统,例如:

  • go-iscsi:一个基于 Go 语言实现的 iSCSI 库,支持创建和管理 iSCSI 目标和 LUN(逻辑单元)。它可以用于构建自己的 iSCSI 存储系统或集成到其他应用程序中。
  • iscsid:一个基于 Go 语言实现的 iSCSI 守护进程,可以用于创建和管理 iSCSI 目标和 LUN。它支持多个后端存储引擎,包括本地文件系统、Ceph、GlusterFS 等。
  • open-iscsi:一个开源的 iSCSI 实现,包括 iSCSI 客户端(initiator)和服务器端(target)。它基于 C 语言实现,但也有一些 Go 语言的工具和库可以用于与之交互。
  • dqlite:一个基于 Go 语言实现的分布式 SQLite 数据库,支持多节点复制和高可用性。它可以用于构建分布式 iSCSI 存储系统或其他分布式应用程序。

iscsid

iscsid 是 iSCSI 协议的守护进程,主要负责与 iSCSI initiator(客户端)通信,并将 iSCSI 请求转发给 SCSI 设备。在文件系统中,iscsid 通常是使用内核模块实现的。

iscsid 的内核模块通常由两部分组成:iscsi_tcp.ko 和 scsi_transport_iscsi.ko。其中,iscsi_tcp.ko 负责处理 iSCSI 的传输层协议,如建立和维护 TCP 连接、处理 iSCSI 登录和退出等。而 scsi_transport_iscsi.ko 则负责处理 iSCSI 的 SCSI 命令,如将 iSCSI 请求转发给 SCSI 设备、处理 SCSI 命令的响应等。

当 iscsid 启动时,它会加载 iscsi_tcp.ko 和 scsi_transport_iscsi.ko 内核模块,并创建对应的字符设备文件,如 /dev/sda、/dev/sdb 等。这些字符设备文件对应着 iSCSI target(服务器)上的 SCSI 设备,它们可以被当作普通的硬盘使用,可以格式化、挂载、读写等。

当 iSCSI initiator 发送 SCSI 命令时,iscsid 守护进程将命令转发给对应的字符设备文件,比如 /dev/sda。字符设备文件将命令转发给 SCSI 设备,如硬盘。SCSI 设备执行命令并返回结果。字符设备文件将结果返回给 iscsid 守护进程。iscsid 守护进程将结果返回给 iSCSI initiator。

三.RDMA是什么?

RDMA(Remote Direct Memory Access)是一种高性能、低延迟的网络传输技术,它可以让计算机之间直接访问彼此的内存,从而避免了数据在传输过程中的不必要的拷贝和上下文切换。RDMA 技术主要包括两种协议:InfiniBand 和 RoCE(RDMA over Converged Ethernet)。

在 RDMA 技术中,计算机之间的数据传输不再需要 CPU 的介入,而是直接通过网络适配器和内存控制器之间的 DMA 传输实现。这种方式可以大大减少 CPU 的负载和数据传输的延迟,从而提高传输的效率和性能。

RDMA 的工作流程通常包括以下几个步骤:

  • 应用程序将数据写入内存中的缓冲区。
  • 应用程序通过 RDMA API 发送数据传输请求。
  • 网络适配器将数据传输请求发送到目标计算机。
  • 目标计算机的网络适配器接收到数据传输请求。
  • 目标计算机的内存控制器将请求的数据从内存中读取,并通过网络适配器将数据传输给源计算机的内存控制器。
  • 源计算机的内存控制器将数据写入内存中的缓冲区,并通知应用程序传输完成。

RDMA 技术需要硬件和软件的支持,包括网络适配器、内存控制器、驱动程序和 RDMA API 等。此外,RDMA 技术也有一些限制和注意事项,比如需要保证数据传输的顺序和一致性,需要避免内存泄漏和数据溢出等。

Go-IPoIB库是一个Go语言实现的RDMA over IPoIB协议库,其底层原理主要是通过RDMA-CM API来实现RDMA通信。RDMA-CM是一种基于InfiniBand网络的RDMA通信管理器,它提供了一种通用的RDMA通信接口,可以在不同的RDMA网络上运行。RDMA-CM API包括RDMA-CM库和RDMA-CM头文件,可以在Linux系统上使用。

Go-IPoIB库提供了一种使用RDMA-CM API来实现RDMA over IPoIB协议的方法。在使用Go-IPoIB库时,需要使用ipoib.DialIB函数来创建RDMA连接,并指定本地和远程的IP地址和端口号等参数。然后,可以使用RDMA通信的Write和Read函数来进行数据的发送和接收。在数据传输过程中,Go-IPoIB库会自动封装和解封装IPoIB数据包,并使用RDMA-CM API来管理RDMA通信。

Go-IPoIB库的实现涉及到网络协议、硬件设备、系统调用等多个方面,比较复杂。使用Go-IPoIB库需要有一定的计算机网络和系统编程基础,并且需要详细了解RDMA-CM API的使用方法和相关的网络协议规范。

以下是一个简单的示例程序,实现了一个基本的RDMA写操作:

package main
import (
	"fmt"
	"log"
	"net"
	"time"
	"github.com/infiniband/go-ipoib"
)
func main() {
	// 创建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()
	// 发送数据
	data := []byte("hello world")
	err = conn.Write(data)
	if err != nil {
		log.Fatal(err)
	}
	// 接收数据
	buf := make([]byte, len(data))
	err = conn.Read(buf)
	if err != nil {
		log.Fatal(err)
	}
	fmt.Println(string(buf))
}

在此示例中,我们使用ipoib.DialIB函数创建了一个RDMA连接,指定了本地和远程的IP地址和端口号,并设置了缓冲区大小为1024字节。然后,我们使用conn.Write函数向对方发送了一条消息,并使用conn.Read函数从对方接收了一条回复消息。最后,我们将接收到的数据转换为字符串并打印出来。

在实际应用中,需要根据具体的需求进行更复杂的RDMA通信实现,如RDMA读操作、多个连接的管理等。同时,还需要考虑RDMA通信的安全性和稳定性,避免出现数据丢失、死锁等问题。

四.NVME-oF是什么?

NVMe-oF(Non-Volatile Memory Express over Fabrics)是一种将NVMe协议扩展到网络存储中的技术。它可以让远程计算机通过网络访问本地存储设备,从而实现高性能、低延迟、高可用的存储访问。

NVMe-oF技术的实现需要硬件和软件的支持,包括网络适配器、存储控制器、驱动程序和协议栈等。在NVMe-oF架构中,存储设备被分为两个部分:NVMe-oF Target和NVMe-oF Initiator。

NVMe-oF Target是存储设备的服务端,负责响应NVMe-oF Initiator的请求,并将数据传输到本地存储设备中。NVMe-oF Initiator是存储设备的客户端,负责向NVMe-oF Target发送请求,并从本地存储设备中读取数据。

在NVMe-oF技术中,数据传输是通过RDMA(Remote Direct Memory Access)技术实现的,可以实现高带宽、低延迟的数据传输。同时,NVMe-oF技术还支持多种传输协议,包括RoCE(RDMA over Converged Ethernet)、iWARP(Internet Wide Area RDMA Protocol)等。

总的来说,NVMe-oF技术是一种将NVMe协议扩展到网络存储中的技术,可以实现高性能、低延迟、高可用的存储访问。如果你需要更详细的信息,可以查看相关的文档或参考其他相关资料。谢谢!

要在Go中实现NVMe-oF,可以使用GoNVMe库。GoNVMe库是一个基于Go语言实现的NVMe命令行工具和库,可以用于管理和测试NVMe设备和驱动程序。

使用GoNVMe库时,需要先安装NVMe设备和驱动程序,并安装GoNVMe库。然后,可以使用GoNVMe命令行工具来执行各种NVMe操作,如列出NVMe设备、读取NVMe设备的属性、执行NVMe命令等。

以下是一个使用GoNVMe库读取NVMe设备属性的示例程序:

package main
import (
	"fmt"
	"github.com/chenjie199234/GoNVMe/nvme"
)
func main() {
	// 打开NVMe设备
	dev, err := nvme.Open("/dev/nvme0")
	if err != nil {
		panic(err)
	}
	defer dev.Close()
	// 读取NVMe设备属性
	id, err := dev.Identify()
	if err != nil {
		panic(err)
	}
	// 输出NVMe设备属性
	fmt.Printf("%+v\\n", id)
}

在此示例中,我们使用nvme.Open函数打开了一个NVMe设备,并使用dev.Identify函数读取了NVMe设备的属性。然后,我们将读取到的属性信息转换为字符串并打印出来。

使用GoNVMe库需要有一定的计算机存储和系统编程基础,并且需要了解NVMe协议和相关的存储技术。同时,NVMe设备和驱动程序的支持也是使用GoNVMe库的前提条件。

以上就是基于go实例网络存储协议详解的详细内容,更多关于go网络存储协议的资料请关注我们其它相关文章!

(0)

相关推荐

  • go语言中的udp协议及TCP通讯实现示例

    目录 udp协议 server端 client端 TCP通讯(基本) 服务端 客户端 TCP通讯并发服务器 服务端 客户端 udp协议 server端 package main import ( "fmt" "net" ) func main() { // 创建监听 socket, err := net.ListenUDP("udp4", &net.UDPAddr{ IP: net.IPv4(0, 0, 0, 0), Port: 8080

  • Go语言开源库实现Onvif协议客户端设备搜索

    目录 1.前言 2.设备搜索思路 3.搜索设备Go源码 4.问题 1.前言 之前我们已经简单介绍过use-go的开源方案,其也是通过其它的开源方案进行的封装,提供了初步的接口,我们这里利用对onvif协议的学习,然后结合该开源库进行设备发现.设备IP设置.Profiles token获取.流媒体Uri地址获取.PTZ云台控制.预置点设置等功能进行进一步的实现和封装,以此加深对Onvif协议的了解和加深Go语言的使用. 2.设备搜索思路 这个不清楚原理的再去看一下我们Onvif学习时的设备搜索那里

  • Go Grpc Gateway兼容HTTP协议文档自动生成网关

    目录 前言 一,grpc-gateway介绍 二,grpc-gateway环境准备 二,编写grpc-gateway服务 四,使用gateway生成swagger文档 五,性能对比 http -> go -> grpc -> go http -> go -> http -> grpc_gateway -> grpc -> go 六,总结 前言 调用,让客户端可以更具自身情况自由选择,服务端工作只需要做一份呢?还别说真还有一个准备好的轮子那就是今天的主角<

  • golang MySQL实现对数据库表存储获取操作示例

    目录 新建数据库 config.go gameblog.go http Simplify server.go comment.go gameblog.go server.go postman test api Axios gamelist.go HTTP gamelist.go server.go Axios 新建数据库 将部分数据存储至Mysql,使用axios通过golang搭建的http服务器获取数据. sql DROP DATABASE VUE; create database if n

  • Golang gRPC HTTP协议转换示例

    gRPC HTTP协议转换 正当有这个需求的时候,就看到了这个实现姿势.源自coreos的一篇博客,转载到了grpc官方博客gRPC with REST and Open APIs. etcd3改用grpc后为了兼容原来的api,同时要提供http/json方式的API,为了满足这个需求,要么开发两套API,要么实现一种转换机制,他们选择了后者,而我们选择跟随他们的脚步. 他们实现了一个协议转换的网关,对应github上的项目grpc-gateway,这个网关负责接收客户端请求,然后决定直接转发

  • 基于go实例网络存储协议详解

    目录 主要内容 一.网络存储是什么? 二.iSCSI是什么? iscsid 三.RDMA是什么? 四.NVME-oF是什么? 主要内容 一.网络存储是什么? 二.iSCSI是什么? 三.RDMA是什么? 四.NVME-oF是什么? 一.网络存储是什么? 网络存储是一种将存储资源连接到网络上,以便多台计算机可以共享和访问这些存储资源的技术.网络存储可以是基于本地网络的存储(如局域网),也可以是基于广域网的存储(如云存储). 网络存储通常使用网络文件系统(NFS)或存储区域网络(SAN)等协议来实现

  • Websocket协议详解及简单实例代码

    Websocket协议详解 关于websocket的协议是用来干嘛的,请参考其他文章. WebSocket关键词 HTML5协议,实时,全双工通信,长连接 WebSocket比传统Http的好处 客户端与服务端只建立一个TCP连接,可以使用更少的连接 WebSocket的服务端可以将数据推送到客户端,如实时将证券信息反馈到客户端(这个很关键),实时天气数据,比http请求响应模式更灵活 更轻量的协议头,减少数据传送量 数据帧格式 下图为手工打造的数据帧格式 /** * fin |masked |

  • Nodejs多站点切换Htpps协议详解及简单实例

    Nodejs多站点切换Htpps协议详解 纯属赶个时髦,折腾了两天终于将个人小站的全部服务由http协议切换到了https,整个过程虽然也不算太麻烦,但也不得不承认,个人对互联网安全这方面的知识确认比较欠缺: Letsencrypt是由Mozilla.思科和EFF等组织发起的,免费向广大互联网网站提供SSL证书,目的在于加速推进互联网由Http过渡到Https,很高兴周末能够与其不期而遇,这对于一个互联网散户来说,绝对是大大的福利,所以决定乘周末折腾一番:先搞到证书,再改程序: 获取letsen

  • 基于node.js之调试器详解

    1.在命令行窗口中,可以使用"node debug" 命令来启用调试器,代码如下: node debug<需要被执行的脚本文件名>接下来根据一个实例进行学习调试过程: 编写app.js文件进行调试: console.log('hello,word') function foo(){ console.log('hello,foo') return 100; } var bar = 'This is a pen'; var http = require('http') var

  • windows第七层负载均衡_基于IIS的ARR负载均衡详解

    载均衡有很多种方法,有硬件负载均衡,软件负载均衡,还可以从域名解析下手. 不过,今天只讲软件负载均衡. 软件负载均衡一般分两种,从网络协议来讲(tcp/ip),主要集中在第四层和第七层进行负载均衡. 第四层就是基于IP进行负载均衡.后面还有一篇文章讲这个. 第七层就是应用层.比如各种的WEB服务器.今天就讲讲IIS的负载均衡. 第七层的Web负载均衡,很多web服务器都支持,比如IIS,Nginx,apache等.现在主要讲一下windosw下IIS如何使用负载均衡 IIS使用ARR反向代理,实

  • 基于RabbitMQ几种Exchange 模式详解

    AMQP协议中的核心思想就是生产者和消费者隔离,生产者从不直接将消息发送给队列.生产者通常不知道是否一个消息会被发送到队列中,只是将消息发送到一个交换机.先由Exchange来接收,然后Exchange按照特定的策略转发到Queue进行存储.同理,消费者也是如此.Exchange 就类似于一个交换机,转发各个消息分发到相应的队列中. RabbitMQ提供了四种Exchange模式:fanout,direct,topic,header . header模式在实际使用中较少,本文只对前三种模式进行比

  • 基于laravel Request的所有方法详解

    获取请求的实例 通过 Facade Request 这个 facade 可以让我们得到绑定在容器里的当前这个请求.比如: $name = Request::input('name'); 注意,如果你在一个命名空间里,你需要在类文件的顶部使用 use Request; 这条声明来导入 Request 这个 facade . 通过依赖注入 要通过依赖注入得到当前 HTTP 请求的实例,需要在你的控制器构造函数或者方法里 type-hint 类.当前请求的这个实例会被 Service Containe

  • MySQL高级学习笔记(三):Mysql逻辑架构介绍、mysql存储引擎详解

    Mysql逻辑架构介绍总体概览 和其它数据库相比,MySQL有点与众不同,它的架构可以在多种不同场景中应用并发挥良好作用.主要体现在存储引擎的架构上,插件式的存储引擎架构将查询处理和其它的系统任务以及数据的存储提取相分离 . 这种架构可以根据业务的需求和实际需要选择合适的存储引擎. controller层: Connectors:连接层,c .java等连接mysql 业务逻辑处理成: Connection Pool:连接层 c3p0连接池等 Manager Service util:备份.容灾

  • 基于Nginx的Mencached缓存配置详解

    简介 memcached是一套分布式的高速缓存系统,memcached缺乏认证以及安全管制,这代表应该将memcached服务器放置在防火墙后.memcached的API使用三十二比特的循环冗余校验(CRC-32)计算键值后,将数据分散在不同的机器上.当表格满了以后,接下来新增的数据会以LRU机制替换掉.由于memcached通常只是当作缓存系统使用,所以使用memcached的应用程序在写回较慢的系统时(像是后端的数据库)需要额外的代码更新memcached内的数据 特征 memcached作

  • .NET 6实现基于JWT的Identity功能方法详解

    目录 需求 目标 原理与思路 实现 引入Identity组件 添加认证服务 使用JWT认证和定义授权方式 引入认证授权中间件 添加JWT配置 增加认证用户Model 实现认证服务CreateToken方法 添加认证接口 保护API资源 验证 验证1: 验证直接访问创建TodoList接口 验证2: 获取Token 验证3: 携带Token访问创建TodoList接口 验证4: 更换Policy 一点扩展 总结 参考资料 需求 在.NET Web API开发中还有一个很重要的需求是关于身份认证和授

随机推荐