You need to enable JavaScript to run this app.
导航
网络变更优化措施
最近更新时间:2024.09.24 10:10:50首次发布时间:2024.05.13 19:48:35

场景描述

如果您想重新规划实例的网络,需要通过修改私有网络或者子网来完成。这些操作将会导致客户端访问实例的网络链路产生变更,变更范围包括使用可视化工具(Kibana、Cerebro 等)的公/私网域名访问实例的网络链路,使用 SDK 或者 HTTP/HTTPS 方式通过公/私网域名访问实例的网络链路。
修改云搜索服务实例的网络,会对访问实例的网络链路产生变更,届时您的公网、私网域名访问需要解析到新的IP。由于浏览器、应用程序、操作系统和 DNS 服务器等均可能对 DNS 解析的结果进行缓存,导致新的 IP 无法及时感知到。这将对您使用可视化工具(Kibana、Cerebro 等)访问实例和应用程序的在线读写,产生数分钟甚至小时级别的中断。

优化方案

为了降低因为修改实例的网络导致服务不可用的时长,本文提出了不同场景的优化方案,您需要根据真实的云场景和客户端进行针对性优化。

说明

本文提供的优化方案均无法保证修改网络期间对服务的零影响,只能降低服务不可用的时间。

云场景优化

公有云

在公有云场景下,您的所有服务资源均在火山引擎内部,推荐您使用私有域名访问云搜索服务实例,这样可以使用火山引擎内部的 DNS 服务器进行高效域名解析。同时,在修改实例网络过程中,内部的 DNS 服务器可以控制 DNS 服务器的缓存时间,让您的客户端更快感知域名下的新 IP 地址,降低服务不可用时间。
使用火山引擎 VPC 中的服务资源通过域名访问云搜索服务实例。在 VPC 内,推荐您使用实例的私有域名访问,它会使用 火山私网解析 PrivateZone服务,提供高效的DNS解析。

混合云

在多云场景下,您的火山引擎云资源与自建 IDC/第三方云服务之间一般通过专线、VPN、云企业网或中转路由器进行连接。
自建 IDC/第三方云服务的应用程序通过域名访问云搜索实例。该场景下,推荐您将实例的私网域名的 DNS 解析请求转发到 VPC 内的 DNS 服务器,这样就可以使用到火山私网解析 PrivateZone服务。PrivateZone 服务提供该转发能力,具体配置请参见在 VPC 和自建 IDC/第三方云服务之间实现 DNS 解析
针对公有云和混合云场景,我们均推荐您使用云搜索服务实例的私有域名进行访问,并通过火山引擎内部 DNS 服务器进行域名解析。在修改网络过程中,它可以有效控制 DNS 服务器的缓存失效时间,让您的客户端更快感知域名下的新 IP 地址,降低服务不可用时间。

私有云

如果您的应用程序和服务部署在自建 IDC 和第三方云服务内,或者您需要在本地进行调试,并且访问火山云搜索服务等火山引擎产品都是通过公网域名的方式。
在这种场景下,推荐您配置火山引擎公共DNS解析(PublicDNS),它可以提升您的互联网访问速度,并帮助您避免 DNS 欺骗、DNS 劫持等问题。在修改网络过程中,它也可以有效控制 DNS 服务器的缓存失效时间,让您的客户端更快感知域名下的新 IP 地址,降低服务不可用时间。
由于您应用程序的部署机器环境存在多样性,为此提供了各个操作系统和网络设备的配置方式。详细内容,请参见接入公共解析 PublicDNS

客户端优化

为了降低服务不可用的时长,您可以对可视化端(Kibana、Cerebro 等)、在线应用程序端进行优化配置。

可视化端

浏览器可能会对 DNS 进行缓存,不同的浏览器策略可能不同。
当您在使用 Kibana、Cerebro 等可视化端时,如果遇到访问失败或者访问超时的情况,可以尝试多次刷新。如果没有效果,可以尝试以下解决方法
此处以 Chrome 浏览器为例。执行下述步骤后,即可清除 Chrome 浏览器的 DNS 缓存。

  1. 在 Chrome 浏览器地址栏中输入 chrome://net-internals/#dns
    图片
  2. DNS 路径下,单击 Clear host cache
  3. Socket 路径下,单击 Flush socket pools

应用程序端

您的应用程序端会使用多种语言来实现,一些语言内部会对 DNS 进行缓存。
以 Java 为例,JVM 默认会对 DNS 做缓存,有以下两种情况:

  • 多数情况下,您的应用程序没有开启JavaSecurity机制,JVM 默认对 DNS 缓存时间是 30 秒。
    您可以使用系统参数sun.net.inetaddr.ttl来自定义缓存时间,单位秒,有以下两种指定缓存时间的方法。
    • 在应用程序启动参数中添加-Dsun.net.inetaddr.ttl=10
    • 在应用程序代码中设置属性:System.setProperty("sun.net.inetaddr.ttl", "10")
  • 如果您的程序开启了JavaSecurity机制,JVM 默认会永久缓存 DNS 记录,这样会导致程序一直无法感知到域名指向的新 IP。
    您需要在代码设置 Security 的属性,通过设置networkaddress.cache.ttl的取值来指定缓存时间,单位秒。
    java.security.Security.setProperty("networkaddress.cache.ttl", "10");
    

说明

  • 对于 Java 客户端,上述两种方式设置后均需要重启应用程序生效。JVM 的 DNS 缓存时间推荐配置在 5~10 秒,对应用程序的访问效率不会有太大影响。
  • 对于其他语言客户端,比如 Go 和 Python 默认不会对 DNS 做缓存。如果有引入特定函数库来实现 DNS 缓存,相应代码需要调整缓存时间。