使用阿里云配置管理ACM实现zookeeper依赖服务的透明Failover迁移

本文涉及的产品
注册配置 MSE Nacos/ZooKeeper,118元/月
服务治理 MSE Sentinel/OpenSergo,Agent数量 不受限
云原生网关 MSE Higress,422元/月
简介: 在本文中我们介绍了,如何利用ACM解决服务发现场景中的下游依赖服务透明替换节点,调整服务连接超时参数等问题。 通过该例,我们可以看到,在将应用的静态配置文件方式迁移到ACM之后,通过应用主动动态监听配置变更,可以在应用和运维层面获得诸多好处,这包括省去了应用配置变更时,应用往往需要重新发布或者重启的成本,同时使Dev和Ops在配置变更场景下2者之间的沟通成本降到最低。

使用阿里云配置管理ACM实现zookeeper依赖服务的透明Failover迁移

摘要:在访问依赖的服务过程中,我们通常会通过在程序或者配置文件中写死ip列表的形式来发现下游服务,但在下游服务集群出现ip迁移的时候,会导致所有依赖该服务的上游应用重新配置ip列表并重新发布或者重启才能生效。本文介绍了如何使用阿里云配置管理产品ACM,并以zookeeper集群服务为例,如何方便的在数据中心里实现透明的替换zookeeper坏掉的机器节点。

场景介绍

在一个数据中心里,一个zookeeper集群常常会服务多条业务线或者业务系统,每个业务线或者业务系统有自己的开发团队,而zookeeper这类公共服务则会有专门的运维或者团队负责保障其服务可用性和连续性。

业务应用通过Apache Curator客户端或者原生的zookeeper客户端访问zookeeper服务,在这个过程中,必须在应用程序里指定connectString,即zookeeper服务所在的机器的ip列表, 代码示例如下:

        final String connectString = "192.168.1.151:2181,192.168.1.152:2181,192.168.1.153:2181,192.168.1.154:2181,192.168.1.155:2181";
        final int sessionTimeoutInMs = 15000;
        final int connectionTimeoutInMs = 1000;
        final String appNs = "app1";

        CuratorFrameworkFactory.Builder builder = CuratorFrameworkFactory.builder();
        
        CuratorFramework zkClient = builder
                       .connectString(connectString)
                       .connectionTimeoutMs(connectionTimeoutInMs)
                       .sessionTimeoutMs(sessionTimeoutInMs)
                       .namespace(appNs)
                       .retryPolicy(new RetryNTimes(6, 100))
                       .build();
        
        zkClient.start();

但在zookeeper的生产运行过程中,zookeeper服务集群可能会遇到机器故障,机器迁移等情况,这个过程则需要zookeeper运维人员替换节点,将服务迁移到新的ip节点,整个流程,如下图所示,

acm_zk_pic1

方案1 使用DNS或者VIP的服务发现方案

该方案如图所示:
acm_zk_pic2

在这个方案中,可以将zk服务ip挂在一个dns域名或者vip上.
这样在zookeeper替换节点时,应用无感知,这个方案即服务发现方案。

  • 优点

    简单易理解,但因DNS ttl缓存失效问题,会有收敛时间。
    
  • 缺点

    想针对zookeeper集群同时设置超时时间,应用使用zookeeper的chroot/namespace,用于连接zookeeper服务的用户名,密码等配置项,并根据负载等情况动态变更这些连接相关配置无法通过DNS,VIP系统做到。
    

方案2 使用ACM方案

我们将zookeeper集群的服务ip列表,连接超时,session超时参数,chroot,当前的用户名,密码等放在一个ACM配置里。

acm_zk_pic3

然后通过ACM SDK监听这个配置的变更,这里我们可以使用curator client提供的EnsembleProvider功能来结合ACM达到动态监听配置服务ip列表变更的效果。

示例代码如下

import java.io.IOException;
import java.io.StringReader;
import java.util.Properties;
import java.util.concurrent.Executor;
import java.util.concurrent.Executors;
import java.util.concurrent.atomic.AtomicReference;
import org.apache.curator.ensemble.EnsembleProvider;
import com.alibaba.edas.acm.listener.ConfigChangeListener;
import com.alibaba.edas.acm.ConfigService;
import com.alibaba.edas.acm.exception.ConfigException;

public class ACMEnsembleProvider implements EnsembleProvider {

    private static final String ACM_ZK_CFG_DATAID = "com.taobao.zookeeper.connCfg";
    private static final String ACM_ZK_CFG_GROUP = "zookeeper";
    private static final int ACM_TIME_OUT_MS = 3000;

    private final static Executor acmCallBackExecutor = Executors.newSingleThreadScheduledExecutor();
    private ConfigChangeListener configChangeListener;
    private final AtomicReference<String> connectionString = new AtomicReference<String>("");
    private Properties cfg = new Properties();

    public String getZkHosts() {
        // 从ACM控制台该配置的"示例代码"中拷贝对应的值
        ConfigService.init("${domain}", "${namespace}", "${accessKey}", "${secretKey}");

        try {
            String zkServiceCfg = ConfigService.getConfig(ACM_ZK_CFG_DATAID, ACM_ZK_CFG_GROUP, ACM_TIME_OUT_MS);
            cfg.load(new StringReader(zkServiceCfg));

            String connectString = cfg.getProperty("connectString");
            connectionString.set(connectString);

            return connectString;
        } catch (ConfigException e1) {
            // logger.warn("acm.getConfig error with dataId : " +
            // dataIdZkHosts, e);
            e1.printStackTrace();
            return null;
        } catch (IOException e) {
            e.printStackTrace();
            return null;
        }
    }

    public void start() throws Exception {
        configChangeListener = new ConfigChangeListener() {

            public Executor getExecutor() {
                return acmCallBackExecutor;
            }

            public void receiveConfigInfo(String configInfo) {
                // logger.warn("receive zkHosts change in diamond, dataId : " +
                // dataIdZkHosts + ", changed zkHosts : "
                // + configInfo);
                try {
                    cfg.load(new StringReader(configInfo));
                } catch (IOException e) {
                    // process exception
                    e.printStackTrace();
                }

                String connectString = cfg.getProperty("connectString");
                connectionString.set(connectString);
            }
        };
        ConfigService.addListener(ACM_ZK_CFG_DATAID, ACM_ZK_CFG_GROUP, configChangeListener);
    }

    public String getConnectionString() {
        return connectionString.get();
    }

    public void close() throws IOException {
        // ConfigService.removeListener(ACM_ZK_CFG_DATAID, ACM_ZK_CFG_GROUP,
        // configChangeListener);
    }

}

当zookeeper集群的节点挂掉,需要更换ip列表或者修改超时参数,应用的znode配额quota时,zookeeper运维人员只需要在ACM上修改相关的配置项,ACM将自动分发变更到所有的应用系统。

该方案如图所示:

acm_zk_pic5

在上例中,我们可以看到,应用系统开发人员(Dev)和运维人员(Ops)之间省去了沟通成本,应用系统也省去了因连接相关的配置变更导致的应用重新启动或者发布应用的变更成本。

总结

在本文中我们介绍了,如何利用ACM解决服务发现场景中的下游依赖服务透明替换节点,调整服务连接超时参数等问题。
通过该例,我们可以看到,在将应用的静态配置文件方式迁移到ACM之后,通过应用主动动态监听配置变更,可以在应用和运维层面获得诸多好处,这包括省去了应用配置变更时,应用往往需要重新发布或者重启的成本,同时使Dev和Ops在配置变更场景下2者之间的沟通成本降到最低。

相关实践学习
基于MSE实现微服务的全链路灰度
通过本场景的实验操作,您将了解并实现在线业务的微服务全链路灰度能力。
相关文章
|
1月前
|
运维 Cloud Native 应用服务中间件
阿里云微服务引擎 MSE 及 云原生 API 网关 2024 年 11 月产品动态
阿里云微服务引擎 MSE 面向业界主流开源微服务项目, 提供注册配置中心和分布式协调(原生支持 Nacos/ZooKeeper/Eureka )、云原生网关(原生支持Higress/Nginx/Envoy,遵循Ingress标准)、微服务治理(原生支持 Spring Cloud/Dubbo/Sentinel,遵循 OpenSergo 服务治理规范)能力。API 网关 (API Gateway),提供 APl 托管服务,覆盖设计、开发、测试、发布、售卖、运维监测、安全管控、下线等 API 生命周期阶段。帮助您快速构建以 API 为核心的系统架构.满足新技术引入、系统集成、业务中台等诸多场景需要
|
2月前
|
运维 Cloud Native 应用服务中间件
阿里云微服务引擎 MSE 及 云原生 API 网关 2024 年 10 月产品动态
阿里云微服务引擎 MSE 面向业界主流开源微服务项目, 提供注册配置中心和分布式协调(原生支持 Nacos/ZooKeeper/Eureka )、云原生网关(原生支持Higress/Nginx/Envoy,遵循Ingress标准)、微服务治理(原生支持 Spring Cloud/Dubbo/Sentinel,遵循 OpenSergo 服务治理规范)能力。API 网关 (API Gateway),提供 APl 托管服务,覆盖设计、开发、测试、发布、售卖、运维监测、安全管控、下线等 API 生命周期阶段。帮助您快速构建以 API 为核心的系统架构.满足新技术引入、系统集成、业务中台等诸多场景需要
|
3月前
|
消息中间件 监控 Ubuntu
大数据-54 Kafka 安装配置 环境变量配置 启动服务 Ubuntu配置 ZooKeeper
大数据-54 Kafka 安装配置 环境变量配置 启动服务 Ubuntu配置 ZooKeeper
104 3
大数据-54 Kafka 安装配置 环境变量配置 启动服务 Ubuntu配置 ZooKeeper
|
3月前
|
Dubbo 应用服务中间件 Apache
Dubbo 应用切换 ZooKeeper 注册中心实例,流量无损迁移
如果 Dubbo 应用使用 ZooKeeper 作为注册中心,现在需要切换到新的 ZooKeeper 实例,如何做到流量无损?
40 4
|
3月前
|
运维 Cloud Native 应用服务中间件
阿里云微服务引擎 MSE 及 云原生 API 网关 2024 年 09 月产品动态
阿里云微服务引擎 MSE 面向业界主流开源微服务项目, 提供注册配置中心和分布式协调(原生支持 Nacos/ZooKeeper/Eureka )、云原生网关(原生支持Higress/Nginx/Envoy,遵循Ingress标准)、微服务治理(原生支持 Spring Cloud/Dubbo/Sentinel,遵循 OpenSergo 服务治理规范)能力。API 网关 (API Gateway),提供 APl 托管服务,覆盖设计、开发、测试、发布、售卖、运维监测、安全管控、下线等 API 生命周期阶段。帮助您快速构建以 API 为核心的系统架构.满足新技术引入、系统集成、业务中台等诸多场景需要
|
3月前
|
监控 Dubbo Java
dubbo学习三:springboot整合dubbo+zookeeper,并使用dubbo管理界面监控服务是否注册到zookeeper上。
这篇文章详细介绍了如何将Spring Boot与Dubbo和Zookeeper整合,并通过Dubbo管理界面监控服务注册情况。
214 0
dubbo学习三:springboot整合dubbo+zookeeper,并使用dubbo管理界面监控服务是否注册到zookeeper上。
|
5月前
|
API
阿里云微服务引擎及 API 网关 2024 年 7 月产品动态
阿里云微服务引擎及 API 网关 2024 年 7 月产品动态。
193 18
|
4月前
|
运维 Cloud Native 应用服务中间件
阿里云微服务引擎 MSE 及 云原生 API 网关 2024 年 08 月产品动态
阿里云微服务引擎 MSE 面向业界主流开源微服务项目, 提供注册配置中心和分布式协调(原生支持 Nacos/ZooKeeper/Eureka )、云原生网关(原生支持Higress/Nginx/Envoy,遵循Ingress标准)、微服务治理(原生支持 Spring Cloud/Dubbo/Sentinel,遵循 OpenSergo 服务治理规范)能力。API 网关 (API Gateway),提供 APl 托管服务,覆盖设计、开发、测试、发布、售卖、运维监测、安全管控、下线等 API 生命周期阶段。帮助您快速构建以 API 为核心的系统架构.满足新技术引入、系统集成、业务中台等诸多场景需要
|
6月前
|
人工智能 API
阿里云微服务引擎及 API 网关 2024 年 6 月产品动态
阿里云微服务引擎及 API 网关 2024 年 6 月产品动态
166 20
|
5月前
|
运维 Cloud Native 应用服务中间件
阿里云微服务引擎 MSE 及 API 网关 2024 年 07 月产品动态
阿里云微服务引擎 MSE 面向业界主流开源微服务项目, 提供注册配置中心和分布式协调(原生支持 Nacos/ZooKeeper/Eureka )、云原生网关(原生支持Higress/Nginx/Envoy,遵循Ingress标准)、微服务治理(原生支持 Spring Cloud/Dubbo/Sentinel,遵循 OpenSergo 服务治理规范)能力。API 网关 (API Gateway),提供 APl 托管服务,覆盖设计、开发、测试、发布、售卖、运维监测、安全管控、下线等 API 生命周期阶段。帮助您快速构建以 API 为核心的系统架构.满足新技术引入、系统集成、业务中台等诸多场景需要。

热门文章

最新文章

下一篇
开通oss服务