searchusermenu
  • 发布文章
  • 消息中心
点赞
收藏
评论
分享
原创

Ceph iSCSI高可用方案

2023-06-07 07:57:56
95
0

Ceph iSCSI高可用方案

  1. iSCSI target

1.1 Linux SCSI target介绍

GNU/Linux 系统中流行的 SCSI target 框架或 iSCSI target 实现有如下几种:STGT、SCST、Linux-IO。

1.1.1 STGT

Linux target framework(tgt)是为创建、维护SCSI target 驱动(包括iSCSI、FC、SRP等)提供支持。它的关键目标是简洁地集成到scsi-mid层,并且实现大部分应用层空间的tgt。以 Linux 2.6.38 为分界线,此前Linux 中默认的SCSI target是STGT,之后的标准是 Linux-IO Target。STGT(TGT)是一个用户态的 SCSI target 框架,在 GNU/Linux 内核直接集成 SCSI target 框架之前,这是一个绝对主流的框架。由于是基于用户态的框架,因此对集成同在用户态的 RBD 接口是非常简单的,实际上早在 2013 年就已经有 ceph 的开发人员就开发了适配 tgt 的 RBD 后端,并且合入了 tgt 的主干分支。

tgt体系结构中有两个kernel模块:target driver和tgt core。target driver的功能是管理和initiator设备之间的连接,从传输层中取出SCSI命令并交给tgt core。tgt core是连接target driver和tgt daemon的纽带。tgt daemon实现了处理SCSI协议命令部分的功能。Target driver libraries是在用户态实现的访问后端存储的驱动。Transport libraries是用户态中传输模块的实现。目前stgt仅支持iSCSI和iSER,FC和SRP的支持还处于in progress的状态。后端存储支持FILEIO和BLOCKIO,并且还支持提供库函数访问存储的ceph和GLFS

 

1.1.2 SCST 

SCST 是 SCSI target subsystem 的简称,代码继承自 IET(iSCSI Enterprise Target ),分用户态和内核态两部分。由于已经扩展成一个 SCSI target 框架,因此功能远远比 IET 丰富,有多种前后端支持。 它提供Linux内核之间和处理和SCSI目标驱动程序的统一的,一致的接口,同时提供Linux内核与存储后端句柄连接,连接真实或模拟的存储后端与目标驱动程序。SCST支持主流的SCSI数据传输方式,包括光纤通道,iSCSI,SAS,InfiniBand和并行(宽)的SCSI。

虚线上方主要是用户态管理工具,SCST core实现在内核中,中间蓝色为核心子系统(位于SCSI top layer)。SCST core实现了协议无关的SCSI处理功能。Target Drivers实现了SCSI协议的传输层功能。Storage Drivers实现了SCST的后端存储驱动。SCST将target具体驱动封装成可注册的插件驱动,例如经常会用到的iscsi-scst插件,通过这个驱动程序可以在以太网上做iscsi协议的访问。SCST内核核心系统也支持了几个存储设备驱动,从外部使用上就是在配置scsi设备导出时可选择的导出方式,比如blockio、fileio,或者 pass through,这几种导出方式在scst 内核其实是由几个专用的存储驱动完成的,它们实现为可注册插件的形式。

 

1.1.3 Linux-IO

LIO 即 Linux-IO,是目前 GNU/Linux 内核自带的 SCSI target 框架(自 2.6.38 版本开始引入,真正支持 iSCSI 需要到 3.1 版本),对 iSCSI RFC 规范的支持非常好,包括完整的错误恢复都有支持。Linux-IO Target在Linux内核中(linux 2.6.38后),用软件实现各种SCSI Target,其支持的SAN技术中所有流行的存储协议包括Fibre Channel(Qlogic,linux3.5)、FCoE(linux3.0)、iSCSI(linux 3.1)、iSER (Mellanox InfiniBand,linux3.10)、SRP (Mellanox InfiniBand,linux3.3)、USB等,同时还能为本机生成模拟的SCSI设备,以及为虚拟机提供基于virtio的SCSI设备。Linux-IO Target使用户能够使用相对廉价的Linux系统实现SCSI、SAN的各种功能,而不用购买昂贵的专业设备。 

LIO模拟了通用的SCSI设备,并且实现了SPC-3和4。通过各种各样的backstore对象,来导入真正的后端存储,最后连接上各种前端Fabric模块,来导出模拟的SCSI设备。无论是Fibre Channel、FCoE、iSCSI还是vhost(即virtio),都只是一种Fabric技术,我们可以将其理解成传输协议,而在这些传输协议中传输的SCSI命令则总是由核心的SCSI设备处理的。要支持新的Fabric技术,并不需要修改核心的SCSI设备和后端存储模块,只需要按照该Fabric技术的规范实现对SCSI命令的传输就可以了。iSCSI技术就是把SCSI命令放在TCP/IP中传输,vhost技术就是把SCSI命令放在virtio队列中传输。

Generic Target Engine主要是SCSI协议的解析。它通过Fabric模块和initiator通信,通过backstore和具体的存储设备通信。Fabric modules:实现了LIO的前端,即SCSI协议传输层的模块。可以通过Fabric Hardware Abstraction Layer(F-HAL)来为LIO增加新的fabric模块。Backstores:实现了LIO的后端,即访问磁盘数据的方式。可以通过Storage Hardware Abstraction Layer(S-HAL)在LIO中增加新的存储硬件的支持。通常使用BLOCKIO和FILEIO。

Linux-IO Target则在内核态实现了对Target的模拟,配置管理则采用了更为“现代化”的基于sysfs的方式,提供了友好的用户态管理工具。从内核的2.6.38版起,Linux内核都包含Linux-IO Target的相关模块。在用户态,各大发行版都打包了targetcli和rtslib,其中targetcli程序用于配置、管理,rtslib则提供Python编程接口。

 

1.2 Linux SCSI target分析

1.2.1 STGT

在2.6.38之后,STGT默认只剩下用户态的实现,这对于iSCSI target来说,用户态即可满足要求。STGT主要专注于iSCSI。

优点:

1)简单,方便使用和维护。

2)另外已经有ceph的target driver,只是需要做性能优化。

3)因为工作在用户态,所以即使挂掉了,也不会对其他运行的程序产生影响。

缺点:

1)支持的传输协议较少。

2)对SCSI协议支持比较简单。

3)对于多initiator访问同一target的场景,性能表现不好。这个主要是因为tgt的实现所致,即它目前的策略是针对一个lun创建16个线程处理IO。

 

1.2.2 SCST 

SCST的核心模块工作在内核里,可以支持通过系统模块(VFS、块层)访问的后端存储如块设备、文件设备以及passthrough的scsi设备。对于通过library库访问的ceph rbd以及glusterfs等后端存储,SCST也提供了一个模块scst_user,需要开发者自行开发插件。

优点:

1)支持更多传输协议

2)针对性能做了特殊的优化

3)除了基本的SCSI协议支持外,还有一些高级支持:SCST支持永久性预留(Persistent Reservation, PR),这是一个用于高可用集群中的存储设备的 I/O 隔离与存储设备故障切换、接管的特性。通过使用 PR 命令,initiator 可以在一个 target 上建立、抢占、查询、重置预留策略。在故障接管过程中,新的虚拟资源可以重置老的虚拟资源的预留策略,从而让故障切换更快、更容易地进行。

SCST 可以使用异步事件通知来通告会话状态的变更。异步事件通知是 SCSI target 用来向 initiator 进行 target 端的事件告知的协议特性,即使在没有服务请求的时候也可以进行。 initiator 可以在 target 端发生事件时可以得到通知,如设备插入、移除、调整尺寸或更换介质。这让 initiator 可以以即插即用的方式看到 target 的变化。

4)SCSI 协议要求,如果一个 initiator 要清除另一个 initiator 的预留资源时,预留者必须要得到清除通知,否则,多个 initiator 都可能来改变预留数据,就可能会破坏数据。SCST 可以实现安全的预留、释放操作,避免类似事情发生。

5)SCST 支持非对称逻辑卷分配(ALUA)。ALUA 允许 target 管理员来管理 target 的访问状态和路径属性。这让多路径路由机制可以选择最好的路径,从而根据 target 的访问状态,优化带宽的使用。

6)各大存储服务提供商都是基于SCST。

7)提供更细粒度的访问控制策略以及QoS保证机制(限制initiator连接的个数)。

 缺点:

1)结构复杂,二次开发成本较高。

2)工作在kernel,如果挂了,会导致整个机器宕机,影响其他程序。

3)kernel部分没有并入linux,需要手工编译。

 

1.2.3 Linux-IO

Linux-IO的核心模块工作在内核,和SCST一样即支持通过内核模块访问的后端存储,也支持通过library访问的分布式存储,对应的模块是TCMU。

优点:

1)支持较多传输协议。

2)代码并入linux内核,减少了手动编译内核的麻烦。

3)提供了python版本的编程接口rtslib。

4)LIO也支持一些SCST没有的功能。LIO 支持 会话多连接(MC/S)。MC/S 让 initiator 可以和 target 在一条或多条物理路径上建立多条连接。这样,在一条路径发生错误的时候,已经建立好的会话可以不中断会话,直接使用其他的路径。MC/S 还可以用来进行所有连接之间的负载均衡。这种情况下,会在所有通信路径上保持会话命令的顺序性。

5)LIO支持最高级别的ERL。iSCSI 连接的错误可能会发生在三个层面上:会话、校验或是连接层。错误恢复工作也可以在这三个层面开始进行,这样就可以在当前的层面开始进行恢复,不会让错误到达下一个层面。错误恢复首先是检查断开的连接。在这种情况下,iSCSI initiator 驱动会主动建立新的到 target 的 TCP 连接它会告诉 target,SCSI 指令路径已经变到新的连接上了。这样 target 就可以在新的连接上处理 SCSI 命令了。这时,上层的 SCSI 驱动对新的连接已经建立、控制信息已经通过新连接传输的事还是毫无知觉的。iSCSI 会话在这期间会保持正常,不会重新变换状态。LIO 支持的最大错误恢复级别(ERL)为2,这就是说,它可以在会话、校验或连接层进行错误恢复。而SCST 支持的 ERL 为 0,也就是说,它智能恢复会话级别的错误,所有连接层面的错误都会转到 SCSI 驱动层面来处理。

缺点:

1)不支持异步事件通知,所以target状态发生变化时,只能通过IO或者用户手动触发以检测处理变化。

2)结构相对复杂,二次开发成本较高。

3)工作在内核态,出现问题会影响其他程序的运行。

 

  1. Linux Multipath

普通的电脑主机都是一个硬盘挂接到一个总线上,这里是一对一的关系。而到了有光纤组成的SAN环境,或者由iSCSI组成的IPSAN环境,由于主机和存储通过了光纤交换机或者多块网卡及IP来连接,这样的话,就构成了多对多的关系。也就是说,主机到存储可以有多条路径可以选择。主机到存储之间的IO由多条路径可以选择。每个主机到所对应的存储可以经过几条不同的路径,如果是同时使用的话,I/O流量如何分配?其中一条路径坏掉了,如何处理?还有在操作系统的角度来看,每条路径,操作系统会认为是一个实际存在的物理盘,但实际上只是通向同一个物理盘的不同路径而已,这样是在使用的时候,就给用户带来了困惑。多路径软件就是为了解决上面的问题应运而生的。多路径的主要功能就是和存储设备一起配合实现如下功能: 故障的切换和恢复,IO流量的负载均衡,磁盘的虚拟化。

由于多路径软件是需要和存储在一起配合使用的,不同的厂商基于不同的操作系统,都提供了不同的版本。并且有的厂商,软件和硬件也不是一起卖的,如果要使用多路径软件的话,可能还需要向厂商购买license才行。比如EMC公司基于linux下的多路径软件,就需要单独的购买license RedHat和Suse的2.6的内核中都自带了免费的多路径软件包,并且可以免费使用,同时也是一个比较通用的包,可以支持大多数存储厂商的设备,即使是一些不是出名的厂商,通过对配置文件进行稍作修改,也是可以支持并运行的很好的。

2.1 Multipath组成

完整的multipath由下面几部分组成:

device-mapper-multipath提供multipathd和multipath等工具和multipath.conf等配置文件。这些工具通过device mapper的ioctr的接口创建和配置multipath设备(调用device-mapper的用户空间库。创建的多路径设备会在/dev/mapper中)。

device-mapperdevice-mapper包括两大部分:内核部分和用户部分。内核部分由device-mapper核心(multipath.ko)和一些target driver(dm-multipath.ko)构成。dm-mod.ko是实现multipath的基础,dm-multipath其实是dm的一个target驱动。核心完成设备的映射,而target根据映射关系和自身特点具体处理从mappered device 下来的i/o。同时,在核心部分,提供了一个接口,用户通过ioctr可和内核部分通信,以指导内核驱动的行为,比如如何创建mappered device,这些device的属性等。

用户空间部分包括device-mapper这个包。其中包括dmsetup工具和一些帮助创建和配置mappered device的库。这些库主要抽象,封装了与ioctr通信的接口,以便方便创建和配置mappered device。device-mapper-multipath的程序中就需要调用这些库。

scsi_id:其包含在udev程序包中,可以在multipath.conf中配置该程序来获取scsi设备的序号。通过序号,便可以判断多个路径对应了同一设备。这个是多路径实现的关键。scsi_id是通过sg驱动,向设备发送EVPD page80或page83 的inquery命令来查询scsi设备的标识。但一些设备并不支持EVPD 的inquery命令,所以他们无法被用来生成multipath设备。但可以改写scsi_id,为不能提供scsi设备标识的设备虚拟一个标识符,并输出到标准输出。

multipath程序在创建multipath设备时,会调用scsi_id,从其标准输出中获得该设备的scsi id。在改写时,需要修改scsi_id程序的返回值为0。因为在multipath程序中,会检查该直来确定scsi id是否已经成功得到。

2.2 Multipath命令

# multipath -F   //清空已有的multipath记录

# multipath -v2 //格式化路径 

 # multipath -ll   //查看多路径当前状态

 #/lib/udev/scsi_id --whitelisted --device=/dev/sdb //查看本地存储wwid

#multipath -v3 //打印诊断信息

#multipath -v4 //查看系统日志

#service multipathd reload //重新加载配置信息

2.3 Multipath配置

multipath.conf文件的配置选项说明,multipath.conf主要包括blacklist、multipaths、devices、defaults四部份的配置。

2.3.1 blacklist

blacklist不被视为多路径的具体设备列表。默认情况下,multipath会把所有设备都加入到黑名单(devnode "*"),也就是禁止使用。例如:

 blacklist { 

         #devnode "*" 

         devnode "^sd[d-e]" 

        wwid  3600140539a80143251e44fc93e0e9f43

 }

 devnode条目指定要列入黑名单的设备名称,而不是指定具体类型的所有设备。该示例中取消禁止使用所有设备的设置,把配置文件修改为禁止使用sdd、sde,使用wwid限制使用本地的sdc设备的使用。可通过下面的命令获得wwid:

 [root@node1 ~]# /lib/udev/scsi_id --whitelisted --device=/dev/sdc

 3600140539a80143251e44fc93e0e9f43

2.3.2 multipaths

各个独立多路径设备的特性设置。这些数值覆盖了在配置文件的 defaults和 devices部分中指定的数值。Multipaths部分配置multipaths和devices两部分的配置,选项与devices选项类似。

2.3.3 devices

各个存储控制器的设置属性。这些数值覆盖了在配置文件的 defaults 部分指定的数值。如果要使用不是默认支持的存储阵列,可能需要为这些阵列创建 devices 子部分。具体阐述本文配置文件该部分的配置。

devices {

   device {

           vendor                          "LIO-ORG"             //指定device 采用的存储设备的零售商名称

hardware_handler        "1 alua"                  //指定将在切换路径组群或者处理 I/O 错误时用来执行硬件具体动作的模块。"1 alua"表示SCSI-3 ALUA 阵列的硬件处理程

 path_grouping_policy   "failover"                //指定用于未指定路径的默认路径分组策略。path_grouping_policy默认为failover,每个优先组群有一个路径,即主备的方式

path_selector                "queue-length 0"   //指定用来决定下一个 I/O 操作所使用路径的默认算法。"queue-length 0"表示将下一组 I/O 发送到具有最少未处理 I/O 请求的路径。

 failback                         60                          //管理路径组群出错切换。大于 0 的数字值指定推迟出错切换,以秒表示。

path_checker                tur                         //指定用于决定路径状态的默认方法。tur表示在该设备中执行 TEST UNIT READY。

prio                               alua                       //指定要获得路径优先值所需调用的默认程序。alua表示根据 SCSI-3 ALUA 设置生成路径优先权。

prio_args                      exclusive_pref_bit //指定要获得路径优先值所需调用的默认程序的参数。 从Red Hat Enterprise Linux 6.8开始,如果在设备配置中指定prio“alua exclusive_pref_bit”,多路径将创建一个路径组,其中只包含pref位设置的路径,并将为该路径组赋予最高优先级。

 no_path_retry               120                        //在disable queue之前系统尝试使用失效路径的次数

}

}

2.3.4 defaults

DM-Multipath 的常规默认设置。

 

  1. LIO-TCMU

LIO也即Linux-IO,是目前GNU/Linux内核自带的SCSI target框架(自2.6.38版本开始引入,真正支持iSCSI需要到3.1版本),对iSCSI RFC规范的支持非常好,包括完整的错误恢复都有支持。整个 LIO 是纯内核态实现的,包括前端接入和后端存储模块, 为了支持用户态后端,从内核 3.17 开始引入用户态后端支持,即 TCMU(Target Core Module in Userspace),TCMU 基于前面所提到的 UIO,其最初的设计目标就是为了支持 用户态的 RBD、gluster 等,因此如果需要 LIO-TCMU 支持用户态 RBD,只需要设计用户态 应用程序即可。目前在 github 上已经有红帽的开发者写了一个 TCMU 的用户态程序框架,其设计目的 是让用户态存储后端开发人员只需要开发相关的插件(即动态库)即可,由框架自动调用相 关的插件处理 SCSI 命令。

  1. 方案设计

4.1 架构拓扑

iSCSI target机器:

node0:10.21.1.95

node1:10.21.1.96

 

iSCSI initiator机器:

node3:10.21.1.94

 

ceph集群机器:

ceph01:10.21.1.97

ceph02:10.21.1.98

ceph03:10.21.1.99

4.2 整体架构

 

0条评论
0 / 1000
杨****辉
2文章数
0粉丝数
杨****辉
2 文章 | 0 粉丝