-
SCSI协议
-
SCSI(Small Computer System Interface)协议是指小型计算机系统接口,它是一个 协议族,包含了存储各个方面的协议,包括物理接口协议,传输层协议以及一些指 令集协议。SCSI盘通过SCSI总线,与一个适配卡连接在一起,二者使用SCSI协议进 行通信。
-
SCSI协议中,Initiator设备发送SCSI命令与数据给Target设备,Target设备返回结 果与状态给Initiator。Target设备收到读写请求后,与物理或者虚拟盘进行通信, 称为LU(logical unit)
-
基于SCSI技术,主机与外部设备之间通过总线连接在一起。但物理总线连接总是会 有距离限制的。且随着总线的长度增加,传输成本也会增加。iSCSI协议就是为了解 决上述问题产生的。
-
iSCSI协议
-
iSCSI协议是SCSI协议族中的一个传输层协议。
-
iSCSI协议在SCSI协议上再增加一层封装,将SCSI命令与数据封装到一个iSCSI PDU(Protocol Data Unit)中,通过TCP/IP网络,Initiator端与Target端进行通信 。
-
iSCSI继承了SCSI很多概念,如SCSI协议中有Initiator与Target,LU等,iSCSI协议 中有iSCSI Initiator与iSCSI Target,iSCSI LU等
-
让分布式存储支持iSCSI协议
-
在iSCSI协议中,Target在收到Initiator发送来的读写请求时,可以将请求再发给 分布式文件系统,并将分布式文件系统的返回结果返回给Initiator。分布式文件系 统在其中扮演LU的角色。
-
使用分布式文件系统做LU的好处是,可以保证更高可靠,高可用与高可扩展。用户 在申请虚拟盘时,可以按需申请足够大的虚拟盘来使用,如10T,只要对该虚拟盘格 式化的文件系统支持这么大的size。而分布式文件系统通过多副本或者更高级别的 raid,来保证虚拟盘的可靠性。
-
当然缺点也很明显,如果分布式文件系统中存在单点限制,那么即使有备份节点, 当单点故障时,所以虚拟盘都停止服务一段时间。而直接使用物理盘做LU,一般不 会出现所有盘都坏的情况。
-
应用场景:使用在存储级别相对低一点的场景中;还有一种应用场景,使用普通 SATA盘通过分布式文件系统做LU,可以使得虚拟盘获得非DIO读写时远高于SATA盘的 读写性能。
-
分布式文件系统做iSCSI LU的实现
-
使用分布式文件做iSCSI LU,iSCSI Target在收到Initiator的读写请求后,需要将 SCSI指令转为分布式文件系统可接受的协议发过去,并将返回结果反解析返回给 Initiator,具体流程如下,
Initiator --> Target --> Distributed FS
PDU RPC Call
<-- <--
-
目前有很多开源iSCSI Target实现,可以在其上做二次开发,使分布式文件系统 支持iSCSI。
-
开源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处理模块。
-
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协议的。
-
Tgt的缺点与改进
-
Tgt的backstore在使用多线程时,多个线程竞争一个list,开销较大。可以让 每个线程维护一个list,主线程通过CAS无锁队列的方式,将SCSI请求根据rr算 法加入到每个线程的list中。
-
Tgt的backstore与LU之间连接数与线程数,是1:1关系,且线程数为4,写死了 的。可以修改代码,将连接数改为可配置的。
-
Tgt使用一个主线程通过epoll接受所有Initiator的读写请求,当登陆的 Initiator较多时,这里可能成为瓶颈。通常来说,这不是问题,因为会iSCSI Target会部署多个的。
Refereneces
阅读(1169) | 评论(0) | 转发(0) |