可以使用 NSX CLI 获取详细的跟踪日志,捕获数据包以及查看衡量指标以排除负载平衡器故障。

问题

负载平衡未正常工作。

解决方案

  1. 启用或确认您可以通过 SSH 访问虚拟设备。Edge 服务网关是一个虚拟设备,它可以在部署时选择启用 SSH。如果您需要启用 SSH,请选择所需的设备,然后在操作 (Actions)菜单中单击更改 CLI 凭据 (Change CLI Credentials)
  2. Edge 服务网关具有多个 show 命令以查看运行时状态和配置状态。请使用这些命令显示配置和统计信息。
    nsxedge> show configuration loadbalancer 
    nsxedge> show configuration loadbalancer virtual [virtual-server-name] 
    nsxedge> show configuration loadbalancer pool [pool-name] 
    nsxedge> show configuration loadbalancer monitor [monitor-name] 
    nsxedge> show configuration loadbalancer profile [profile-name] 
    nsxedge> show configuration loadbalancer rule [rule-name]
  3. 要使负载平衡和 NAT 正常工作,应启用防火墙。请使用 #show firewall 命令。如果使用该命令没有看到任何有意义的输出,请参阅使用 UI 验证负载平衡器配置和排除故障部分。
  4. 负载平衡器需要使用 NAT 才能正常工作。请使用 show nat 命令。如果使用该命令没有看到任何有意义的输出,请参阅使用 UI 验证负载平衡器配置和排除故障部分。
  5. 除了启用的防火墙以及具有 NAT 规则的负载平衡器以外,您还应该确保启用负载平衡进程。请使用 show service loadbalancer 命令检查负载平衡器引擎状态 (L4/L7)。
    nsxedge> show service loadbalancer
    haIndex:              0
    -----------------------------------------------------------------------
    Loadbalancer Services Status:
    
    L7 Loadbalancer     : running
    -----------------------------------------------------------------------
    L7 Loadbalancer Statistics:
    STATUS     PID        MAX_MEM_MB MAX_SOCK   MAX_CONN   MAX_PIPE   CUR_CONN   CONN_RATE  CONN_RATE_LIMIT MAX_CONN_RATE
    running    1580       0          2081       1024       0          0          0          0               0
    -----------------------------------------------------------------------
    L4 Loadbalancer Statistics:
    MAX_CONN   ACT_CONN   INACT_CONN TOTAL_CONN
    0          0          0          0
    
    Prot LocalAddress:Port Scheduler Flags
      -> RemoteAddress:Port           Forward Weight ActiveConn InActConn
    
    1. 使用 show service loadbalancer session 命令查看负载平衡器会话表。如果在系统上具有流量,则会看到会话。
      nsxedge> show service loadbalancer session
      -----------------------------------------------------------------------
      L7 Loadbalancer Statistics:
      STATUS     PID        MAX_MEM_MB MAX_SOCK   MAX_CONN   MAX_PIPE   CUR_CONN   CONN_RATE  CONN_RATE_LIMIT MAX_CONN_RATE
      running    1580       0          2081       1024       0          0          0          0               0
      
      -----------------L7 Loadbalancer Current Sessions:
      
      0x2192df1f300: proto=unix_stream src=unix:1 fe=GLOBAL be=<NONE> srv=<none> ts=09 age=0s calls=2 rq[f=c08200h,
      i=0,an=00h,rx=20s,wx=,ax=] rp[f=008000h,i=0,an=00h,rx=,wx=,ax=] s0=[7,8h,fd=1,ex=] s1=[7,0h,fd=-1,ex=] exp=19s
      
      
      -----------------------------------------------------------------------
      L4 Loadbalancer Statistics:
      MAX_CONN   ACT_CONN   INACT_CONN TOTAL_CONN
      0          0          0          0
      
      L4 Loadbalancer Current Sessions:
      
      pro expire state       source       virtual    destination
      
    2. 检查 show service loadbalancer 命令以查看负载平衡器第 7 层粘性表状态。请注意,该表不显示有关加速的虚拟服务器的信息。
      nsxedge> show service loadbalancer table
      -----------------------------------------------------------------------
      L7 Loadbalancer Sticky Table Status:
      
      TABLE    TYPE    SIZE(BYTE)   USED(BYTE)
      
      
  6. 如果所需的所有服务正常运行,请查看路由表并需要具有到客户端和服务器的路由。请使用 show ip routeshow ip forwarding 命令以将路由映射到接口。
  7. 确保使用 show arp 命令获取系统(例如,网关或下一跃点)和后端服务器的 ARP 条目。
  8. 这些日志提供了相应的信息以帮助查找流量,这可能有助于诊断问题。请使用 show logshow log follow 命令跟踪日志以帮助查找流量。请注意,您必须运行负载平衡器,启用日志记录 (Logging)并将其设置为信息 (Info)调试 (Debug)
    nsxedge> show log
    2016-04-20T20:15:36+00:00 vShieldEdge kernel: Initializing cgroup subsys cpuset
    2016-04-20T20:15:36+00:00 vShieldEdge kernel: Initializing cgroup subsys cpu
    2016-04-20T20:15:36+00:00 vShieldEdge kernel: Initializing cgroup subsys cpuacct
    ...
    
  9. 在确认基本服务使用正确的客户端路径运行后,让我们查看在应用程序层中发生的情况。请使用 show service loadbalancer pool 命令查看负载平衡器池状态 (L4/L7)。必须启动一个池成员以处理内容,通常需要使用多个池成员,因为请求数量超过单个工作负载的容量。如果运行状况监控是由内置运行状况检查提供的,在运行状况检查失败时,输出将显示 last state change timefailure reason。如果监控服务提供运行状况监控,除了上述两个输出以外,还会显示 last check time
    nsxedge> show service loadbalancer pool
    -----------------------------------------------------------------------
    Loadbalancer Pool Statistics:
    
    POOL Web-Tier-Pool-01
    |  LB METHOD round-robin
    |  LB PROTOCOL L7
    |  Transparent disabled
    |  SESSION (cur, max, total) = (0, 0, 0)
    |  BYTES in = (0), out = (0)
       +->POOL MEMBER: Web-Tier-Pool-01/web-01a, STATUS: UP
       |  |  HEALTH MONITOR = BUILT-IN, default_https_monitor:L7OK
       |  |  |  LAST STATE CHANGE: 2016-05-16 07:02:00
       |  |  SESSION (cur, max, total) = (0, 0, 0)
       |  |  BYTES in = (0), out = (0)
       +->POOL MEMBER: Web-Tier-Pool-01/web-02a, STATUS: UP
       |  |  HEALTH MONITOR = BUILT-IN, default_https_monitor:L7OK
       |  |  |  LAST STATE CHANGE: 2016-05-16 07:02:01
       |  |  SESSION (cur, max, total) = (0, 0, 0)
       |  |  BYTES in = (0), out = (0)
    
    
  10. 检查服务监控器状态(“正常”、“警告”、“严重”)以查看所有配置的后端服务器的运行状况。
    nsxedge> show service loadbalancer monitor
    -----------------------------------------------------------------------
    Loadbalancer Health Check Statistics:
    
    MONITOR PROVIDER   POOL               MEMBER     HEALTH STATUS
    built-in           Web-Tier-Pool-01   web-01a    default_https_monitor:L7OK
    built-in           Web-Tier-Pool-01   web-02a    default_https_monitor:L7OK
    
    对于 show service load balancer monitor 命令,将在 CLI 输出中显示三种类型的运行状况监控值:
    • 内置:已启用运行状况检查并且由 L7 引擎(HA 代理)执行。
    • 监控服务:已启用运行状况检查并由监控服务引擎 (NAGIOS) 执行。可以使用 show service monitorshow service monitor service CLI 命令检查监控服务运行状态。状态 (Status)字段应该为正常警告严重
    • 未定义:已禁用运行状况检查。
    输出的最后一列是池成员的运行状况。将显示以下状态:
    表 1. 运行状况和说明
    运行状况 说明
    内置
    • UNK:未知
    • INI:正在初始化
    • SOCKERR:套接字错误
    • L4OK:已在第 4 层上通过检查,未启用上面的层测试
    • L4TOUT:第 1-4 层超时
    • L4CON:第 1-4 层连接问题。例如,“Connection refused”(tcp rst) 或“No route to host”(icmp)
    • L6OK:已在第 6 层上通过检查
    • L6TOUT:第 6 层 (SSL) 超时
    • L6RSP:第 6 层响应无效 - 协议错误。原因可能是:
      • 后端服务器仅支持“SSLv3”或“TLSv1.0”,
      • 后端服务器的证书无效,或者
      • 密码协商失败,等等
    • L7OK:已在第 7 层上通过检查
    • L7OKC:已在第 7 层上有条件地通过检查。例如,404 with disable-on-404
    • L7TOUT:第 7 层 (HTTP/SMTP) 超时
    • L7RSP:第 7 层响应无效 - 协议错误。
    • L7STS:第 7 层响应错误。例如,HTTP 5xx
    严重
    • 您的 SSL 库不支持 SSL 协议版本 2
    • 不支持的 SSL 协议版本
    • 无法创建 SSL 上下文
    • 无法建立 SSL 连接
    • 无法启动 SSL 握手
    • 无法检索服务器证书
    • 无法检索证书使用者
    • 证书中的时间格式不正确
    • 证书“<cn>”在 <expire time of certificate> 时过期
    • 证书“<cn>”在今天的 <expire time of certificate> 时过期
    警告/严重

    证书“<cn>”在 <days_left/expire time of certificate> 天后过期

    ICMP
    • 无法访问网络
    • 无法访问主机
    • 无法访问协议
    • 无法访问端口
    • 源路由失败
    • 已隔离源主机
    • 未知的网络
    • 未知的主机
    • 网络被拒绝
    • 主机被拒绝
    • 网络的服务类型 (ToS) 不正确
    • 主机的服务类型 (ToS) 不正确
    • 已按筛选器禁止
    • 主机优先级冲突
    • 优先级临界值。该操作所需的最低优先级
    • 无效的代码
    UDP/TCP
    • 套接字创建失败
    • 连接到地址 xxxx 和端口 xxx:[请参阅 Linux 错误代码]
    • 未从主机收到数据
    • 从主机/套接字收到意外响应
    HTTP/HTTPS
    • HTTP UNKNOWN:内存分配错误
    • HTTP CRITICAL:无法打开 TCP 套接字(创建套接字或连接到服务器失败)
    • HTTP CRITICAL:在接收数据时出错
    • HTTP CRITICAL:未从主机收到数据
    • HTTP CRITICAL:从主机收到的 HTTP 响应无效:<status line>(不正确的预期状态行格式)
    • HTTP CRITICAL:无效的状态行 <status line>(状态代码不是 3 个数字:XXX)
    • HTTP CRITICAL:无效的状态 <status line>(状态代码 >= 600 或 < 100)
    • HTTP CRITICAL:找不到字符串
    • HTTP CRITICAL:找不到模式
    • HTTP WARNING:页面大小 <page_length> 太大
    • HTTP WARNING:页面大小 <page_length> 太小
  11. 如果错误代码为 L4TOUT/L4CON,这通常是底层网络上的连接问题。Duplicate IP 通常是此类问题的根本原因。在出现该错误时,请按以下方式进行故障排除:
    1. 在两个 Edge 上使用 show service highavailability 命令启用高可用性 (High Availability, HA) 时,检查这些 Edge 的 HA 状态。检查 HA 链路是否为 DOWN 并且所有 Edge 为 Active,因此,在网络上没有重复的 Edge IP。
    2. 通过 show arp 命令检查 Edge ARP 表,并验证后端服务器的 ARP 条目是否在两个 MAC 地址之间变化。
    3. 检查后端服务器 ARP 表,或者使用 arp-ping 命令并检查任何其他计算机是否具有与 Edge IP 类似的相同 IP。
  12. 检查负载平衡器对象统计信息(VIP、池、成员)。查看特定的池并确认成员已启动并正在运行。检查是否启用了透明模式。如果启用,Edge 服务网关应该是客户端和服务器之间的串联式网关。验证服务器是否显示会话计数器增加值。
    nsxedge> show service loadbalancer pool Web-Tier-VIP-01
    TIMESTAMP            	SESSIONS   	BYTESIN    	BYTESOUT   	SESSIONRATE	HTTPREQS
    2016-04-27 19:56:40  	00         	00         	00         	00         	00
    2016-04-27 19:55:00  	00         	32         	100        	00         	00
    
    nsxedge> show service loadbalancer pool Web-Tier-VIP-01 | MEMBER
    +—> POOL MEMBER: TENANT-1-TCP-POOL-80/SERVER-1, STATUS:  UP
    +—> POOL MEMBER: TENANT-1-TCP-POOL-80/SERVER-2, STATUS:  UP
  13. 现在,查看虚拟服务器,验证是否具有默认池并查看该池是否还绑定到该服务器。如果通过应用程序规则使用池,您需要查看 #show service loadbalancer pool 命令中显示的特定池。指定虚拟服务器的名称。
    nsxedge> show service loadbalancer virtual Web-Tier-VIP-01
    
    -----------------------------------------------------------------------
    Loadbalancer VirtualServer Statistics:
    
    VIRTUAL Web-Tier-VIP-01
    |  ADDRESS [172.16.10.10]:443
    |  SESSION (cur, max, total) = (0, 0, 0)
    |  RATE (cur, max, limit) = (0, 0, 0)
    |  BYTES in = (0), out = (0)
       +->POOL Web-Tier-Pool-01
       |  LB METHOD round-robin
       |  LB PROTOCOL L7
       |  Transparent disabled
       |  SESSION (cur, max, total) = (0, 0, 0)
       |  BYTES in = (0), out = (0)
          +->POOL MEMBER: Web-Tier-Pool-01/web-01a, STATUS: UP
          |  |  HEALTH MONITOR = BUILT-IN, default_https_monitor:L7OK
          |  |  |  LAST STATE CHANGE: 2016-05-16 07:02:00
          |  |  SESSION (cur, max, total) = (0, 0, 0)
          |  |  BYTES in = (0), out = (0)
          +->POOL MEMBER: Web-Tier-Pool-01/web-02a, STATUS: UP
          |  |  HEALTH MONITOR = BUILT-IN, default_https_monitor:L7OK
          |  |  |  LAST STATE CHANGE: 2016-05-16 07:02:01
          |  |  SESSION (cur, max, total) = (0, 0, 0)
          |  |  BYTES in = (0), out = (0)
    
    
  14. 如果正确配置了所有内容,但仍出现错误,您应该捕获流量以了解发生的情况。共有两个连接:客户端到虚拟服务器以及 Edge 服务网关到后端池(在池级别具有或没有透明配置)。#show ip forwarding 命令列出了 vNic 接口,并且您可以使用该数据。
    例如,假设客户端计算机位于 vNic_0 上,而服务器位于 vNic_1 上。您使用在端口 80 上运行的客户端 IP 地址 192.168.1.2 和 VIP IP 192.168.2.2。负载平衡器接口 IP 为 192.168.3.1,后端服务器 IP 为 192.168.3.3。共有两个不同的数据包捕获命令:一个命令显示数据包,另一个命令将数据包捕获到一个可下载的文件中。请捕获数据包以检测负载平衡器异常故障。您可以捕获来自两个方向的数据包:
    • 捕获来自客户端的数据包。
    • 捕获发送到后端服务器的数据包。
    #debug packet capture interface interface-name [filter using _ for space]- creates a packet capture file that you can download
    #debug packet display interface interface-name [filter using _ for space]- outputs packet data to the console
    #debug show files - to see a list of packet capture
    #debug copy scp user@url:path file-name/all - to download the packet capture
    
    例如:
    • 在 vNIC_0 上捕获:debug packet display interface vNic_0
    • 在所有接口上捕获:debug packet display interface any
    • 使用筛选器在 vNIC_0 上捕获:debug packet display interface vNic_0 host_192.168.11.3_and_host_192.168.11.41
    • 捕获客户端到虚拟服务器流量的数据包:#debug packet display|capture interface vNic_0 host_192.168.1.2_and_host_192.168.2.2_and_port_80
    • 在 Edge 服务网关和池处于透明模式的服务器之间捕获数据包:#debug packet display|capture interface vNic_1 host 192.168.1.2_and_host_192.168.3.3_and_port_80
    • 在 Edge 服务网关和池未处于透明模式的服务器之间捕获数据包:#debug packet display|capture interface vNic_1 host 192.168.3.1_and_host_192.168.3.3_and_port_80