iSCSI 与 ceph
SCSI
小型计算机系统接口(SCSI,Small Computer System Interface)是一种用于计算机及其周边设备之间(硬盘、软驱、光驱、打印机、扫描仪等)系统级接口的独立处理器标准。SCSI标准定义命令、通信协议以及实体的电气特性(换成OSI的说法,就是占据物理层、链接层、套接层、应用层),最大部分的应用是在存储设备上(例如硬盘、磁带机);但,其实SCSI可以连接的设备包括有扫描仪、光学设备(像CD、DVD)、打印机……等等,SCSI命令中有条列出支持的设备SCSI周边设备。理论上,SCSI不可能连接所有的设备,所以有“1Fh - unknown or no device type”这个参数存在。
SAS
(Serial Attached SCSI,串列SCSI)是由并行SCSI物理存储接口演化而来,是由ANSI INCITS T10技术委员会开发的新的存储接口标准。与并行方式相比,串列方式提供更快速的通信传输速度以及更简易的配置。此外SAS支持与串列ATA设备兼容,且两者可以使用相类似的电缆。SATA的硬盘可接在SAS的控制器使用,但SAS硬盘并不能接在SATA的控制器使用。
- 第一代SAS为数组中的每个驱动器提供3.0 Gbps(约3000 Mbps)的传输速率。
- 第二代SAS为数组中的每个驱动器提供6.0 Gbps(约6000 Mbps)的传输速率。
- 第三代SAS为数组中的每个驱动器提供12.0 Gbps(约12000 Mbps)的传输速率。
SATA
串行ATA(Serial ATA: Serial Advanced Technology Attachment)是串列SCSI(SAS: Serial Attached SCSI)的孪生兄弟。两者的排线兼容,SATA硬盘可接上SAS接口。它是一种电脑总线,主要功能是用作主板和大量存储设备(如硬盘及光盘驱动器)之间的数据传输之用。SATA主要用于个人电脑。
SATA版本 | 带宽 | 速度 |
---|---|---|
SATA Express | 16Gb/s | 1969MB/s |
SATA 3.0 | 6Gb/s | 600MB/s |
SATA 2.0 | 3Gb/s | 300MB/s |
SATA 1.0 | 1.5Gb/s | 150MB/s |
iSCSI(Internet Small Computer System Interface,发音为/аɪskʌzi/),Internet小型计算机系统接口,又称为IP-SAN,是一种基于因特网及SCSI-3协议下的存储技术,由IETF提出,并于2003年2月11日成为正式的标准。与传统的SCSI技术比较起来,iSCSI技术有以下三个革命性的变化:
- 把原来只用于本机的SCSI协义通过TCP/IP网络发送,使连接距离可作无限的地域延伸;
- 连接的服务器数量无限(原来的SCSI-3的上限是15);
- 由于是服务器架构,因此也可以实现在线扩容以至动态部署。
功能
iSCSI利用了TCP/IP的port 860 和 3260 作为沟通的渠道。透过两部计算机之间利用iSCSI的协议来交换SCSI命令,让计算机可以透过高速的局域网集线来把SAN模拟成为本地的储存装置。
iSCSI使用 TCP/IP 协议(一般使用TCP端口860和3260)。 本质上,iSCSI 让两个主机通过 IP 网络相互协商然后交换 SCSI 命令。这样一来,iSCSI 就是用广域网仿真了一个常用的高性能本地存储总线,从而创建了一个存储局域网(SAN)。不像某些 SAN 协议,iSCSI 不需要专用的电缆;它可以在已有的交换和 IP 基础架构上运行。然而,如果不使用专用的网络或者子网( LAN 或者 VLAN ),iSCSI SAN 的部署性能可能会严重下降。于是,iSCSI 常常被认为是光纤通道(Fiber Channel)的一个低成本替代方法,而光纤通道是需要专用的基础架构的。但是,基于以太网的光纤通道(FCoE)则不需要专用的基础架构。
虽然 iSCSI 可以与任意类型的 SCSI 设备进行通信,系统管理员几乎总是使用它来连接服务器计算机 (例如,数据库服务器) 和磁盘卷上存储阵列。 使用iSCSI SAN 的目的通常有以下两个:
存储集成 公司希望将不同的存储资源从分散在网络上的服务器移动到统一的位置(常常是数据中心); 这可以让存储的分配变得更为有效。 SAN 环境中的服务器无需任何更改硬件或电缆连接就可以得到新分配的磁盘卷。
灾难恢复 公司希望把存储资源从一个数据中心镜像到另一个远程的数据中心上,后者在出现长时间停电的情况下可以用作热备份。 特别是,iSCSI SAN 使我们只需要用最小的配置更改就可以在 WAN 上面迁移整个磁盘阵列,实质上就是,把存储变成了“可路由的”,就像普通的网络通信一样。
Ceph-iSCSI Gateways
https://www.suse.com/documentation/ses-3/book_storage_admin/data/ceph_iscsi_iscsi.html
LIO
历史
- Linux 2.6.38 为分界线,此前的标准是 Linux SCSI Target , STGT 之后迄今为止的
标准是 Linux-IO Target , LIO 确切的说 Linus Torvalds 在 2011年1月15日将
LIO SCSI Target engine merge 到 Linux 2.6.38 中 - 暂时使用LIO作为IET替代,因为IET当前已不更新,最新版2010年。而LIO已进入内核,
怎么说这几年应该都会持续发展,属于主流应用。
开源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处理模块。
- Tgt也是一个通用的SCST Target开源实现,与前两者不同的是,在支持iSCSI协 议上,
- 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协议的。
- 无论是SCST还是LIO,我都不认为它们是支持分布式文件系统的最佳选择。
- Tgt的缺点与改进
- Tgt的backstore在使用多线程时,多个线程竞争一个list,开销较大。可以让 每个线程维护
一个list,主线程通过CAS无锁队列的方式,将SCSI请求根据rr算 法加入到每个线程的list中。 - Tgt的backstore与LU之间连接数与线程数,是1:1关系,且线程数为4,写死了的。
可以修改代码,将连接数改为可配置的。 - Tgt使用一个主线程通过epoll接受所有Initiator的读写请求,当登陆的Initiator较多时,
这里可能成为瓶颈。通常来说,这不是问题,因为会iSCSI Target会部署多个的。
- Tgt的backstore在使用多线程时,多个线程竞争一个list,开销较大。可以让 每个线程维护