【问题标题】:Java Grpc: invalidate dns cacheJava Grpc:使 dns 缓存无效
【发布时间】:2020-09-22 10:37:14
【问题描述】:

我有一个 grpc 客户端指向一个解析为 2 个 IP 地址的 url。 问题是当一个服务器节点宕机然后又回来时,grpc 客户端没有选择它,所有负载都转到单个节点。

我尝试建议更改 networkaddress.cache.ttl 属性,但没有帮助。 我的代码(在 Scala 中)

java.security.Security.setProperty("networkaddress.cache.ttl", "30")
System.setProperty("networkaddress.cache.ttl", "30")
val channel = NettyChannelBuilder.forAddress(host, port).nameResolverFactory(
      new DnsNameResolverProvider).usePlaintext().build
val client = MyServiceGrpc.newStub(channel)

grpc 版本:1.32.1

【问题讨论】:

    标签: java grpc grpc-java


    【解决方案1】:

    假设 DNS 一直返回两个 IP(可能是 shuffle),那么问题不在于 DNS 缓存。问题是 gRPC 有一个工作连接,因此不会选择重新连接,也不会执行 DNS 查询。

    您应该使用MAX_CONNECTION_AGE 配置您的服务器,以强制客户端偶尔重新连接以重新平衡负载。当客户端与服务器断开连接时,它们会触发新的 DNS 解析,因此这也可用于查找新地址(尽管重新连接不会等待 DNS 解析完成)。

    在 Java 中,MAX_CONNECTION_AGE 可通过 NettyServerBuilder.maxConnectionAge() 获得:

    NettyServerBuilder.forPort(yourPort)
        .maxConnectionAge(30, TimeUnit.MINUTES)
        ....
    

    您想使用尽可能大的年龄。如果时间为 30 分钟,那么每个客户端将每 30 分钟重新平衡一次。因此,在服务器重新启动 15 分钟后,该服务器将有 ¼ 的负载,而在 30 分钟后,它将大约有 ½。

    【讨论】:

    • 感谢您的回复,我也看到了这个选项。对我来说,它看起来像一个黑客:启动关闭连接不是单个服务器实例的责任。我添加了defaultLoadBalancingPolicy 参数(请参阅我的回复),它似乎有帮助。你能评论一下吗?
    • round_robin 将导致每个客户端一直连接到每个服务器。这对您来说可能是一个好方法。但是如果 DNS 返回的地址发生变化,您仍然需要MAX_CONNECTION_AGE 让客户端注意到这些新地址。这就是基于 DNS 的基础设施的工作方式; HTTP 之类的东西几乎不断地创建连接。
    • 很抱歉,如果这是题外话,但是客户端不能不时刷新地址列表并自行重新平衡工作负载是否有根本原因?
    • 在大规模部署中,DNS 服务器通常会返回服务器地址的子集。这些服务器每次响应都会返回不同的结果。还有一个问题是客户应该多久轮询一次。 “客户端轮询”策略对 pick_first 没有帮助,因为客户端将继续支持其已建立的连接。 MAX_CONNECTION_AGE 对于 L4 负载平衡非常必要,也可以用于这些其他方法。它还避免了客户端中的硬编码配置。
    【解决方案2】:

    似乎配置负载平衡策略可以完成这项工作:

    NettyChannelBuilder.forAddress(host, port).defaultLoadBalancingPolicy("round_robin").usePlaintext().build()
    

    【讨论】:

    • 仅配置循环 LB 策略 + k8s 无头服务将无法检测到新的 pod IP(如果您扩大规模)。服务器端需要一些 hack,我们需要设置 max_connection_age_ms 和 max_connection_age_grace_ms
    猜你喜欢
    • 1970-01-01
    • 2019-08-04
    • 2010-12-22
    • 2012-08-19
    • 1970-01-01
    • 1970-01-01
    • 2012-07-27
    • 1970-01-01
    • 2011-11-04
    相关资源
    最近更新 更多