Envoy 上游集群连接池

连接池

对于 HTTP 流量,Envoy 支持在底层有线协议(HTTP/1.1、HTTP/2、HTTP/3)之上分层的抽象连接池。使用过滤器代码不需要知道底层协议是否支持真正的多路复用。

连接池支持的协议

HTTP/1.1

  • HTTP/1.1 连接池根据需​​要获取到上游主机的连接(直到断路限制)。当连接可用时,请求将绑定到连接,因为连接已完成处理先前的请求,或者因为新连接已准备好接收其第一个请求。HTTP/1.1 连接池不使用流水线,因此如果上游连接被切断,则只需重置单个下游请求。

HTTP/2

  • HTTP/2 连接池通过单个连接多路复用多个请求,达到最大并发流每个连接的最大请求数所施加的限制。HTTP/2 连接池根据需​​要建立尽可能多的连接来服务请求。没有限制,这将只是一个连接。如果收到 GOAWAY 帧或连接达到每个连接的最大请求数限制,连接池将耗尽受影响的连接。一旦连接达到其最大并发流限制,它将被标记为忙碌,直到有可用的流。每当有一个挂起的请求而没有可以分派到的连接时,都会建立新的连接(直到连接的断路器限制)。当 Envoy 作为反向代理运行时,HTTP/2 是首选的通信协议,因为连接很少(如果有的话)被切断。

HTTP/3

  • HTTP/3 连接池通过单个连接多路复用多个请求,达到最大并发流每个连接的最大请求数所施加的限制。HTTP/3 连接池根据需​​要建立尽可能多的连接来服务请求。没有限制,这将只是一个连接。如果收到 GOAWAY 帧或连接达到每个连接的最大请求数限制,连接池将耗尽受影响的连接。一旦连接达到其最大并发流限制,它将被标记为忙碌,直到有可用的流。每当有一个挂起的请求而没有可以分派到的连接时,都会建立新的连接(直到连接的断路器限制)。

自动协议选择

  • 对于充当正向代理的 Envoy,首选配置是 AutoHttpConfig ,通过 http_protocol_options进行配置。默认情况下,它将使用 TCP 和 ALPN 来选择 HTTP/2 和 HTTP/1.1 的最佳可用协议。
  • 如果在 automatic pool 中配置了 HTTP/3,它当前将首先尝试 QUIC 连接,然后 300 毫秒后,如果未建立 QUIC 连接,也会尝试建立 TCP 连接。无论哪个握手成功,都将用于初始流,但如果 TCP 和 QUIC 连接都建立,则最终将首选 QUIC。
  • 如果通过alternate_protocols_cache_options配置了备用协议缓存,则仅会尝试通过HTTP备用服务(最终是HTTPS DNS资源记录或“QUIC提示”(将手动配置)向发布HTTP/3支持的服务器进行HTTP/3连接。如果不存在此类广告,则将使用HTTP/2或HTTP/1。
  • 如果未配置备用协议缓存,则将尝试与所有服务器建立 HTTP/3 连接,即使是那些不发布 HTTP/3 的服务器。
  • 此外,HTTP/3 通过 QUIC(使用 UDP)而不是 TCP(HTTP/1 和 HTTP/2 使用)运行。网络设备阻止 UDP 流量并因此阻止 HTTP/3 的情况并不少见。这意味着上游 HTTP/3 连接尝试可能会被网络阻止,并将回退到使用 HTTP/2 或 HTTP/1。这条路径是 alpha 并且正在迅速改进,目标是让默认行为为互联网环境带来最佳延迟,因此请耐心等待并遵循 Envoy 发布说明,以随时了解最新和最大的变化。

Happy Eyeballs Support

  • Envoy 支持 Happy Eyeballs,RFC6555,用于上游 TCP 连接。此行为现​​在默认启用,但可以通过运行时标志禁用 envoy.reloadable_features.allow_multiple_dns_addresses。对于使用 LOGICAL_DNS的集群,通过将config.cluster.v3.Cluster.DnsLookupFamily 中的 DNS IP 地址解析策略设置为ALL来配置此行为 返回 IPv4 和 IPv6 地址的选项。返回的地址将根据 Happy Eyeballs 规范进行排序,并尝试连接到列表中的第一个。如果此连接成功,它将被使用。如果失败,将尝试列表中的下一个。如果 300 毫秒后连接仍在连接,则将对列表中的下一个地址进行备份连接尝试。
  • 最终尝试将成功连接到其中一个地址,在这种情况下将使用该连接,否则所有尝试都将失败,在这种情况下将报告连接错误。

连接池数量

  • 每个集群中的每台主机都会有一个或多个连接池。如果集群配置了一个显式协议,那么主机可能只有一个连接池。但是,如果集群支持多个上游协议,那么除非它使用 ALPN,否则可以为每个协议分配一个连接池。
  • 每个工作线程为每个集群维护自己的连接池,所以如果一个 Envoy 有两个线程和一个同时支持 HTTP/1 和 HTTP/2 的集群,那么至少会有 4 个连接池。

健康检查交互

  • 如果 Envoy 配置为主动或被动健康检查,则所有连接池连接都将代表从可用状态转换为不可用状态的主机关闭。如果主机重新进入负载平衡轮换,它将创建新的连接,这将最大限度地解决坏流(由于 ECMP 路由或其他原因)。

连接池的常用指标

  • 最大连接数:表示在任何给定时间内, Envoy 与上游集群建立的最大连接数,适用于 HTTP/1.1;

  • 每连接最大请求数:表示在任何给定时间内,上游集群中所有主机可以处理的最大请求数;若设为 1 则会禁止 keepalive 特性;
  • 最大请求重试次数:在指定时间内对目标主机最大重试次数

  • 连接超时时间:TCP 连接超时时间,最小值必须大于 1ms;最大连接数和连接超时时间是对 TCP 和 HTTP 都有效的通用连接设置;
  • 最大等待请求数:待处理请求队列的长度,若该断路器溢出,集群的 upstream_rq_pending_overflow计数器就会递增;

连接池配置格式

---
clusters:
- name: ...
  ...
  connect_timeout: ... # TCP连接的超时时长,即主机网络连接超时,合理的设置可以能够改善因调用服务变慢而导致整个链接变慢的情形;
  max_requests_per_connection: ... # 每个连接可以承载的最大请求数,HTTP/1.1和HTTP/2的连接池均受限于此设置,无设置则无限制,1表示禁用keep-alive
  ...
  • 将max_connections和最max_pending_requests都设置为 1,表示如果超过了一个连接同时发起请求,Envoy就会熔断,从而阻止后续的请求或连接;

参考文档

https://www.envoyproxy.io/docs/envoy/latest/intro/arch_overview/upstream/connection_pooling

posted @ 2022-08-29 21:24  小吉猫  阅读(515)  评论(0编辑  收藏  举报