zookeeper在單機上僞集羣測試時,出現Unable to start AdminServer, exiting abnormally
出現該問題的原因大家都知道因爲啓動完一個zookeeper server後,默認的zkServer.cmd中,沒有將對應的不啓動AdminServer屏蔽。
AdminServerFactory.java中代碼如下
public static AdminServer createAdminServer() {
if (!"false".equals(System.getProperty("zookeeper.admin.enableServer"))) {
try {
Class<?> jettyAdminServerC = Class.forName("org.apache.zookeeper.server.admin.JettyAdminServer");
Object adminServer = jettyAdminServerC.getConstructor().newInstance();
return (AdminServer) adminServer;
} catch (ClassNotFoundException e) {
LOG.warn("Unable to start JettyAdminServer", e);
} catch (InstantiationException e) {
LOG.warn("Unable to start JettyAdminServer", e);
} catch (IllegalAccessException e) {
LOG.warn("Unable to start JettyAdminServer", e);
} catch (InvocationTargetException e) {
LOG.warn("Unable to start JettyAdminServer", e);
} catch (NoSuchMethodException e) {
LOG.warn("Unable to start JettyAdminServer", e);
} catch (NoClassDefFoundError e) {
LOG.warn("Unable to load jetty, not starting JettyAdminServer", e);
}
}
return new DummyAdminServer();
}
因爲第一個啓動的Zookeeper server已經把8080端口給佔用了
根據創建JettyAdminServer中代碼如下:
public JettyAdminServer() throws AdminServerException {
this(Integer.getInteger("zookeeper.admin.serverPort", DEFAULT_PORT),
System.getProperty("zookeeper.admin.commandURL", DEFAULT_COMMAND_URL));
}
所以可以在zkServer.cmd中的最後一個call參數中,增加"-Dzookeeper.admin.enableServer=false"
或者
"-Dzookeeper.admin.serverPort=你的端口號"
更改端口號後再進行啓動,這樣在單機環境下配置集羣測試就OK了