|
|
|
@ -16,6 +16,22 @@
|
|
|
|
|
*/ |
|
|
|
|
package org.apache.dolphinscheduler.common.zk; |
|
|
|
|
|
|
|
|
|
import static org.apache.dolphinscheduler.common.Constants.ADD_ZK_OP; |
|
|
|
|
import static org.apache.dolphinscheduler.common.Constants.DELETE_ZK_OP; |
|
|
|
|
import static org.apache.dolphinscheduler.common.Constants.MASTER_PREFIX; |
|
|
|
|
import static org.apache.dolphinscheduler.common.Constants.SINGLE_SLASH; |
|
|
|
|
import static org.apache.dolphinscheduler.common.Constants.UNDERLINE; |
|
|
|
|
import static org.apache.dolphinscheduler.common.Constants.WORKER_PREFIX; |
|
|
|
|
|
|
|
|
|
import java.util.ArrayList; |
|
|
|
|
import java.util.Date; |
|
|
|
|
import java.util.HashMap; |
|
|
|
|
import java.util.List; |
|
|
|
|
import java.util.Map; |
|
|
|
|
import org.apache.commons.lang3.StringUtils; |
|
|
|
|
import org.apache.curator.framework.CuratorFramework; |
|
|
|
|
import org.apache.curator.framework.imps.CuratorFrameworkState; |
|
|
|
|
import org.apache.curator.framework.recipes.locks.InterProcessMutex; |
|
|
|
|
import org.apache.dolphinscheduler.common.Constants; |
|
|
|
|
import org.apache.dolphinscheduler.common.IStoppable; |
|
|
|
|
import org.apache.dolphinscheduler.common.enums.ZKNodeType; |
|
|
|
@ -23,26 +39,9 @@ import org.apache.dolphinscheduler.common.model.Server;
|
|
|
|
|
import org.apache.dolphinscheduler.common.utils.DateUtils; |
|
|
|
|
import org.apache.dolphinscheduler.common.utils.OSUtils; |
|
|
|
|
import org.apache.dolphinscheduler.common.utils.ResInfo; |
|
|
|
|
import org.apache.commons.configuration.Configuration; |
|
|
|
|
import org.apache.commons.configuration.ConfigurationException; |
|
|
|
|
import org.apache.commons.configuration.PropertiesConfiguration; |
|
|
|
|
import org.apache.commons.lang3.StringUtils; |
|
|
|
|
import org.apache.curator.RetryPolicy; |
|
|
|
|
import org.apache.curator.framework.CuratorFramework; |
|
|
|
|
import org.apache.curator.framework.CuratorFrameworkFactory; |
|
|
|
|
import org.apache.curator.framework.imps.CuratorFrameworkState; |
|
|
|
|
import org.apache.curator.framework.recipes.locks.InterProcessMutex; |
|
|
|
|
import org.apache.curator.framework.state.ConnectionState; |
|
|
|
|
import org.apache.curator.framework.state.ConnectionStateListener; |
|
|
|
|
import org.apache.curator.retry.ExponentialBackoffRetry; |
|
|
|
|
import org.apache.zookeeper.CreateMode; |
|
|
|
|
import org.slf4j.Logger; |
|
|
|
|
import org.slf4j.LoggerFactory; |
|
|
|
|
|
|
|
|
|
import java.util.*; |
|
|
|
|
|
|
|
|
|
import static org.apache.dolphinscheduler.common.Constants.*; |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
/** |
|
|
|
|
* abstract zookeeper client |
|
|
|
@ -70,8 +69,7 @@ public abstract class AbstractZKClient extends ZookeeperCachedOperator{
|
|
|
|
|
return; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
byte[] bytes = zkClient.getData().forPath(znode); |
|
|
|
|
String resInfoStr = new String(bytes); |
|
|
|
|
String resInfoStr = super.get(znode); |
|
|
|
|
String[] splits = resInfoStr.split(Constants.COMMA); |
|
|
|
|
if (splits.length != Constants.HEARTBEAT_FOR_ZOOKEEPER_INFO_LENGTH){ |
|
|
|
|
return; |
|
|
|
@ -107,8 +105,7 @@ public abstract class AbstractZKClient extends ZookeeperCachedOperator{
|
|
|
|
|
String type = serverType.equals(MASTER_PREFIX) ? MASTER_PREFIX : WORKER_PREFIX; |
|
|
|
|
String deadServerPath = getDeadZNodeParentPath() + SINGLE_SLASH + type + UNDERLINE + ipSeqNo; |
|
|
|
|
|
|
|
|
|
if(zkClient.checkExists().forPath(zNode) == null || |
|
|
|
|
zkClient.checkExists().forPath(deadServerPath) != null ){ |
|
|
|
|
if(!isExisted(zNode) || isExisted(deadServerPath)){ |
|
|
|
|
return true; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
@ -118,14 +115,12 @@ public abstract class AbstractZKClient extends ZookeeperCachedOperator{
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
public void removeDeadServerByHost(String host, String serverType) throws Exception { |
|
|
|
|
List<String> deadServers = zkClient.getChildren().forPath(getDeadZNodeParentPath()); |
|
|
|
|
List<String> deadServers = super.getChildrenKeys(getDeadZNodeParentPath()); |
|
|
|
|
for(String serverPath : deadServers){ |
|
|
|
|
if(serverPath.startsWith(serverType+UNDERLINE+host)){ |
|
|
|
|
String server = getDeadZNodeParentPath() + SINGLE_SLASH + serverPath; |
|
|
|
|
if(zkClient.checkExists().forPath(server) != null){ |
|
|
|
|
zkClient.delete().forPath(server); |
|
|
|
|
logger.info("{} server {} deleted from zk dead server path success" , serverType , host); |
|
|
|
|
} |
|
|
|
|
String server = getDeadZNodeParentPath() + SINGLE_SLASH + serverPath; |
|
|
|
|
super.remove(server); |
|
|
|
|
logger.info("{} server {} deleted from zk dead server path success" , serverType , host); |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
@ -143,8 +138,8 @@ public abstract class AbstractZKClient extends ZookeeperCachedOperator{
|
|
|
|
|
// create temporary sequence nodes for master znode
|
|
|
|
|
String parentPath = getZNodeParentPath(zkNodeType); |
|
|
|
|
String serverPathPrefix = parentPath + "/" + OSUtils.getHost(); |
|
|
|
|
String registerPath = zkClient.create().withMode(CreateMode.EPHEMERAL_SEQUENTIAL).forPath( |
|
|
|
|
serverPathPrefix + UNDERLINE, heartbeatZKInfo.getBytes()); |
|
|
|
|
String registerPath = serverPathPrefix + UNDERLINE; |
|
|
|
|
super.persistEphemeral(registerPath, heartbeatZKInfo); |
|
|
|
|
logger.info("register {} node {} success" , zkNodeType.toString(), registerPath); |
|
|
|
|
return registerPath; |
|
|
|
|
} |
|
|
|
@ -165,7 +160,7 @@ public abstract class AbstractZKClient extends ZookeeperCachedOperator{
|
|
|
|
|
} |
|
|
|
|
registerPath = createZNodePath(zkNodeType); |
|
|
|
|
|
|
|
|
|
// handle dead server
|
|
|
|
|
// handle dead server
|
|
|
|
|
handleDeadServer(registerPath, zkNodeType, Constants.DELETE_ZK_OP); |
|
|
|
|
|
|
|
|
|
return registerPath; |
|
|
|
@ -196,10 +191,10 @@ public abstract class AbstractZKClient extends ZookeeperCachedOperator{
|
|
|
|
|
|
|
|
|
|
}else if(opType.equals(ADD_ZK_OP)){ |
|
|
|
|
String deadServerPath = getDeadZNodeParentPath() + SINGLE_SLASH + type + UNDERLINE + ipSeqNo; |
|
|
|
|
if(zkClient.checkExists().forPath(deadServerPath) == null){ |
|
|
|
|
if(!super.isExisted(deadServerPath)){ |
|
|
|
|
//add dead server info to zk dead server path : /dead-servers/
|
|
|
|
|
|
|
|
|
|
zkClient.create().forPath(deadServerPath,(type + UNDERLINE + ipSeqNo).getBytes()); |
|
|
|
|
super.persist(deadServerPath,(type + UNDERLINE + ipSeqNo)); |
|
|
|
|
|
|
|
|
|
logger.info("{} server dead , and {} added to zk dead server path success" , |
|
|
|
|
zkNodeType.toString(), zNode); |
|
|
|
@ -226,19 +221,13 @@ public abstract class AbstractZKClient extends ZookeeperCachedOperator{
|
|
|
|
|
List<String> childrenList = new ArrayList<>(); |
|
|
|
|
try { |
|
|
|
|
// read master node parent path from conf
|
|
|
|
|
if(zkClient.checkExists().forPath(getZNodeParentPath(ZKNodeType.MASTER)) != null){ |
|
|
|
|
childrenList = zkClient.getChildren().forPath(getZNodeParentPath(ZKNodeType.MASTER)); |
|
|
|
|
if(super.isExisted(getZNodeParentPath(ZKNodeType.MASTER))){ |
|
|
|
|
childrenList = super.getChildrenKeys(getZNodeParentPath(ZKNodeType.MASTER)); |
|
|
|
|
} |
|
|
|
|
} catch (Exception e) { |
|
|
|
|
if(e.getMessage().contains("java.lang.IllegalStateException: instance must be started")){ |
|
|
|
|
logger.error("zookeeper service not started",e); |
|
|
|
|
}else{ |
|
|
|
|
logger.error(e.getMessage(),e); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
}finally { |
|
|
|
|
return childrenList.size(); |
|
|
|
|
logger.error("getActiveMasterNum error",e); |
|
|
|
|
} |
|
|
|
|
return childrenList.size(); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
/** |
|
|
|
@ -280,10 +269,9 @@ public abstract class AbstractZKClient extends ZookeeperCachedOperator{
|
|
|
|
|
Map<String, String> masterMap = new HashMap<>(); |
|
|
|
|
try { |
|
|
|
|
String path = getZNodeParentPath(zkNodeType); |
|
|
|
|
List<String> serverList = getZkClient().getChildren().forPath(path); |
|
|
|
|
List<String> serverList = super.getChildrenKeys(path); |
|
|
|
|
for(String server : serverList){ |
|
|
|
|
byte[] bytes = getZkClient().getData().forPath(path + "/" + server); |
|
|
|
|
masterMap.putIfAbsent(server, new String(bytes)); |
|
|
|
|
masterMap.putIfAbsent(server, super.get(path + "/" + server)); |
|
|
|
|
} |
|
|
|
|
} catch (Exception e) { |
|
|
|
|
logger.error("get server list failed : " + e.getMessage(), e); |
|
|
|
@ -430,27 +418,15 @@ public abstract class AbstractZKClient extends ZookeeperCachedOperator{
|
|
|
|
|
*/ |
|
|
|
|
protected void initSystemZNode(){ |
|
|
|
|
try { |
|
|
|
|
createNodePath(getMasterZNodeParentPath()); |
|
|
|
|
createNodePath(getWorkerZNodeParentPath()); |
|
|
|
|
createNodePath(getDeadZNodeParentPath()); |
|
|
|
|
persist(getMasterZNodeParentPath(), ""); |
|
|
|
|
persist(getWorkerZNodeParentPath(), ""); |
|
|
|
|
persist(getDeadZNodeParentPath(), ""); |
|
|
|
|
|
|
|
|
|
} catch (Exception e) { |
|
|
|
|
logger.error("init system znode failed : " + e.getMessage(),e); |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
/** |
|
|
|
|
* create zookeeper node path if not exists |
|
|
|
|
* @param zNodeParentPath zookeeper parent path |
|
|
|
|
* @throws Exception errors |
|
|
|
|
*/ |
|
|
|
|
private void createNodePath(String zNodeParentPath) throws Exception { |
|
|
|
|
if(null == zkClient.checkExists().forPath(zNodeParentPath)){ |
|
|
|
|
zkClient.create().creatingParentContainersIfNeeded() |
|
|
|
|
.withMode(CreateMode.PERSISTENT).forPath(zNodeParentPath); |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
/** |
|
|
|
|
* server self dead, stop all threads |
|
|
|
|
* @param serverHost server host |
|
|
|
|