什么是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优化。
 ————————————————

转自:https://blog.csdn.net/BtB5e6Nsu1g511Eg5XEg/article/details/78360619

[剖析] 多路径ALUA技术如何优化I/O处理的更多相关文章

  1. 剖析CPU温度监控技术

    转载 :剖析CPU温度监控技术   标签: CPU 温度控制技术 1805 具体温度检测调整代码(转载)        迄今为止还没有一种cpu散热系统能保证永不失效.失去了散热系统保护伞的“芯”,往 ...

  2. 剖析MFC六大关键技术(五六)--消息映射与命令传递

    说到消息,在MFC中,“最熟悉的神秘”可算是消息映射,那是我们刚开始接触MFC时就要面对的东西.有过SDK编程经验的朋友转到MFC编程的时候,一下子觉得什么都变了样.特别是窗口消息及对消息的处理跟以前 ...

  3. [转载]《Delphi 版 everything、光速搜索代码》 关于获取文件全路径 GetFullFileName 函数的优化

    Delphi 版 everything.光速搜索代码>,文章中关于获取文件全路径的函数:GetFullFileName,有一个地方值得优化. 就是有多个文件,它们可能属于同一个目录. 譬如 Sy ...

  4. 关于并查集的路径压缩(Path Compress)优化

    之前在CSDN看到一篇很受欢迎的讲解并查集的博文,其中自然用到了路径压缩: int pre[1000]; int find(int x){ int root = x; while(pre[root]! ...

  5. HDU - 1160 FatMouse's Speed 动态规划LIS,路径还原与nlogn优化

    HDU - 1160 给一些老鼠的体重和速度 要求对老鼠进行重排列,并找出一个最长的子序列,体重严格递增,速度严格递减 并输出一种方案 原题等于定义一个偏序关系 $(a,b)<(c.d)$ 当且 ...

  6. 剖析CPU温度监控技术【转】

    转自:http://blog.csdn.net/hunanchenxingyu/article/details/46476545 迄今为止还没有一种cpu散热系统能保证永不失效.失去了散热系统保护伞的 ...

  7. 47、Spark SQL核心源码深度剖析(DataFrame lazy特性、Optimizer优化策略等)

    一.源码分析 1. ###入口org.apache.spark.sql/SQLContext.scala sql()方法: /** * 使用Spark执行一条SQL查询语句,将结果作为DataFram ...

  8. 【MySQL】剖析MySQL读写分离技术

    主从技术的一个基本流程图: 如何实现主从复制的呢: MySQL  Master(主节点) 1>当一个请求来时,首先由[mysqld]写入到我们的主[data]中 2>然后[mysqld]将 ...

  9. CPU、内存、IO虚拟化关键技术及其优化探索

    https://yq.aliyun.com/articles/71295?spm=5176.8091938.0.0.3LQ7NM

随机推荐

  1. AVR单片机教程——开发环境配置

    今天去交大密院参观了设计展,无外乎两个主题:Arduino.Python. 关于Python,我印象最深的是一位Python程序员的话:你要硬核的话,可以去那边看Java. 拜托,都9102年了,Ja ...

  2. 虚拟机VMware中安装Ubuntu18.04

    准备工作 Ubuntu 获取地址: 官网 清华镜像站 VMware 获取地址链接 安装过程 Vmware的安装过程此处不在赘述,不清楚如何安装的请自行百度,参见VMware14安装教程 然后就是Vmw ...

  3. dotnet Core 图片验证码

    9102年了,.NET Core 2.x已经稳定,但是还是有很多人搞不定.NET Core的图片验证码. 下面说重点 1.引用Nuget包:System.Drawing.Common 2.像NET F ...

  4. PB笔记之窗口之间传递多参数的方法

    messageboxex("警告","确定要把删除房间["+ls_id+"]吗?",question!,yesno!)<>1 t ...

  5. Docker 方式部署的应用的版本更新

    前言 公司使用 Docker-Compose 的方式部署 Jenkins/Gitlab/Sonar/Confluence/Apollo/Harbor/ELK/MySQL 等一系列开发工具/数据库. 而 ...

  6. react组件懒加载

    组件懒加载方式-:react新增的lazy const Alert = lazy(() => import('./components/alert')); export default func ...

  7. MySQL 体系结构及存储引擎

    MySQL 原理篇 MySQL 索引机制 MySQL 体系结构及存储引擎 MySQL 语句执行过程详解 MySQL 执行计划详解 MySQL InnoDB 缓冲池 MySQL InnoDB 事务 My ...

  8. R_数据操作_高级_04

    数学函数: abs(x) 绝对值     sqrt(x) 平方根   ceiling(x) 放回不小于x的最小整数 floor(x) 不小于x的最大整数   trunc(x) 先0方向截取x的整数部分 ...

  9. 后端参数校验器v1.0(调用一个方法校验所有参数并得到校验结果,且包括错误原因)

    一:介绍 在写后端时,面对多个参数,比如手机号码.密码等我们常常需要写验证逻辑,当需要验证的参数较多的时候我们会需要写很多的判断语句,这就造成了大量的代码冗余.因此我开发了一套参数验证器,只需要调用参 ...

  10. js数组转对象

    var obj = {}; var arr = [1,2,3,4,5]; for (var x in arr){ obj[x] = x; } 2.ES6的Object.assign: Object.a ...