前置条件
- 你的服务需要有 2 个或更多副本。如果服务只有单个副本,就没有可固定到的副本。
- 该功能在进入 GA 后,Enterprise 默认可用。
- 此功能适用于标准 ClickHouse Cloud 服务。BYOC 暂不支持。
配置副本感知路由
session_id;在滚动发布覆盖到你的 service 之前,X-ClickHouse-Replica-Tag 不会提供粘性路由。无需重启。
基于 HTTP 的路由
- X-ClickHouse-副本-标签(推荐)
- session_id(legacy)
要将工作负载固定到某个副本,请在 HTTPS 接口中发送 对于 clickhouse-go (v2),设置
X-ClickHouse-Replica-Tag 请求头。代理会根据请求头的值进行一致性哈希,因此只要副本数量不变,具有相同请求头值的请求就会被路由到同一副本。不同的值会独立进行哈希,可能会落到相同或不同的副本,但您无法指定某个值映射到哪个副本。使用现有服务的主机名即可,无需使用特殊的粘性主机名或更改 DNS。请求头的值可以是您选择的任意字符串,例如应用程序名称、用户 ID 或工作负载标签。不带该请求头的请求仍会使用常规负载均衡。在每个请求中设置 X-ClickHouse-Replica-Tag 请求头:Protocol: clickhouse.HTTP,并通过 HttpHeaders 连接选项传入请求头。X-ClickHouse-Replica-Tag 无需创建 ClickHouse HTTP 会话即可实现副本亲和性。并发请求可复用同一标签,不会触发 SESSION_IS_LOCKED。写后读一致性
在多副本服务中,在某个副本上写入的数据可能要等复制追赶完成后,其他副本才能看到。发送写入请求时添加X-ClickHouse-Replica-Tag 请求头,然后在后续读取中复用相同的请求头值。代理会将两者路由到同一副本,因此即使其他副本仍未追赶上,您也能读到自己写入的数据。此模式适用于写入后立即读取相同数据的工作负载,例如交互式应用程序,或在继续执行前验证插入操作的 ETL 作业。如需在所有副本之间获得更强的一致性保证,还可以在 ClickHouse Cloud 上将 select_sequential_consistency 设置为 1。检查命中了哪个副本
使用相同的X-ClickHouse-Replica-Tag 值再次运行 SELECT hostName() 示例。只要副本数量不变,您应会获得相同的主机名。不同的请求头值可能会映射到不同的副本。旧版基于子域名的路由
旧版基于子域名的路由工作原理
旧版基于子域名的路由工作原理
此前,启用副本感知路由后,可以在服务主机名下使用通配符子域名。对于主机名为
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 负载均衡,即默认的路由算法。副本感知路由的局限性
副本数量变化时粘性会改变
副本感知路由不是工作负载隔离
Private Link 和旧版子域名方法
*.sticky.* 主机名模式添加 DNS,且如果配置不当,会导致各副本之间的负载分配不均。
副本感知路由要求使用 HTTP 协议
故障排查
- 确认您使用的是适用于您的服务的路由方法:
X-ClickHouse-Replica-Tag请求头或旧版session_idURL 查询参数。 - 确认每个请求使用的路由值完全一致。
- 启用后请稍候片刻,通常不到一分钟即可生效。
- 检查副本数量近期是否发生变化;扩缩容后发生重新映射属于预期行为。使用
SELECT hostName()查找新的映射关系。