启用会话亲和性后,负载均衡器会将特定最终用户的所有请求定向到特定 endpoint。这种连续性保留了用户会话信息(例如购物车中的商品),否则如果请求分散到多台服务器,这些信息可能会丢失。
会话亲和性还有助于减少网络请求,为按用量计费的用户节省成本。
会话亲和性指定负载均衡器应使用的会话亲和性类型,除非指定为 "none" 或 ""(默认)。
在首次请求已代理的负载均衡器时,会生成一个 cookie,编码请求将转发到哪个端点的信息。同一客户端对同一负载均衡器的后续请求,在 cookie 有效期内且端点保持健康时,将发送到 cookie 编码的端点。如果 cookie 已过期或端点不健康,将计算并使用新端点。
会话亲和性会自动将来自同一客户端的请求定向到同一 endpoint:
- 当客户端发出第一个请求时,Cloudflare 会在客户端上设置
__cflbcookie(以跟踪关联的 endpoint)。 - 同一客户端的后续请求在 cookie 有效期内且 endpoint 保持健康时,会转发到该 endpoint。
- 如果 cookie 过期或 endpoint 变为不健康,Cloudflare 会设置新的 cookie 以跟踪新的故障转移 endpoint。
flowchart LR
accTitle: Session affinity process
accDescr: Session affinity directs requests from the same client to the same server.
A[Client] --Request--> B{<code>__cflb</code> cookie set?}
B -->|Yes| C[Route to previous endpoint]
C --> O2
B ---->|No| E[Follow normal routing]
E --> O2
E --Set <code>__cflb</code> cookie--> A
subgraph P1 [Pool 1]
O1[Endpoint 1]
O2[Endpoint 2]
end
除非您设置自定义会话生存时间(TTL),否则所有基于 cookie 的会话默认为 23 小时。
启用 Always Use HTTPS 时,会话 cookie 为安全 cookie。此外,cookie 始终启用 HttpOnly,以防止跨站脚本攻击。
此行为与 cookie 类似,但初始端点选择稳定且基于客户端 IP 地址。
在首次请求已代理的负载均衡器时,会基于配置的 HTTP 标头生成会话密钥。会话密钥编码用于存储负载均衡器会话状态期间请求将转发到哪个端点的请求标头。具有相同标头的后续负载均衡器请求将在会话持续期间且端点保持健康时发送到同一端点。如果会话在会话亲和性 TTL 秒内处于空闲状态或端点不健康,将计算并使用新端点。
默认情况下,您为通过 HTTP 标头的会话亲和性配置的 HTTP 标头中至少有一个必须存在于发送到负载均衡器的请求上,才能创建基于标头的会话。如果客户端在其请求中添加或移除 HTTP 标头且已建立会话,只要后续请求中存在您配置中指定的 HTTP 标头,就会基于新 HTTP 标头创建新会话。
如果您希望要求所有配置的 HTTP 标头都存在于请求上才能创建会话,请通过 Cloudflare API 将 session_affinity_attributes.require_all_headers 设置为 true,或在编辑负载均衡器时在 Cloudflare 仪表板中将 Require all headers(要求所有标头) 切换为 enabled。
在创建或编辑负载均衡器的 Hostname(主机名) 步骤中启用会话亲和性。
如果启用会话亲和性,请选择以下选项之一:
- By Cloudflare cookie only(仅通过 Cloudflare cookie):设置
__cflbcookie 以跟踪关联端点。 - By Cloudflare cookie and Client IP fallback(通过 Cloudflare cookie 和客户端 IP 回退):设置
__cflbcookie,但在未提供会话亲和性 cookie 时也使用客户端 IP 地址。 - By HTTP header(通过 HTTP 标头)。
会话亲和性是负载均衡器的属性,您可以使用以下端点设置:
使用 session_affinity、session_affinity_ttl 和 session_affinity_attributes 参数自定义会话亲和性行为。
要启用通过 HTTP 标头的会话亲和性,将 session_affinity 值设置为 header,并将 HTTP 标头名称添加到 session_affinity_attributes.headers。
有关上下文中的 API 命令详情,请参阅使用 API 创建负载均衡器。
使用端点排空在不影响任何活跃客户的情况下排空或移除端点的所有流量。有关端点排空的更多详情,请参阅执行计划内维护。
零停机故障转移在瞬时网络问题期间自动将流量发送到池内的端点。这有助于在活动健康监视器之间的间隔发生问题时减少向用户显示的错误。
您可以启用以下三个选项之一:
- None(无):不会发生故障转移,用户可能会看到错误。
- Temporary(临时):流量将发送到其他端点,直到原本固定的端点可用。
- Sticky(粘性):更新会话亲和性 cookie,后续请求根据需要转发到新端点。