Chinaunix首页 | 论坛 | 博客
  • 博客访问: 509779
  • 博文数量: 112
  • 博客积分: 10
  • 博客等级: 民兵
  • 技术积分: 662
  • 用 户 组: 普通用户
  • 注册时间: 2011-02-20 07:22
个人简介

一步一个脚印

文章分类

全部博文(112)

文章存档

2019年(2)

2017年(2)

2016年(2)

2015年(6)

2014年(35)

2013年(65)

分类: 服务器与存储

2014-03-26 10:31:57

  1. SCSI协议
    1. SCSI(Small Computer System Interface)协议是指小型计算机系统接口,它是一个 协议族,包含了存储各个方面的协议,包括物理接口协议,传输层协议以及一些指 令集协议。SCSI盘通过SCSI总线,与一个适配卡连接在一起,二者使用SCSI协议进 行通信。
    2. SCSI协议中,Initiator设备发送SCSI命令与数据给Target设备,Target设备返回结 果与状态给Initiator。Target设备收到读写请求后,与物理或者虚拟盘进行通信, 称为LU(logical unit)
    3. 基于SCSI技术,主机与外部设备之间通过总线连接在一起。但物理总线连接总是会 有距离限制的。且随着总线的长度增加,传输成本也会增加。iSCSI协议就是为了解 决上述问题产生的。
  2. iSCSI协议
    1. iSCSI协议是SCSI协议族中的一个传输层协议。
    2. iSCSI协议在SCSI协议上再增加一层封装,将SCSI命令与数据封装到一个iSCSI PDU(Protocol Data Unit)中,通过TCP/IP网络,Initiator端与Target端进行通信 。
    3. iSCSI继承了SCSI很多概念,如SCSI协议中有Initiator与Target,LU等,iSCSI协议 中有iSCSI Initiator与iSCSI Target,iSCSI LU等
  3. 让分布式存储支持iSCSI协议
    1. 在iSCSI协议中,Target在收到Initiator发送来的读写请求时,可以将请求再发给 分布式文件系统,并将分布式文件系统的返回结果返回给Initiator。分布式文件系 统在其中扮演LU的角色。
    2. 使用分布式文件系统做LU的好处是,可以保证更高可靠,高可用与高可扩展。用户 在申请虚拟盘时,可以按需申请足够大的虚拟盘来使用,如10T,只要对该虚拟盘格 式化的文件系统支持这么大的size。而分布式文件系统通过多副本或者更高级别的 raid,来保证虚拟盘的可靠性。
    3. 当然缺点也很明显,如果分布式文件系统中存在单点限制,那么即使有备份节点, 当单点故障时,所以虚拟盘都停止服务一段时间。而直接使用物理盘做LU,一般不 会出现所有盘都坏的情况。
    4. 应用场景:使用在存储级别相对低一点的场景中;还有一种应用场景,使用普通 SATA盘通过分布式文件系统做LU,可以使得虚拟盘获得非DIO读写时远高于SATA盘的 读写性能。
  4. 分布式文件系统做iSCSI LU的实现
    1. 使用分布式文件做iSCSI LU,iSCSI Target在收到Initiator的读写请求后,需要将 SCSI指令转为分布式文件系统可接受的协议发过去,并将返回结果反解析返回给 Initiator,具体流程如下,
       Initiator  -->  Target   -->    Distributed FS
                  PDU         RPC Call
                  <--           <-- 
    2. 目前有很多开源iSCSI Target实现,可以在其上做二次开发,使分布式文件系统 支持iSCSI。
  5. 开源iSCSI Target调研
    1. SCST与LIO
      1. SCST是一个相对较早且比较成熟的SCSI Target开源实现。
      2. LIO相比SCST是一个更晚的SCSI Target开源实现,但在与SCST竞争进入Linux内 核中,却以LIO胜出告终。关于二者之间进入Linux内核时的争论,LWN上一篇很 有趣的文章,A tale of two SCSI Targets,中文翻译为“SCSI Target之 双城记”。
      3. 虽然LIO因为进入Linux内核而有了更好的发展前景,但SCST也不差,Fusion-io 公司刚刚收购了SCST的商业支持公司ID7。
    2. Tgt
      1. Tgt也是一个通用的SCST Target开源实现,与前两者不同的是,在支持iSCSI协 议上,Tgt的所有代码是完全工作在用户态的。
      2. Tgt将LU视为backstore,支持backstore可以模块化,也就是说,你可以写一个 模块来支持你自己定义的LU。Tgt提供了多线程api接口,使得编写backstore时 ,可以使用多个线程同时处理SCSI请求。
      3. Tgt的主线程使用epoll LT模型,监听并接收Initiator发来的读写请求与命令 ,而调用对应的backstore处理模块。
    3. iSCSI Target支持LU是分布式文件系统时的优化
      1. iSCSI Target与LU之间支持多连接并发读写请求,对于不要求排序的SCSI命令 与数据,可以并发发给LU
      2. iSCSI Target对SCSI命令与数据进行合并,然后发给LU。
    4. 比较
      1. 无论是SCST还是LIO,我都不认为它们是支持分布式文件系统的最佳选择。首先 ,它们都是工作在内核态的,一旦出问题,会导致系统挂掉,直接影响跑在系 统上的其他线上服务。其次,SCSI与LIO作为通用的SCSI Target实现,在处理 完iSCSI协议后,会把SCSI的处理交给内核SCSI Driver去处理,这对支持分布 式文件做二次开发来说,相对更加困难。
      2. 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的顺序没有要求。当然,也要额外支持多线程等处理。
      3. Tgt由于工作在用户态,没有缺点1,而且Tgt的backstore可以模块化,开发起 来非常方便,同时backstore支持多线程处理,而且Tgt交给backstore的多线程处理的 list已经对顺序不作要求了。
      4. 从以上分析来看,使用Tgt让分布式文件系统支持iSCSI更加有优势,而且更加 方便。目前,开源分布式存储项目sheepdog与hlfs都是基于Tgt开发模块来支持 iSCSI协议的。
    5. Tgt的缺点与改进
      1. Tgt的backstore在使用多线程时,多个线程竞争一个list,开销较大。可以让 每个线程维护一个list,主线程通过CAS无锁队列的方式,将SCSI请求根据rr算 法加入到每个线程的list中。
      2. Tgt的backstore与LU之间连接数与线程数,是1:1关系,且线程数为4,写死了 的。可以修改代码,将连接数改为可配置的。
      3. Tgt使用一个主线程通过epoll接受所有Initiator的读写请求,当登陆的 Initiator较多时,这里可能成为瓶颈。通常来说,这不是问题,因为会iSCSI Target会部署多个的。
Refereneces
阅读(1165) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~