From b3de9d29183eb772d465ddb6d48e5f2f79d9ce07 Mon Sep 17 00:00:00 2001 From: blackflash997 Date: Mon, 19 Aug 2024 15:39:17 +0800 Subject: [PATCH 1/3] =?UTF-8?q?[Improvement][Serivce]=E9=83=A8=E5=88=86?= =?UTF-8?q?=E7=BB=84=E4=BB=B6=E8=A7=92=E8=89=B2=E9=80=80=E5=87=BA=E8=BF=90?= =?UTF-8?q?=E8=A1=8C=E5=90=8E=E6=97=A0=E6=B3=95=E6=9B=B4=E6=96=B0=E7=8A=B6?= =?UTF-8?q?=E6=80=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../master/alert/ServiceRoleCheckActor.java | 26 ++--- .../api/strategy/CommonHandlerStrategy.java | 107 ++++++++++++++++++ .../strategy/ServiceRoleStrategyContext.java | 11 +- 3 files changed, 126 insertions(+), 18 deletions(-) create mode 100644 datasophon-service/src/main/java/com/datasophon/api/strategy/CommonHandlerStrategy.java diff --git a/datasophon-service/src/main/java/com/datasophon/api/master/alert/ServiceRoleCheckActor.java b/datasophon-service/src/main/java/com/datasophon/api/master/alert/ServiceRoleCheckActor.java index 27c23a46..0df39b0f 100644 --- a/datasophon-service/src/main/java/com/datasophon/api/master/alert/ServiceRoleCheckActor.java +++ b/datasophon-service/src/main/java/com/datasophon/api/master/alert/ServiceRoleCheckActor.java @@ -19,11 +19,13 @@ package com.datasophon.api.master.alert; +import com.datasophon.api.master.HostCheckActor; import com.datasophon.api.service.ClusterServiceRoleInstanceService; import com.datasophon.api.strategy.ServiceRoleStrategy; import com.datasophon.api.strategy.ServiceRoleStrategyContext; import com.datasophon.api.utils.SpringTool; import com.datasophon.common.Constants; +import com.datasophon.common.enums.ServiceRoleType; import com.datasophon.common.command.ServiceRoleCheckCommand; import com.datasophon.dao.entity.ClusterServiceRoleInstanceEntity; @@ -35,12 +37,17 @@ import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import akka.actor.UntypedActor; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; public class ServiceRoleCheckActor extends UntypedActor { - + + private static final Logger logger = LoggerFactory.getLogger(HostCheckActor.class); + @Override public void onReceive(Object msg) throws Throwable { if (msg instanceof ServiceRoleCheckCommand) { + logger.info("start to service role info"); ClusterServiceRoleInstanceService roleInstanceService = SpringTool.getApplicationContext() .getBean(ClusterServiceRoleInstanceService.class); @@ -48,20 +55,9 @@ public void onReceive(Object msg) throws Throwable { List list = roleInstanceService.list( new QueryWrapper() - .in( - Constants.SERVICE_ROLE_NAME, - "Prometheus", - "AlertManager", - "Krb5Kdc", - "KAdmin", - "SRFE", - "SRBE", - "DorisFE", - "DorisFEObserver", - "DorisBE", - "NameNode", - "ResourceManager", - "ElasticSearch")); + .ne( + Constants.ROLE_TYPE, + ServiceRoleType.CLIENT.getCode()); if (!list.isEmpty()) { Map map = translateListToMap(list); diff --git a/datasophon-service/src/main/java/com/datasophon/api/strategy/CommonHandlerStrategy.java b/datasophon-service/src/main/java/com/datasophon/api/strategy/CommonHandlerStrategy.java new file mode 100644 index 00000000..255ee71f --- /dev/null +++ b/datasophon-service/src/main/java/com/datasophon/api/strategy/CommonHandlerStrategy.java @@ -0,0 +1,107 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.datasophon.api.strategy; + +import com.datasophon.api.load.ServiceInfoMap; +import com.datasophon.api.load.ServiceRoleMap; +import com.datasophon.api.master.ActorUtils; +import com.datasophon.api.utils.ProcessUtils; +import com.datasophon.common.Constants; +import com.datasophon.common.command.ExecuteCmdCommand; +import com.datasophon.common.model.ServiceConfig; +import com.datasophon.common.model.ServiceInfo; +import com.datasophon.common.model.ServiceRoleInfo; +import com.datasophon.common.utils.ExecResult; +import com.datasophon.dao.entity.ClusterInfoEntity; +import com.datasophon.dao.entity.ClusterServiceRoleInstanceEntity; +import com.datasophon.dao.enums.AlertLevel; + +import scala.concurrent.Await; +import scala.concurrent.Future; +import scala.concurrent.duration.Duration; + +import java.util.ArrayList; +import java.util.List; +import java.util.Map; +import java.util.concurrent.TimeUnit; + +import akka.actor.ActorSelection; +import akka.pattern.Patterns; +import akka.util.Timeout; + +public class CommonHandlerStrategy implements ServiceRoleStrategy { + + @Override + public void handler(Integer clusterId, List hosts, String serviceName) { + + } + + @Override + public void handlerConfig(Integer clusterId, List list, String serviceName) { + + } + + @Override + public void getConfig(Integer clusterId, List list) { + + } + + @Override + public void handlerServiceRoleInfo(ServiceRoleInfo serviceRoleInfo, String hostname) { + + } + + @Override + public void handlerServiceRoleCheck(ClusterServiceRoleInstanceEntity roleInstanceEntity, + Map map) { + Integer clusterId = roleInstanceEntity.getClusterId(); + + ClusterInfoEntity cluster = ProcessUtils.getClusterInfo(clusterId); + String frameCode = cluster.getClusterFrame(); + + String key = frameCode + Constants.UNDERLINE + roleInstanceEntity.getServiceName() + Constants.UNDERLINE + + roleInstanceEntity.getServiceRoleName(); + ServiceRoleInfo serviceRoleInfo = ServiceRoleMap.get(key); + ServiceInfo serviceInfo = + ServiceInfoMap.get(frameCode + Constants.UNDERLINE + roleInstanceEntity.getServiceName()); + + ActorSelection execCmdActor = ActorUtils.actorSystem.actorSelection( + "akka.tcp://datasophon@" + roleInstanceEntity.getHostname() + ":2552/user/worker/executeCmdActor"); + ExecuteCmdCommand cmdCommand = new ExecuteCmdCommand(); + ArrayList commandList = new ArrayList<>(); + commandList.add(serviceInfo.getDecompressPackageName() + Constants.SLASH + + serviceRoleInfo.getStatusRunner().getProgram()); + commandList.addAll(serviceRoleInfo.getStatusRunner().getArgs()); + cmdCommand.setCommands(commandList); + Timeout timeout = new Timeout(Duration.create(30, TimeUnit.SECONDS)); + Future execFuture = Patterns.ask(execCmdActor, cmdCommand, timeout); + try { + ExecResult execResult = (ExecResult) Await.result(execFuture, timeout.duration()); + if (execResult.getExecResult()) { + ProcessUtils.recoverAlert(roleInstanceEntity); + } else { + String alertTargetName = roleInstanceEntity.getServiceRoleName() + " Survive"; + ProcessUtils.saveAlert(roleInstanceEntity, alertTargetName, AlertLevel.EXCEPTION, "restart"); + } + } catch (Exception e) { + // save alert + String alertTargetName = roleInstanceEntity.getServiceRoleName() + " Survive"; + ProcessUtils.saveAlert(roleInstanceEntity, alertTargetName, AlertLevel.EXCEPTION, "restart"); + } + } +} diff --git a/datasophon-service/src/main/java/com/datasophon/api/strategy/ServiceRoleStrategyContext.java b/datasophon-service/src/main/java/com/datasophon/api/strategy/ServiceRoleStrategyContext.java index c3404129..40f2a0c6 100644 --- a/datasophon-service/src/main/java/com/datasophon/api/strategy/ServiceRoleStrategyContext.java +++ b/datasophon-service/src/main/java/com/datasophon/api/strategy/ServiceRoleStrategyContext.java @@ -23,7 +23,10 @@ import java.util.concurrent.ConcurrentHashMap; public class ServiceRoleStrategyContext { - + private static final ServiceRoleStrategy commonStrategy=new CommonHandlerStrategy(); + + private static final String commonServiceName="CommonService"; + private static final Map strategyMap = new ConcurrentHashMap<>(); private static final Map serviceNameMap = new ConcurrentHashMap<>(); @@ -103,13 +106,15 @@ public static ServiceRoleStrategy getServiceRoleHandler(String type) { if (StringUtils.isBlank(type)) { return null; } - return strategyMap.get(type); + ServiceRoleStrategy strategy=strategyMap.get(type); + return (strategy == null) ? commonStrategy : strategy; } public static String getServiceName(String type) { if (StringUtils.isBlank(type)) { return null; } - return serviceNameMap.get(type); + String name=serviceNameMap.get(type); + return (name == null) ? commonServiceName : name; } } From 402d106fe9d1bb560f97f3f63a0308dda9e712bd Mon Sep 17 00:00:00 2001 From: blackflash997 Date: Mon, 19 Aug 2024 15:45:33 +0800 Subject: [PATCH 2/3] no message --- .../com/datasophon/api/master/alert/ServiceRoleCheckActor.java | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/datasophon-service/src/main/java/com/datasophon/api/master/alert/ServiceRoleCheckActor.java b/datasophon-service/src/main/java/com/datasophon/api/master/alert/ServiceRoleCheckActor.java index 0df39b0f..91adb58d 100644 --- a/datasophon-service/src/main/java/com/datasophon/api/master/alert/ServiceRoleCheckActor.java +++ b/datasophon-service/src/main/java/com/datasophon/api/master/alert/ServiceRoleCheckActor.java @@ -19,7 +19,6 @@ package com.datasophon.api.master.alert; -import com.datasophon.api.master.HostCheckActor; import com.datasophon.api.service.ClusterServiceRoleInstanceService; import com.datasophon.api.strategy.ServiceRoleStrategy; import com.datasophon.api.strategy.ServiceRoleStrategyContext; @@ -42,7 +41,7 @@ public class ServiceRoleCheckActor extends UntypedActor { - private static final Logger logger = LoggerFactory.getLogger(HostCheckActor.class); + private static final Logger logger = LoggerFactory.getLogger(ServiceRoleCheckActor.class); @Override public void onReceive(Object msg) throws Throwable { From 1d399ff837ba37ce364348974afb3819516a9f0c Mon Sep 17 00:00:00 2001 From: blackflash997 Date: Mon, 19 Aug 2024 15:52:44 +0800 Subject: [PATCH 3/3] no message --- .../src/main/java/com/datasophon/api/master/ActorUtils.java | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/datasophon-service/src/main/java/com/datasophon/api/master/ActorUtils.java b/datasophon-service/src/main/java/com/datasophon/api/master/ActorUtils.java index 79e5c693..a0075913 100644 --- a/datasophon-service/src/main/java/com/datasophon/api/master/ActorUtils.java +++ b/datasophon-service/src/main/java/com/datasophon/api/master/ActorUtils.java @@ -88,7 +88,8 @@ public static void init() throws UnknownHostException, NoSuchAlgorithmException new HostCheckCommand(), actorSystem.dispatcher(), ActorRef.noSender()); - + + // 角色检测 15s 检测一次 actorSystem.scheduler().schedule( FiniteDuration.apply(15L, TimeUnit.SECONDS), FiniteDuration.apply(15L, TimeUnit.SECONDS),