共計 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 的支持。