【分析】通过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

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

【分析】通过Ceph RBD实现iSCSI_第1张图片

正如我们在图片中所看到的,我们在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 未本地化版本许可协议进行许可。


你可能感兴趣的:(数据存储,Ceph存储系统,深入理解CEPH系统)