MSE注册配置中心高可用最佳实践

通过MSE注册配置中心提供的高可用能力,可以有效提升应用应对风险的能力。根据高可用的作用域,可以将具体实践分为注册配置中心实例高可用、服务发现高可用以及配置管理高可用。本文以MSE注册配置中心专业版为例进行阐述。

版本推荐

  • spring-cloud-alibaba:推荐使用2.2.6.RELEASE及以上版本。

  • dubbo:推荐使用2.7.12及以上版本。

  • spring-boot:推荐使用2.3.x及以下版本,2.4.x版本存在兼容问题,不推荐使用。

注册配置中心实例高可用

  • 高可用架构

    没有任何服务百分百可用,如果您的业务有更高的高可靠性和数据安全需求,建议选择不少于3个节点进行实例部署。当其中某个实例故障时,节点间秒级完成切换,故障节点自动离群。

    专业版注册配置中心基于Nacos 2.0新架构基础之上,在高可用方面降低了对底层基础设施的依赖,进一步提升了容灾能力。相关内容,请参见实例及版本选型

  • 多可用区

    MSE每个地域都包含多个可用区。处于同一个地域中不同可用区的应用相互之间网络延迟很小(3 ms以内),同时提供了故障隔离。多可用区实例将物理服务器部署在不同的可用区,当可用区A出现故障时,流量会在短时间内切换到另一个可用区B。整个过程您无需感知,应用代码无需变更。您只需配置多个节点部署,MSE自动部署到多个可用区。

    图 1. MSE三节点同城双活架构图MSE三节点同城双活架构图

    图 2. 多级容灾架构多级容灾架构

服务发现高可用实践

服务发现包含服务消费者(Consumer)服务提供者(Provider)。其中服务消费者(Consumer)提供推空保护能力,服务提供者(Provider)提供容灾保护能力。

服务消费者(Consumer)

服务消费者(Consumer)会从注册中心上订阅服务提供者(Provider)的实例列表。没有任何服务百分百可用,注册中心在进行变更(变配、升降级)或遇到突发情况(例如,可用区断网断电)时,都有可能导致订阅异常,影响服务消费者(Consumer)的可用性。

为了应对不可预知的情况下订阅列表异常,可以在Consumer侧配置推空保护。服务调用方推空保护

  • 无推空保护时:Consumer订阅到空列表,业务中断报错。

  • 开启推空保护:Consumer订阅到空列表,推空保护生效,丢弃变更,保障业务服务可用。

配置方式

说明

目前仅支持nacos-java-client 1.4.1及以上版本,关于Spring Cloud和Dubbo应用的版本,请参见版本推荐

  • Spring Cloud应用

    在配置中增加如下配置:

    spring.cloud.nacos.discovery.namingPushEmptyProtection=true
  • Dubbo应用

    registry.url里添加以下参数:

    namingPushEmptyProtection=true

持久化缓存

客户端的推空保护生效后,如果您使用容器进行部署,当容器重启后,可能会丢失缓存目录。因此需要将推送缓存的目录进行持久化(挂载Volume)。

缓存目录为:${user.home}/nacos/naming/${namespaceId}

服务提供者(Provider)

服务提供者(Provider)容灾保护主要用于避免集群在异常流量下出现雪崩。

说明

nacos-java-client 2.x版本注册的Provider暂时不支持Provider侧的容灾。

  • 无容灾保护

    无容灾保护

    当来自Consumer端的请求量突然增加时,如果Provider容量水位较高,会导致个别Provider发生故障:

    1. 注册中心会将故障节点摘除,全量流量会给剩余节点。

    2. 剩余Provider节点负载变高,大概率也会发生故障。

    3. 最终所有Provider节点故障,100%无法提供服务。

  • 有容灾保护

    开启容灾保护

    当来自Consumer端的请求量突然增加时,如果Provider容量水位较高,导致个别Provider发生故障:

    1. 注册中心会将故障节点摘除,全量流量会给剩余节点。

    2. 故障节点数达到保护阈值,流量平摊给所有实例。

    3. 最终保障50%节点能够提供服务。

开启容灾保护

  • 支持的实例范围

    • 持久化实例:完全支持。

    • 非持久化实例:

      • nacos-java-client 1.x版本:默认30秒会删除不健康的实例,被删除的实例将不会参与阈值的计算,导致容灾策略失效。

      • nacos-java-client 2.x版本:无效。长连接断开后会立即下线实例,容灾策略无法生效。

  • 通过命令行配置

    • 调整指定服务的阈值

      curl -X PUT "${nacos.address}/nacos/v1/ns/service?namespaceId=public&serviceName=my-provider&protectThreshold=0.6"
      • ${nacos.address}:注册中心地址。

      • namespaceId:命名空间(默认值:public)。

      • serviceName:Spring Cloud应用服务名或Dubbo应用接口名。

    • 查询阈值配置

      curl -X GET "${nacos.address}/nacos/v1/ns/service?namespaceId=public&serviceName=my-provider"
    • 返回结果

      {"namespaceId":"public","groupName":"DEFAULT_GROUP","name":"my-provider","protectThreshold":0.7,"metadata":{},"selector":{"type":"none"},"clusters":[]}

服务治理高可用配置

通过服务治理功能,开启服务无损上下线、离群实例摘除、配置服务降级等功能,也能够提高应用可用性。

配置管理高可用实践

配置管理的高可用能力主要有以下两个方面,一方面是配置管理客户端的缓存目录及容灾目录,另外一方面是配置中心多维度的限流能力。

说明

以下配置管理高可用能力在注册配置中心专业版中默认开启,您无需操作。

配置管理

  • 客户端

    • 缓存目录:每次客户端和配置中心进行数据交互后,会保存最新的配置内容至本地缓存目录中,当服务端不可用状态下,会使用本地缓存目录中内容。

    • 容灾目录:当服务端不可用时,可以在本地的容灾目录中手动更新配置内容,客户端会优先加载容灾目录下的内容,模拟服务端变更推送的效果。

  • 配置中心

    配置中心的高可用能力,除了基础运维层面的高可用外,服务应用层部署了多维度的限流能力,包括针对连接的单机最大连接限流,单客户端IP的连接限流能力。发布配置的秒级、分钟级数量限流,精确到配置维度的秒级、分钟级流量限流等,以降低非正常流量下的服务端宕机风险。