内容纲要

多路径ALUA技术如何优化I/O处理

什么是ALUA多路径机制

  ALUA是异步逻辑单元访问(Asymmetric Logical Unit Access)的缩写,ALUA是SPC3 (SCSI Primary commands-3)协议中规定的目标器端口组TPGS (Target Port Group Support)访问模型中的一类子集,可用于处理A/A-A (Active/ Active-Asymmetric) 和 A/P(Active /Passive)阵列的多端口访问管理。所以通常情况下,ALUA被认为是一种多路径访问模型。但实际上ALUA需要多路径和存储阵列同时支持才能实现路径优化访问,它更是前端控制器多路径机制。

 存储前端控制器多路径机制在一定程度上决定存储的读写性能和可靠性,现有的前端控制器多路径机制大致可分为A/A-S(Active/Acivie-Symmetric)、ALUA和A/P(Active/Passive)三大类。

 先说说A/A-S(Active/Acivie-Symmetric)机制,对于特定的LUN来说,在它的路径中,多个存储控制器的目标端口均处于主动/优化(Active/optimized)状态。多个控制器之间通过PCIe或Infiniband等实现高速互联的通讯,从主机侧发送一个IO到控制器端后,多个控制器可同时参与IO处理;存储系统会自动负载均衡,当一个控制器繁忙或业务压力较大时,存储系统不需要主机端多路径负载均衡软件参与就可以自动实现负载均衡。

 对于ALUA(Active/Active-Asymmetric)机制来说,特定的LUN在控制器的路径组中,只有一个控制器的目标端口组处于主动/优化(Active/Optimized)状态,其他控制器的目标端口组处于主动/非优化(Active/Unoptimized)状态。某个时刻一个特定LUN只属于某一个优选控制器,在多路径的配合下,IO从优选控制的IO组(Active/Optimized)下发IO,多路径不会发送该LUN的IO到其他控制器,一般通过将LUN A归属控制器A,将LUNB归属给控制器B实现两边的负载均衡,归属操作可以手动或自动完成。

 还有一种是A/P(Active/Passive)机制,一般只用在低端双活存储阵列中。现在这种架构已经很少见了。对于特定的LUN来说,在对应存储的路径中只有一个控制器的目标端口处于主动/优化(Active/Optimized)状态,其他控制器的目标端口处于备用或平时不工作状态,其负载均衡处理方式与ALUA类似(即根据优选控制器来决定),但是由于多路径和存储互不相识(多路径不知道那些路径是优选路径),IO很难选到合适的路径,IO的下发可以说这完全取决于上层多路径的心情,解决方案是提供自研多路径来配合阵列选路,通过私有协议实现IO到优选路径的匹配。

ALUA在双活中如何应用

 前面在双活解决方案系列中,不知一次提到基于多路径ALUA实现IO优选路径下发,从而避免IO在主备数据中心来回转发带来的IO时延问题。多路径主要有以下几个功能。

 1、通过路径管理把SCSI上报的物理路径管理起来,对主机呈现一个虚拟的路径(SCSI设备),这样可以防止主机在读写设备时带来的数据不一致问题。

 2、基于IO策略选择物理路径,实现IO业务负载均衡和业务分担。

 3、当主路径发生故障时,可以对IO进行透明的主从切换(FailOver),当路径恢复后自动进行回切(FailBack)。

 这些特性主要是针对一个Volume或LUN而言的,那么在一套存储系统中,如何识别多个路径上报的设备是同一个LUN呢?答案其实很简单,只需要LUN在上报时采用同样的WWN或LUN ID多路径就会认为这些不同路径上报的LUN是同一个设备。

 在双活的两个存储系统中,通过在阵列侧把不同阵列LUN(双活Pair)的WWN或LUN ID设置成一样,配合可靠的冗余交叉组网上报设备时,在主机上就会把两个存储系统的LUN识别为是同一个LUN,在主机IO下发时,如果多路径支持ALUA模式 ,那就可以把本地存储路径设置成Active/optimized,把对端存储路径设置成Active/unoptimized来实现IO和性能优化。

ALUA的路径状态和相关概念

 Active/optimized、Active/unoptimized、Standby和Unavailable是目标端口的四种访问状态,在相应访问状态下,阵列控制器只能回应相应的命令标准(命令标准由ISO/IEC SPC-3制定),这就决定了在某一时刻是否可以通过某个目标端口访问逻辑单元。

 ALUA是一种多路径模式,包括显式ALUA(Explicit ALUA或EALUA)和隐式ALUA(Implicit ALUA或IALUA)两种模式。

 隐式ALUA支持查询LUN的端口组不对称访问状态;正常情况下,主机查询LUN的端口组信息,识别控制器的优先级,从优先级最高(Active/Optimized)的控制器下发业务,当Active/Optimized链路故障后,主机选择其他的链路下(Active/Unoptimized)发业务。

 显式ALUA支持查询和设置LUN的端口组不对称访问状态,当Active/Optimized链路断开后,主机设置其他控制器的优先级为最优;主机从新的最优的控制器下发业务(通过LUN TresPass实现优选控制器切换)。在阅读本文档前,需要知道以下多路径概念。

 Active/Active(A/A): 所有路径上的IO具有相同的性能;同时也用来表示阵列架构。

 Active/Active-Asymmetric(A/A-A): 所有路径都可以响应IO,但路径之间存在性能差异;ALUA就是用来表征这种性能差异的SCSI协议标准,同时也用来表示阵列架构。

 Active/Passive(A/P):只有主路径可以响应IO,备路上不能响应IO;同时也用来表示阵列架构。

 Path Failover: 主机多路径软件将IO路径从主路径切换到备用路径上。基本所有多路径软件都支持该项功能。

 LUN Failover: LUN的工作控制器从归属控制器切换到非归属控制器(LUN Trespass)。支持显式ALUA的多路径软件可以发起LUN Failover。

 Path Failback: 主机多路径软件将IO路径从备用路径切换回主路径上。

ALUA技术支持现状

 下表列出主流OS原生多路径对ALUA支持的情况,其中详细描述了隐式ALUA(EALUA)和显示ALUA(IALUA)的支持情况。

Solaris

 Solaris 9/10的原生多路径软件STMS支持隐式ALUA方式,其中Solaris 9需要安装StorEdge SAN Foundation支持ALUA;Solaris 10在Update3以后版本支持ALUA。Solaris主机通过ALUA方式连接阵列后,在相应配置文件中添加产品信息后,STMS会认为目标器阵列为A/A-A模式,则只会对Active/Optimized路径下发IO,当Active/Optimized路径不可访问时,会通过A/N路径下发IO。

HP UX

 HP UX 11版本的原生多路径NMP支持显式ALUA。HP UX主机通过ALUA方式连接阵列时,不需要做任何特殊设置,NMP在标准查询页中发现TPGS支持后,会下发RTPG命令获取路径信息,生成虚拟设备。HP-UX NMP 多路径生成的虚拟设备为持久设备文件,通过scsimgr 命令管理多路径属性,其中可以通过将设备文件的 “alua_enabled” 属性设置多路径的ALUA功能。

 NMP只支持向Active/Optimized路径下发IO,当Active/Optimized路径故障时,NMP会将Active/Unoptimized路径切换为Active/ Optimized来进行LUN Failover 以及 Path Failover。但NMP在不具备LUN Failback功能。所以当故障路径恢复后,需要在CLI模式下手工将工作控制器切换到归属控制器,保证LUN在控制器之间的负载均衡。

VMware ESX

 ESX 4.X以后系统的原生多路径NMP支显式以及隐式ALUA。ESX主机通过ALUA方式连接阵列时,不需要做任何特殊设置,NMP在标准查询页中发现TPGS支持后,会下发RTPG命令获取路径信息。ESX/ESXi在VMkernel层使用可插入存储架构 (PSA)管理存储多路径,PSA采用一个开放式模块框架协调多个多路径插件 (MPP) 的同时操作。

 ESX/ESXi默认情况下提供的 VMkernel 多路径插件是 VMware 本机多路径插件 (NMP)。NMP 是管理子插件的可扩展模块。NMP 子插件有两种类型,即存储阵列类型插件(SATP) 和路径选择插件 (PSP)。SATP和PSP可以是 VMware 提供的内置插件,也可以由第三方提供。ESX原生PSP提供固定模式(FIX)、循环模式(RR)和最近使用(MRU)三种路径选择方式 。

Mac OS X

  Mac OS X通常使用HBA卡自带多路径软件,其中ATTO FC HBA卡是苹果主机上最常用的FC HBA卡(两者结合较为紧密)。ATTO MulitPath Director就是ATTO FC HBA卡提供的多路径驱动,具备IO路径切换和负载均衡功能。ATTO MulitPath Director同时支持IALUA和EALUA。

 主机通过ALUA方式连接阵列时,不需要做任何特殊设置,MulitPath Director在标准查询页中发现TPGS支持后,会下发RTPG命令获取路径信息。MulitPath Director支持SCSI协议定义的四种状态,其中Active/Optimized路径作为优先路径,Active/Unoptimized以及Standby路径作为备选路径,Unavailable状态处理Disable状态。当Active/Optimized路径故障时,Active/ Unoptimized路径会立即被置为Active状态。

ALUA主要功能和能力

 IO路径选择: 在ALUA模式下,主机只会对A/O路径下发IO,即对LUN工作控制器下发IO。只有当A/O路径不存在时,IALUA的主机多路径会对A/N路径下发IO,阵列将IO重定向到LUN工作控制器。

 内部错误处理: 在某些错误场景下,单个LUN在单边控制器不可访问情况,这些内部错误可以转化为ALUA端口组状态,隐藏内部错误的差异,通过统一共用的接口暴露给主机。这样做的好处在于,可确保错误不扩散,提高多路径可靠性。

 路径故障和恢复: 路径故障包括光纤、HBA卡、交换机等故障,如果故障发生在LUN 的A/O路径上,且没有可用A/O路径时, IALUA会通过A/N路径下发IO,EALUA则将A/N路径切换为A/O路径。如果故障发生在A/N路径上,IO行为不受影响。

 故障路径恢复后,对于EALAU方式的连接,需要在CLI模式下确认受影响的LUN的工作控制器和归属控制器是否一致,如果不一致,需要手工将工作控制器切换到归属控制器侧,以确保LUN的负载均衡。

 控制器故障和恢复: 如果控制器发生故障时,阵列内部系统流程会自动将故障端LUN的工作控制器Failover到对端,同时会通过UA状态知会主机路径状态变化。控制器故障恢复后,阵列内部系统流程会自动将受影响的LUN进行Failback。

简单总结: 阵列没有开启或实现ALUA之前,第三方多路径无法知道阵列中LUN的工作控制器在哪边,往往采用随机的方式下发IO,这就造成部分IO需要向归属控制器转发,影响IO性能(第三方多路径可以选择支持和不支持ALUA)。支持或实现ALUA后,通过Active/Optimized状态标识LUN工作控制器,通过对Active /Optimized路径下发IO,这样就可以提升IO性能。

 前面已经介绍过,ALUA是SCSI协议定义的标准多路径接口,这可以使得存储阵列在不提供自研多路径的情况下,通过支持标准ALUA的第三方多路径实现IO优化。