session_id 最终会落到哪个副本。
前置条件
- 你的服务需要有 2 个或更多副本。如果服务只有单个副本,就没有可固定到的副本。
- 服务必须处于运行中状态。唤醒空闲服务可能会改变
session_id映射到的副本。 - 该功能在进入 GA 后,Enterprise 默认可用。
- 此功能适用于标准 ClickHouse Cloud 服务。BYOC 暂不支持。
配置副本感知路由
?session_id=。无需重启。
基于 HTTP 的路由 (session_id)
session_id 查询参数。代理会对该值使用一致性哈希来选择副本,因此所有使用相同 session_id 的请求都会被发送到同一台服务器,直到集群拓扑发生变化。
你可以使用现有的服务主机名。无需使用特殊的粘性主机名,也无需更改 DNS。
session_id=my-workload-1 的请求都会落到同一个副本上。不同的 session_id 值会分别进行哈希,可能落到同一个副本,也可能落到不同的副本。这种映射关系是固定的,但你无法选择某个给定值会映射到哪个副本。
session_id 可以是你选择的任意字符串 (应用名称、用户 ID 或工作负载标签) 。没有 session_id 的请求会保持正常的负载均衡。
任何能够添加查询参数的 HTTP 客户端都可以,包括 curl、clickhouse-connect、JDBC/ODBC 等。对于 clickhouse-go (v2) ,请按上文所述使用 HTTP 模式。
检查你访问的是哪个副本
session_id,再次运行上面的 SELECT hostName() 示例。你应该会得到相同的主机名。不同的 session_id 可能会映射到不同的副本。
基于子域名的路由 (已弃用)
已弃用下述基于子域名的机制已弃用,并且在新服务中默认不再启用。这种方式无法很好地扩展 (每个粘性端点都需要单独的 TLS 证书) 。请改用基于 HTTP 的
session_id 方法。如果您已经在使用粘性子域名,请联系支持团队 以启用 session_id 路由。这是一项破坏性变更,需要进行迁移。abcxyz123.us-west-2.aws.clickhouse.cloud 的服务,任何匹配 *.sticky.abcxyz123.us-west-2.aws.clickhouse.cloud 的主机名 (例如 aaa.sticky.abcxyz123.us-west-2.aws.clickhouse.cloud) 都会由 Envoy 通过哈希一致地路由到某个固定副本。原始主机名则继续使用 LEAST_CONNECTION 负载均衡,即默认的路由算法。
副本感知路由的局限性
服务变更期间粘性可能失效
session_id 的请求可能会被路由到不同的 server pod (容器组) 。如果你依赖临时表或会话级设置,请准备在重新映射后重新创建它们。
副本感知路由不是工作负载隔离
Private Link 和已弃用的子域名方法
session_id 路由在常规服务主机名上可与私有网络连接配合使用,无需额外添加 DNS 记录。
但已弃用的子域名方法不支持:你必须为 *.sticky.* 主机名模式添加 DNS,且如果配置不当,会导致各副本之间的负载分配不均。
副本感知路由要求使用 HTTP 协议
session_id 查询参数,而该参数仅存在于 HTTP/HTTPS 接口中。原生二进制协议不携带这类可供代理计算哈希的参数,因此原生协议无法使用副本感知路由。如今,原生协议客户端若要使用此功能,必须将相关工作负载迁移到 HTTP 接口。
故障排查
session_id 的查询仍然被路由到不同的副本
- 确认
session_id是 URL 查询参数 (?session_id=...) ,而不是 HTTP 请求头。 - 启用后请稍等片刻,通常不到一分钟即可生效。
- 检查服务最近是否发生过扩缩容或重启;拓扑变化后出现重新映射属于预期行为。使用
SELECT hostName()查看新的映射关系。