如何使用ACM实现zookeeper依赖服务的透明Failover迁移

如何使用ACM实现zookeeper依赖服务的透明Failover迁移

如何使用ACM实现zookeeper依赖服务的透明Failover迁移,很多新手对此不是很清楚,为了帮助大家解决这个难题,下面小编将为大家详细讲解,有这方面需求的人可以来学习下,希望你能有所收获。

使用ACM实现zookeeper依赖服务的透明Failover迁移

场景介绍

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

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

finalStringconnectString="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";finalintsessionTimeoutInMs=15000;finalintconnectionTimeoutInMs=1000;finalStringappNs="app1";CuratorFrameworkFactory.Builderbuilder=CuratorFrameworkFactory.builder();CuratorFrameworkzkClient=builder.connectString(connectString).connectionTimeoutMs(connectionTimeoutInMs).sessionTimeoutMs(sessionTimeoutInMs).namespace(appNs).retryPolicy(newRetryNTimes(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列表变更的效果。

示例代码如下

importjava.io.IOException;importjava.io.StringReader;importjava.util.Properties;importjava.util.concurrent.Executor;importjava.util.concurrent.Executors;importjava.util.concurrent.atomic.AtomicReference;importorg.apache.curator.ensemble.EnsembleProvider;importcom.alibaba.edas.acm.listener.ConfigChangeListener;importcom.alibaba.edas.acm.ConfigService;importcom.alibaba.edas.acm.exception.ConfigException;publicclassACMEnsembleProviderimplementsEnsembleProvider{privatestaticfinalStringACM_ZK_CFG_DATAID="com.taobao.zookeeper.connCfg";privatestaticfinalStringACM_ZK_CFG_GROUP="zookeeper";privatestaticfinalintACM_TIME_OUT_MS=3000;privatefinalstaticExecutoracmCallBackExecutor=Executors.newSingleThreadScheduledExecutor();privateConfigChangeListenerconfigChangeListener;privatefinalAtomicReference<String>connectionString=newAtomicReference<String>("");privatePropertiescfg=newProperties();publicStringgetZkHosts(){//从ACM控制台该配置的"示例代码"中拷贝对应的值ConfigService.init("${domain}","${namespace}","${accessKey}","${secretKey}");try{StringzkServiceCfg=ConfigService.getConfig(ACM_ZK_CFG_DATAID,ACM_ZK_CFG_GROUP,ACM_TIME_OUT_MS);cfg.load(newStringReader(zkServiceCfg));StringconnectString=cfg.getProperty("connectString");connectionString.set(connectString);returnconnectString;}catch(ConfigExceptione1){//logger.warn("acm.getConfigerrorwithdataId:"+//dataIdZkHosts,e);e1.printStackTrace();returnnull;}catch(IOExceptione){e.printStackTrace();returnnull;}}publicvoidstart()throwsException{configChangeListener=newConfigChangeListener(){publicExecutorgetExecutor(){returnacmCallBackExecutor;}publicvoidreceiveConfigInfo(StringconfigInfo){//logger.warn("receivezkHostschangeindiamond,dataId:"+//dataIdZkHosts+",changedzkHosts:"//+configInfo);try{cfg.load(newStringReader(configInfo));}catch(IOExceptione){//processexceptione.printStackTrace();}StringconnectString=cfg.getProperty("connectString");connectionString.set(connectString);}};ConfigService.addListener(ACM_ZK_CFG_DATAID,ACM_ZK_CFG_GROUP,configChangeListener);}publicStringgetConnectionString(){returnconnectionString.get();}publicvoidclose()throwsIOException{//ConfigService.removeListener(ACM_ZK_CFG_DATAID,ACM_ZK_CFG_GROUP,//configChangeListener);}}

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

该方案如图所示:

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

看完上述内容是否对您有帮助呢?如果还想对相关知识有进一步的了解或阅读更多相关文章,请关注恰卡编程网行业资讯频道,感谢您对恰卡编程网的支持。

发布于 2021-12-23 21:19:52
收藏
分享
海报
0 条评论
48
上一篇:如何通过unix socker访问Open vSwitch database server 下一篇:如何实现Openstack fernet token 解析
目录

    0 条评论

    本站已关闭游客评论,请登录或者注册后再评论吧~

    忘记密码?

    图形验证码