久久精品人人爽,华人av在线,亚洲性视频网站,欧美专区一二三

如何使用ACM實現zookeeper依賴服務的透明Failover遷移

163次閱讀
沒有評論

共計 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字。
轉載說明:除特殊說明外本站除技術相關以外文章皆由網絡搜集發布,轉載請注明出處。
評論(沒有評論)
主站蜘蛛池模板: 沙雅县| 黄平县| 苍山县| 沅陵县| 米林县| 九江县| 和硕县| 濮阳市| 津南区| 布尔津县| 新宾| 贺兰县| 恩平市| 文成县| 哈密市| 新丰县| 哈尔滨市| 罗甸县| 黄石市| 黄大仙区| 靖西县| 印江| 淮滨县| 习水县| 靖宇县| 襄城县| 长沙县| 进贤县| 广东省| 淄博市| 西昌市| 柞水县| 磐石市| 依兰县| 深泽县| 云林县| 浪卡子县| 平原县| 民乐县| 旅游| 仲巴县|