ESXi其实很简单-聊聊ESXi多路径那些事

https://mp.weixin.qq.com/s/7GgHPbX0dkMGww3TkClYvw

今天我们不聊vSAN,来说说传统ESXi架构下关于多路径软件的事情。因为类似的问题最近问到了多次,所以我觉的应该有必要写个东西来记录下。

    这部分内容比较多,我也有些理解不到位的地方,如果有疑问欢迎一起来探讨。

 

这个文章分为几个部分,各位可以选择自己需要的内容:

 

  • 什么是PSA

  • 什么是NMP

  • 什么是SATP

  • 什么是PSP

  • NMP的I/O工作流

  • VMware支持的多路径策略

  • 什么是A/P A/A和ALUA

  • RR+ALUA配合使用

  • 发生路径切换的条件

 

什么是PSA

=====================

   ESXi PSA架构图

    

    ESXi使用PSA(Pluggable Storage Architecture)来管理不同的多路径插件(MMP:multiple multipathing plug-ins)。PSA是一个开放的架构,因此第三方厂商可以开发不同的多路径管理软件(例如PowerPath)并且加入到这个框架里。作为ESXi的使用者,既可以使用第三方的的多路径软件,也可以使用VMware提供的多路径软件。

 

什么是NMP

 

=====================

    ESXi自带的MMP叫做NMP(Native Multipathing Plug-In)。NMP本身是一个管理子插件的可扩展模块,用来协调和使用主机连接的存储设备以及不同的物理路径。

 

NMP管理的子插件包括两个类型:

  • SATP:Storage Array Type Plug-Ins

  • PSP:Path Selection Plug-Ins

注意:SATP和PSP既可以是VMware提供的,也可以是第三方提供的。

 

什么是SATP

=====================

SATP is used to manage the paths for a specific array type   

  • NMP决定对于存储使用哪种类型的SATP,并且使用SATP来管理该存储设备的物理路径。

  • NMP确保每一个存储设备都分配一个指定或者默认的SATP。

  • 每个SATP包含了对应存储的一系列特性,使得SATP可以对这个存储直接执行一些操作。

  • NMP可以同时管理和使用多个SATP。

 

SATP的工作包括:

 

  • 检测物理链路状态

  • 汇报物理链路状态的变更

  • 执行存储故障切换时的必要操作,例如A/P存储(主备模式)发生故障时激活standby的路径。

 

VMware包括的默认SATP有:

  • VMW_SATP_LOCAL

  • VMW_SATP_DEFAULT_AA

  • VMW_SATP_DEFAULT_AP

  • VMW_SATP_ALUA

 

什么是PSP

=====================

PSP is used to choose which path should be used for each storage device.

 

PSP的工作包括:

  • PSP来负责选择可用的物理链路来进行数据的传输

  • NMP根据SATP分配这个存储设备一个PSP。

     

执行下面命令列出主机上可用的SATP以及对应的默认PSP

esxcli storage nmp satp list

 

ESXi自带的PSP包括:

  • VMW_PSP_MRU

  • VMW_PSP_FIXED

  • VMW_PSP_RR

 

下面是一个LUN的NMP命令输出:

localcli_storage-nmp-device-list 命令输出

 

NMP的I/O工作流

=====================

  1. NMP调用分配给这个存储设备的PSP

  2. PSP按照所选的多路径策略选择合适的路径。

  3. NMP通过PSP所选的路径发起IO请求。

  4. 如果IO执行完毕,则NMP标示为完成状态

  5. 如果IO没有执行成功,NMP会调用之前分配给存储设备的SATP

  6. SATP解读IO返回的报错,如果需要的话,激活其他的路径。

  7. PSP重新从活动的路径中选择合适的路径传输IO。

 

简单来说:

  • SATP负责确定哪些I/O路径可供使用。

  • SATP负责监视更改和处理故障转移。

  • SATP用于确定哪些路径可用,

  • PSP选择要使用的可用路径。

 

ESXi支持的多路径策略

=========================

  1. Fixed Path(FIXED)

  2. Most Recently Used (MRU)

  3. Round Robin (RR)

 

Fixed Path:

=========================

    主机使用指定的活动路径(Preferred path)或者在启动的时候选择第一条可以工作的活动路径来发送IO指令。当指定的活动路径发生故障时,ESXi主机会切换到另外的可用路径。如果此时原来的活动路径恢复的话,ESXi 会切换回原来的路径。

注意:If the host uses a default preferred path and the path's status turns to Dead, a new path is selected as preferred. However, if you explicitly designate the preferred path, it will remain preferred even when it becomes inaccessible.

使用Fixed策略的场景

    主机默认使用右侧的交换机连接到存储的右侧控制器(左图),当这个控制器发生问题时,主机会切换到另外的路径(控制器)(中间图)。当控制器恢复正常后,主机会切换回原来的路径(右图)

 

Most Recently Used

=========================

    MRU里没有(Preferred path)的设置。MRU和Fixed区别就是当故障恢复后,ESXi不会切换回原来的路径,而是继续使用当前的路径。

使用MRU策略的场景:

    主机默认使用右侧的交换机连接到存储的右侧控制器(左图),当这个控制器发生问题时,主机会切换到另外的路径(控制器)(中间图)。当控制器恢复正常后,主机不会切换回原来的路径,继续使用当前正在使用的路径(右图)

 

Round Robin

=========================

    当前RR已经是许多存储的默认存储策略。

    RR方式是根据算法自动把IO分布在所有的可用路径(A/P存储)或者所有路径(A/A存储)上。当一个路径上的达到指定的传输量后,切换到另外一条路径。主要包括:

  • IOPS限制:默认。到达1000个IOPS后切换到另外的路径

  • Bytes限制:指定达到多少Bytes传输量后切换到另外的路径。

这两个限制都可以手工修改,具体参考KB:

Adjusting Round Robin IOPS limit from default 1000 to 1 (2069356)

使用RR策略的场景:

    还是上面的案例,主机到存储LUN有多条路径,RR轮循使用不同的路径达到负载均衡的效果。

 

什么是A/A、A/P 和ALUA

=========================

在上文说SATP时候,我们说到VMware自带的SATP包括下面四种:

  • VMW_SATP_LOCAL

  • VMW_SATP_DEFAULT_AA

  • VMW_SATP_DEFAULT_AP

  • VMW_SATP_ALUA

其中

AA表示Active-Active存储

AP表示Active-Passtive存储

上面两个都很好理解,那么ALUA表示什么呢?(Asymmetric Logical Unit Access)

    使用ALUA,主机可以同时通过多个控制器访问同一个LUN。例如一个存储有两个控制器(A和B)两个控制器对外都是Active的状态,但是一个LUN的owner只有一个控制器(例如控制器A),因此如果用户通过控制器A的话,可以直接访问到LUN;通过控制器B的话,则在存储内部进行传输,最终还是通过控制器A访问到LUN。那么直接通过控制器A访问的路径就叫做“优化路径”,通过控制器B上访问的路径就叫做“非优化路径”,这种模式就叫做非对称逻辑单元访问(ALUA)

 

在上面的示例中,LUN的Ower是左侧的控制器

结合示意图我们再说明下,在左图中,我们可以看到存储路径没有被优化:我们找到了一条通往LUN的完全可接受的路径,但当我们到达那里时,发现左侧存储控制器目前拥有这个LUN。此时,虽然右侧存储控制器仍然可以访问LUN,但必须经过左侧存储控制器过程,因此这条路径没有进行优化。ALUA确保尽可使用最优化的路径。

 

RR+ALUA

=========================

    下面的图展示了RR和ALUA搭配使用的场景:

    左侧的存储控制器是LUN的Owner,我们有两条优化路径可以达到这个控制器,因此RR会轮循使用这两个路径来访问LUN。

 

什么时候会进行路径切换?

=========================

    经常有人会问我为什么发生问题时候主机没有进行路径切换?借着今天的机会我也说明下吧。简单来说,ESXi主机只有在收到特定的SCSI Code时才会进行路径切换。

    我们都知道在主机发送IO指令到存储后,如果发生异常的话,HBA,存储等设备会返回特定的SCSI Code。例如:

2017-07-20T22:28:58.155Z cpu1:33548)ScsiDeviceIO: 2652: Cmd(0x43b72ec112c0) 0x28, CmdSN 0x388202 from world 0 to dev "naa.5000039698194c41" failed H:0x0 D:0x2 P:0x0 Valid sense data: 0x3 0x11 0x1.

    根据SCSI Code,我们可以查询到故障的原因是什么。有大神开发了工具可以方便快速的decode:

http://www.virten.net/vmware/esxi-scsi-sense-code-decoder/

 

    需要说明的是SCSI Code是一个国际行业的标准,并不是VMware自己的标准。具体信息可以参考下面的网站:

http://www.t10.org/lists/1spc-lst.htm

 

    回到路径切换的话题上,ESXi只有在收到特定的SCSI Code时才会进行路径切换。例如:

  • H:0x1 D:0x0 P:0x0 Valid sense data: 0x0 0x0 0x0  DID_NO_CONNECT

  • H:0x0 D:0x2 P:0x0 Valid sense data: 0x3 0x4 0x3 - MEDIUM ERROR - LOGICAL UNIT NOT READY

    因此如果发生问题时候没有发生路径切换,则需要检查发生问题时返回的SCSI Code是什么。

 

具体参考这两篇KB:

SCSI events that can trigger ESX server to fail a LUN over to another path (1003433)

Understanding SCSI host-side NMP errors/conditions in ESX/ESXi 4.x, ESXi 5.x, and 6.x (1029039)

 

以上是这次的更新,欢迎大家一起讨论。

 

参考文档:

https://docs.vmware.com/en/VMware-vSphere/6.5/com.vmware.vsphere.storage.doc/GUID-9DED1F73-7375-4957-BF69-41B56C3E5224.html

https://deinoscloud.wordpress.com/2011/02/28/vmware-psa-mpp-nmp-psp-mru-and-tutti-quanti/

https://www.vmadmin.co.uk/resources/35-esxserver/364-managing-nmp-changing-the-default-psp-for-a-satp-change-from-fixed-to-round-robin

https://theithollow.com/2012/03/08/path-selection-policy-with-alua/

https://blog.fosketts.net/2011/06/06/vmware-esx-vsphere-satp-psp-support-matrix/

https://kb.vmware.com/s/article/2069356

https://www.virten.net/vmware/vmware-esxi-scsi-sense-code-decoder-v2/

https://blogs.vmware.com/vsphere/2012/02/configuration-settings-for-alua-devices.html

http://www.yellow-bricks.com/2009/09/29/whats-that-alua-exactly/

https://virtualgeek.typepad.com/virtual_geek/2009/09/a-couple-important-alua-and-srm-notes.html