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

使用阿里云配置管理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节点,整个流程,如下图所示,

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

该方案如图所示:

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

  • 优点

    简单易理解,但因DNS ttl缓存失效问题,会有收敛时间。
    
  • 缺点
    想针对zookeeper集群同时设置超时时间,应用使用zookeeper的chroot/namespace,用于连接zookeeper服务的用户名,密码等配置项,并根据负载等情况动态变更这些连接相关配置无法通过DNS,VIP系统做到。
    

方案2 使用ACM方案

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

然后通过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将自动分发变更到所有的应用系统。

该方案如图所示:

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

总结

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

时间: 2024-09-13 15:16:52

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

阿里云日本数据中心年底开始服务

本文讲的是阿里云日本数据中心年底开始服务[IT168 云计算]7月22日下午,阿里云总裁胡晓明受邀在2016年软银世界大会上发表主题演讲并接受本地媒体采访.他表示,阿里云位于日本的数据中心将于今年第四季度启用,联手软银共同拓展日本市场,目标是成为日本本地市场上最大的云服务商. 今年5月,阿里巴巴和软银宣布在日本成立云计算合资公司,携手拓展日本云计算市场.分工上,阿里云聚焦技术和产品层面,软银应用自己在日本的广泛客户资源在本地市场上以"Alibaba Cloud"为品牌推广云计算大数据服

用Windows IIS和阿里云NAS提供Web和FTP服务

阿里云文件存储服务NAS(阿里云NAS)是阿里云在2016年正式推出的公有云上的网络文件系统实现.阿里云NAS主要面向阿里云 ECS 实例.HPC.Docker.弹性Web和BatchCompute 等计算节点提供文件存储服务.通过标准的文件访问协议,用户无需对现有应用做任何修改,即可在云上使用具备无限容量及性能扩展.单一命名空间.多共享.高可靠和高可用等特性的分布式文件系统.阿里云于2016年发布了支持NFS网络文件系统访问协议的阿里云文件系统(NAS).2017年3月,又增加了SMB文件系统

[Linux]阿里云免费试用体验(在阿里云的ubuntu上部署个人服务)

作为一个IT界的人,一般都希望有一个独立的博客,或者一部独立的机器.所以我一直在找机会,拥有一台自己可以独立控制的机器,自己想干嘛干嘛.当然这在虚拟机或者自己的PC上面也可以实现,但是这跟一台一直开着挂在网上的服务器体验是完全不一样的.   申请 一直很想试试阿里云.之前有一次申请免费试用,不知道是不是当时网站存在bug,结果一直卡在手机验证的环节.后来又申请了一次,终于可以了. 五一前又申请了一次免费试用,终于成功了: 之后等审核,审核的时候阿里云会打电话过来进行简单的确认,问你用来干嘛,最后

刘松:阿里云与用友优普携手服务中型企业

当今IT界有句非常著名的话"人类正在从IT时代走向DT时代."此话之所以流传甚广,一则源于这句话出自马云之口,二则人类正亲历并见证者DT时代的降临. DT时代的到来,使得不少产业依附于互联网,产业互联网模式随之出现.而如何帮助企业更好地进行互联网转型,降低成本,提升效率,成为2B市场的新课题.9月10日,在中国企业互联网商业创新大会暨用友优普首届用户年会上,阿里巴巴集团副总裁.阿里云业务总经理刘松,结合阿里与用友的深度战略合作实践,分享了他对产业互联网的见解. 信息革命2.0:DT时代

【阿里云资讯】2016年企业级服务50强榜单! 阿里云居榜首

[8月26日讯]              本文转载自 阿里云微信公众号 Alibaba-Cloud 原文链接

一分钟了解阿里云产品:大数据计算服务MaxCompute概述

  阿里云发布了许多产品,今天让我们来了解下大数据计算服务MaxCompute这款产品吧.     什么是MaxCompute呢?   MaxCompute是由阿里云自主研发,是阿里巴巴自主研发的海量数据处理平台.提供针对TB/PB级数据.实时性要求不高的分布式处理能力,应用于数据分析.挖掘.商业智能等领域.主要服务于批量结构化数据的存储和计算,可以提供海量数据仓库的解决方案以及针对大数据的分析建模服务.阿里巴巴的离线数据业务都运行在MaxCompute上.   MaxCompute有什么优势和

阿里云业务总经理刘松:企业服务创业火热的三大原因和发展趋势

众所周知,近两年,企业级服务市场的增长势头非常明显.大量ToB企业或获得融资,或取得较高的业绩增长:与此同时,诸多投资机构也逐渐加大在企业服务领域的关注度,希望可以获得更优质的投资机会.可以说,2016年的企业服务市场火热依旧,并且这种火热在未来将会持续很长一段时间. 在刚刚结束的2016猎云网年度CEO峰会上,阿里云业务总经理刘松与其他嘉宾共同探讨了企业级服务创业的进化与变革.作为目前国内最大的云计算服务提供商,阿里云承载着诸多企业,尤其是创业企业的各类业务.而这种业务支持,也让阿里云对于国内

阿里云服务器ECS已有网站挂载数据盘和迁移数据 适合WDCP/AMH等环境

一般情况,我们新购买VPS主机都会以默认的硬盘基准,但是随着网站数据的增加,我们后面会需要升级和添加数据盘配置.比如阿里云服务器ECS默认的系统盘是20GB,基本上初始项目需求还是能够满足大部分用户的,我们或许在之后的项目运营中需要增加挂载硬盘.   因为考虑到阿里云ECS服务器的用户需求在国内还是比较多的,所以老左在上周的时候也真实的购买一台+20GB数据盘,这样在演练教程的时候能够确保真实性.在以前的博文中,有分享过"阿里云服务器ECS数据盘挂载过程"文章,这个是针对新开通服务器没

阿里云MongoDB Sharding备份和恢复服务深度解密

大数据时代,数据保存的重要性不言而喻.在数据保存过程中,数据的备份更是一个值得深入研究的课题.在3月12日下午举行的MongoDB杭州用户交流会上,阿里云技术专家明俨分享了MongoDB Sharding备份和恢复的技术解密.他通过介绍不同的备份方法及备份的主要问题等方面来阐述阿里云在MongoDB Sharding备份和恢复方面所做的工作. 在"MongoDB Sharding杭州用户交流会"上,阿里云技术专家明俨分享了MongoDB Sharding备份和恢复的技术解密.他通过介绍