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

80次阅读
没有评论

共计 3955 个字符,预计需要花费 10 分钟才能阅读完成。

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

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

在一个数据中心里,一个 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) 之间省去了沟通成本,应用系统也省去了因连接相关的配置变更导致的应用重新启动或者发布应用的变更成本。

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

正文完
 
丸趣
版权声明:本站原创文章,由 丸趣 2023-08-16发表,共计3955字。
转载说明:除特殊说明外本站除技术相关以外文章皆由网络搜集发布,转载请注明出处。
评论(没有评论)