【分析】通过Ceph RBD实现iSCSI

作者:SebastianHan

原文:https://sebastien-han.fr/blog/2017/01/05/Ceph-RBD-and-iSCSI/

译者:Younger Liu

 

这篇文章是一系列关Ceph 特性博客文章的第一篇。我说错了一点,今天将解密一个在Jewel中不被注意到的功能。因此,我们正在讨论一些在新的Ceph版本中已经可用的功能。这个特性并没有真正的名称,它是支持基于RBD的iSCSI。通过这种方案,可以将Ceph 存储应用到虚拟机或者不支持原生RBD协议操作系统。从技术上讲,这是针对不能直接使用QEMU或KRBD的库的非Linux用户。

 

1     理由

在深入研究之前,让我们先回顾一下历史。不确定您是否还记得几年前,我曾测试过RBD和TGT的最初实现。经过几个月的社区用户测试,发现这个早期的原型缺乏特性和健壮性,因此不适合企业的需求。企业需要具有多路径高可用性persistent reservation(见解释1)、低延迟高吞吐量并行性强认证方法等高级特性。所有这些都不能通过TGT来实现。因此,Linux内核中的LIO Target的工作已经开始,以提供HA功能。LIO是一个多协议内核SCSI目标,与其他的Target——IET、TGT和SCST不同,LIO完全是内核代码。

 

2     术语解释

iSCSI充满了概念和独特的词汇,所以解释其中的一些:

Target (Server)是一个端点,它不启动会话,而是等待发起者的命令,并提供所需的输入/输出数据传输。维基百科

Initiator  (Client)是启动SCSI会话的端点,即发送SCSI命令。维基百科

LUN:映射在服务器上的网络块设备。

多路径:LUN HA和负载均衡模型。

 

3     LIO和RBD

此功能依赖于多个软件栈。

正如我们在图片中所看到的,我们在OSD服务器上配置iSCSI网关。在这个示例中,配置了3个iSCSI网关,但是您可以配置更多。一般来说,控制器支持多达8个网关,这已经是很多了。如图所示,每个LUN被映射到特定的Target(网关),由于使用了多路径Active / Passive Alua。Alua是SCSI基本概念和命令的集合,这些概念和命令定义了SCSI设备的路径优先级。负载平衡在LUN创建时处理,active路径在网关之间自动平衡。

 

3.1   高可用性

高可用性是通过RBD锁 (exclusive lock特性)、Ceph的 watch notify特性和启动器Initiator 的多路径堆栈来实现的。

多路径允许我们在检测到失败时可以通过不同Target的路径变更受影响IO的路径。本方案中HA是通过在多个OSD节点上部署配置iSCSI Target来实现的,因此Initiator 知道所有的网关,因此通过preferred网关转发IO。当我们使用Alua时,所有Target都是活动的,可以接受IO,但是每个LUN都有一个受preferred Target。

 

3.2   故障处理

上述所描述的都是Initiator客户端的处理流程。一旦iSCSI网关关闭,Initiator程序将执行路径故障转移。因此,已经在执行中的I/O通常会暂停几秒钟,直到系统认定路径故障并将I/O重试到其他网关之一。由于我们目前使用Alua Active / Passive模式,故障转移不能是即时的,因为故障即时转移Active / Active模式所期望的(也就是说Active / Active模式能够达到故障即时转移)。

 

3.3   认证

Initiator到Target的连接需要由身份验证机制处理。目前只涉及CHAP(显然没有AUTH),目前Ansible安装程序能够配置。但是我对他不太熟悉,所以我鼓励你读维基百科的文章。

 

4     部署

目前,Target可以在Ansible的帮助下进行部署和配置。很快,这项工作将合并在Ceph-Ansible中。

 

5     即将开展的工作

当前的LIO iblock + krbd iSCSI实现有一些限制:

1. 由于RBD exclusivelock锁定特性,仅限于Active/Passive (Alua Active优化/Active非优化)

2. 最终支持PGRs将需要许多新的 calloutsand hooks子进入块层。

3. 内核开发(依赖),因此除非您是RedHat、SUSE或不断将内核升级到最后一个内核的人,否则很难提供解决方案

这就是为什么开发人员目前正在调查切换到LIO TCMU + librbd iSCSI方案的原因。TCM是LIO的另一个名字,也是在内核空间。TCMU是TCM的用户态实现(谢谢AndyGrover!)。TCMU是将SCSI命令传递给用户空间的LIO target_core_user内核模块,tcmu-runner是用户空间组件——处理这些命令并将它们传递给设备特定执行程序的驱动程序。tcmu-rbd是将SCSI命令转换为Ceph/rbd请求的tcmu-run驱动程序。

 

使用用户态组件会带来许多好处,如:

不需要内核代码

更容易发布软件

专注于您自己的后端,在我们的例子中是RBD

 

6     解释

6.1   persistent reservation

通常来讲SCSI锁有两种类型:SCSI-2 Reservation和SCSI-3 Reservation,这里SCSI-3Reservation也称之为Persistent Reservation。这两种类型的的锁是不能共存在一个Lun上的。

SCSI-2Reservation只允许设备被发出加锁的Initiator访问,这里Initiator一般指HBA。比如HostA上的fcs0对访问的LUN加上SCSI-2锁,此时即使HostA上的fcs1也无法访问该Lun。所以SCSI-2 Reservation有时也被称为single-pathreservation。

SCSI-3Reservation(Persistent Reservation)是使用PR Key来对设备进行加锁。通常一台Host会有唯一的PR Key,不同的host,PR Key也不同。所以一般SCSI-3 Reservation通常被应用在多通路的共享环境下面。



作者:Younger Liu

本作品采用知识共享署名-非商业性使用-相同方式共享 3.0 未本地化版本许可协议进行许可。


  • 1
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
目录 第一章 简介 1 1.1.什么是SPDK? 1 1.2.入门 1 1.3. Vagrant开发环境 3 1.4.更新日志(略) 6 第二章 概念 6 2.1. 用户空间驱动程序** 6 2.2. 来自用户空间的DMA** 7 2.3. 消息传递和并发** 9 2.4. NAND Flash SSD内部 13 2.5. 将I / O提交到NVMe设备** 15 2.5.1 NVMe规范 15 2.5.2 SPDK NVMe驱动程序I / O路径 15 2.6. 使用Vhost-user进行虚拟化I / O. 16 2.6.1 介绍 16 2.6.2 QEMU 17 2.6.3 设备初始化 18 2.6.4 I / O路径 19 2.6.5 SPDK优化 20 2.7. SPDK目录结构概述 20 2.8. SPDK移植指南 22 第三章 用户指南 22 3.1. 系统配置用户指南 22 3.1.1 IOMMU配置 22 3.2. SPDK应用程序概述 23 3.2.1 配置SPDK应用程序 23 3.3. iSCSI Target 26 3.3.1. iSCSI Target入门指南 26 3.3.2. 通过配置文件配置iSCSI Target 27 3.3.3. 通过RPC方法配置iSCSI Target 28 3.3.4. 配置iSCSI启动器 29 3.3.5. rpc配置示例*** 30 3.3.6. iSCSI 热插拔 32 3.4. NVMe over Fabrics Target 32 3.5. Vhost Target(略) 37 3.6 块设备用户指南 38 3.6.1 bdev介绍 38 3.6.2 通用RPC命令 38 3.6.3 Ceph RBD 39 3.6.4 压缩虚拟Bdev模块 40 3.6.5 加密虚拟Bdev模块 41 3.6.6 延迟vbdev模块 41 3.6.7 GPT(GUID分区表) 42 3.6.8 iSCSI bdev 43 3.6.9 Linux AIO bdev 43 3.6.10 OCF虚拟bdev 43 3.6.11 Malloc bdev 44 3.6.12 NULL bdev 44 3.6.13 NVMe bdev 44 3.6.14 逻辑卷Lvol 45 3.6.15 RAID 46 3.6.16 Passthru 46 3.6.17 Pmem 46 3.6.18 Virtio Block 47 3.6.19 Virtio SCSI 47 3.7 BlobFS(Blobstore文件系统) 48 3.7.1 RocksDB集成 48 3.7.2 FUSE插件 49 3.8 JSON-RPC方法(略) 49 第四章 程序员指南 49 4.1. Blobstore程序员指南 49 4.1.1 介绍 50 4.1.2 运作理论 50 4.1.3 设计注意事项 52 4.1.4 例子 54 4.1.5配置 54 4.1.6 组件细节 54 4.2. 块设备层编程指南 56 4.3 编写自定义块设备模块 58 4.3.1 介绍 58 4.3.2 创建一个新模块 59 4.3.3创建虚拟Bdev 60 4.4 NVMe over Fabrics目标编程指南 61 4.4.1 介绍 61 4.4.2 原语结构体 61 4.4.3 基础函数 62 4.4.4访问控制 62 4.4.5发现子系统 62 4.4.6 传输 63 4.4.7选择线程模型 63 4.4.8 跨CPU核心扩展 63 4.4.9 零拷贝支持 63 4.4.10 RDMA 63 4.5 Flash传输层 64 4.5.1 术语 64 4.5.2 使用方法 67 4.6 GDB宏用户指南 69 4.6.1 介绍 69 4.6.2 加载gdb宏 71 4.6.3 使用gdb数据目录 72 4.6.4 使用.gdbinit加载宏 72 4.6.5 为什么我们需要显式调用spdk_load_macros 72 4.6.6 以上可用的宏总结 73 4.6.7 添加新宏 73 4.7 SPDK “Reduce”块压缩算法 73 4.7.1 介绍 73 4.7.2 例子 74 4.8 通知库 78 第五章 基本信息 79 5.1 事件框架 79 5.1.1 事件框架设计注意事项 80 5.1.2 SPDK事件框架组件 80 5.1.3 应用框架 80 5.2 逻辑卷 81 5.2.1 术语 81 5.2.2 配置逻辑卷 84 5.3 矢量数据包处理(略) 86 第六章 杂项 86 6.1 介绍 86 6.2 NVMe的P2P API 86 6.3 确定设备支持 87 6.4 P2P问题 87 第七章 驱动程序 88
SPDK(存储性能开发套件)官方文档中文版。 第一章 简介 1 1.1.什么是SPDK? 1 1.2.入门 1 1.3. Vagrant开发环境 3 1.4.更新日志(略) 6 第二章 概念 6 2.1. 用户空间驱动程序** 6 2.2. 来自用户空间的DMA** 7 2.3. 消息传递和并发** 9 2.4. NAND Flash SSD内部 13 2.5. 将I / O提交到NVMe设备** 15 2.5.1 NVMe规范 15 2.5.2 SPDK NVMe驱动程序I / O路径 15 2.6. 使用Vhost-user进行虚拟化I / O. 16 2.6.1 介绍 16 2.6.2 QEMU 17 2.6.3 设备初始化 18 2.6.4 I / O路径 19 2.6.5 SPDK优化 20 2.7. SPDK目录结构概述 20 2.8. SPDK移植指南 22 第三章 用户指南 22 3.1. 系统配置用户指南 22 3.1.1 IOMMU配置 22 3.2. SPDK应用程序概述 23 3.2.1 配置SPDK应用程序 23 3.3. iSCSI Target 26 3.3.1. iSCSI Target入门指南 26 3.3.2. 通过配置文件配置iSCSI Target 27 3.3.3. 通过RPC方法配置iSCSI Target 28 3.3.4. 配置iSCSI启动器 29 3.3.5. rpc配置示例*** 30 3.3.6. iSCSI 热插拔 32 3.4. NVMe over Fabrics Target 32 3.5. Vhost Target(略) 37 3.6 块设备用户指南 38 3.6.1 bdev介绍 38 3.6.2 通用RPC命令 38 3.6.3 Ceph RBD 39 3.6.4 压缩虚拟Bdev模块 40 3.6.5 加密虚拟Bdev模块 41 3.6.6 延迟vbdev模块 41 3.6.7 GPT(GUID分区表) 42 3.6.8 iSCSI bdev 43 3.6.9 Linux AIO bdev 43 3.6.10 OCF虚拟bdev 43 3.6.11 Malloc bdev 44 3.6.12 NULL bdev 44 3.6.13 NVMe bdev 44 3.6.14 逻辑卷Lvol 45 3.6.15 RAID 46 3.6.16 Passthru 46 3.6.17 Pmem 46 3.6.18 Virtio Block 47 3.6.19 Virtio SCSI 47 3.7 BlobFS(Blobstore文件系统) 48 3.7.1 RocksDB集成 48 3.7.2 FUSE插件 49 3.8 JSON-RPC方法(略) 49 第四章 程序员指南 49 4.1. Blobstore程序员指南 49 4.1.1 介绍 50 4.1.2 运作理论 50 4.1.3 设计注意事项 52 4.1.4 例子 54 4.1.5配置 54 4.1.6 组件细节 54 4.2. 块设备层编程指南 56 4.3 编写自定义块设备模块 58 4.3.1 介绍 58 4.3.2 创建一个新模块 59 4.3.3创建虚拟Bdev 60 4.4 NVMe over Fabrics目标编程指南 61 4.4.1 介绍 61 4.4.2 原语结构体 61 4.4.3 基础函数 62 4.4.4访问控制 62 4.4.5发现子系统 62 4.4.6 传输 63 4.4.7选择线程模型 63 4.4.8 跨CPU核心扩展 63 4.4.9 零拷贝支持 63 4.4.10 RDMA 63 4.5 Flash传输层 64 4.5.1 术语 64 4.5.2 使用方法 67 4.6 GDB宏用户指南 69 4.6.1 介绍 69 4.6.2 加载gdb宏 71 4.6.3 使用gdb数据目录 72 4.6.4 使用.gdbinit加载宏 72 4.6.5 为什么我们需要显式调用spdk_load_macros 72 4.6.6 以上可用的宏总结 73 4.6.7 添加新宏 73 4.7 SPDK “Reduce”块压缩算法 73 4.7.1 介绍 73 4.7.2 例子 74 4.8 通知库 78 第五章 基本信息 79 5.1 事件框架 79 5.1.1 事件框架设计注意事项 80 5.1.2 SPDK事件框架组件 80 5.1.3 应用框架 80 5.2 逻辑卷 81 5.2.1 术语 81 5.2.2 配置逻辑卷 84 5.3 矢量数据包处理(略) 86 第六章 杂项 86 6.1 介绍 86 6.2 NVMe的P2P API 86 6.3 确定设备支持 87 6.4 P2P问题 87 第七章 驱动程序 88 7.1 NVMe驱动程序*** 88 7.1.1 介绍 88 7.1.2 例子 88 7.1.3 公共接口 89 7.1.4 NVMe驱动程序设计 89 7.1.5 NVMe over Fabrics主机支持 91 7.1.6 NVMe多进程 91 7.1.7 NVMe Hotplug 92 7.2 I/OAT驱动程序 93 7.2.1 公共接口 93 7.2.2 关键功能 93 7.3 Virtio驱动程序 93 7.3.1 介绍 93 7.3.2 2MB大页面 93 第八章 工具 94 8.1 SPDK CLI 94 8.1.1 安装所需的依赖项 94 8.1.2 运行SPDK应用程序实例 94 8.1.3 运行SPDK CLI 94 8.1.4 可选 - 创建Python虚拟环境 94 8.2 nvme-CLI 95 8.2.1 nvme-cli with SPDK入门指南 95 8.2.2 使用场景 95 第九章 性能测试报告(略) 96 第十章NVMe-oF Target跟踪点*** 96 10.1 介绍 96 10.2 启用跟踪点 97 10.3 捕获事件的快照 97 10.4 捕获足够的跟踪事件 98 10.5 添加新的跟踪点 99

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值