首页 集群中服务器的状态监测和通知

集群中服务器的状态监测和通知

举报
开通vip

集群中服务器的状态监测和通知 集群中服务器的状态监测和通知 浏览次数: 1164 时间:2003-12-19       作者:     不同的方法,不同的优点 如果你只有一台独立的服务器,也就是说其既是Admin Server又是被管理的服务器,将会有什么情况发生呢?或者,Admin Server本身失去了响应能力将会怎样呢?当它们失去响应能力的时候,如何通知相关人员呢? “这很糟糕。为什么服务器会挂起呢?而且在那之后,为什么我们这么迟才得知这个情况?”当Bob听到...

集群中服务器的状态监测和通知
集群中服务器的状态监测和通知 浏览次数: 1164 时间:2003-12-19       作者:     不同的方法,不同的优点 如果你只有一台独立的服务器,也就是说其既是Admin Server又是被管理的服务器,将会有什么情况发生呢?或者,Admin Server本身失去了响应能力将会怎样呢?当它们失去响应能力的时候,如何通知相关人员呢? “这很糟糕。为什么服务器会挂起呢?而且在那之后,为什么我们这么迟才得知这个情况?”当Bob听到老板对他这样说的时候,他知道了下一步该做些什么。老板将会要求他和Weblogic的支持人员共同研究这个问题,他们将会帮助他针对服务器在运行过程中为何停止响应以及如何停止响应作一个事后的故障分析。也许这一次Bob需要了解的更多,并且制定出一个能够自动检查服务器状态的 方案 气瓶 现场处置方案 .pdf气瓶 现场处置方案 .doc见习基地管理方案.doc关于群访事件的化解方案建筑工地扬尘治理专项方案下载 。 我经常会遇到这样的情况:客户希望能够监视运行在集群中的服务器的状态。更理想的情形是:状态通知应该有条件地产生。大多数用于生产的系统运行在服务器集群之上,如果你运行一个这样的集群,当一台服务器失去响应的时候,故障切换就能马上出现。在你的应用程序继续运行期间,将会由其他的服务器为你提供响应。但是,作为管理员你应该马上知道这件事,并且采取修正措施。再问一遍老问题,如果你有一台独立的服务器,比如说其既是管理服务器又是被管理务器的Admin Server,将会有什么情况发生呢?或者,Admin Server本身失去了响应能力将会怎样呢?当它们失去响应能力的时候,如何通知相关人员呢? 这些问题的答案可能在WebLogic内部,也可能来自它的外部(意思是不采用任何针对WebLogic的工具)。 外部的解决方案可能是两者中相对简单的,比如使用WebLogic ping工具,当它发现服务器正在运行时就返回一个成功的结果,否则会返回一个java.net.ConnectException。除此之外,还特别依赖于操作系统脚本(当然也包括网络)来进行工作。内部的方案深入到了WebLogic内核,例如使用SNMP和Mbeans,尤其是ClusterMBeans。 现在就让我们研究一下简单的方案。我们的测试案例是这样的:我们运行着x台服务器实例(它们没必要在一个集群中)。当他们中的任何一个失去响应能力或者荡机的时候,我们希望得到通知。你所需要做的就是逐步执行以下步骤: 设置环境,使针对WebLogic的类存在于类路径中。 向weblogic.Admin ping工具中输入所有正在运行的服务器实例的主机地址:端口号。 循环不断地ping所有已经输入的服务器实例(主机地址:端口号)。 在脚本中为ping命令指定一个时间间隔,使得在执行完每个服务器实例的ping命令后,有一段休息时间。 当检测到ConnectException(连接异常)时发送E-mail。 在清单1中给出了在Solaris 5.6的Bourne外壳上运行的一个该工具的简化版本。 你需要做的所有工作就是运行清单1中的脚本,当任何服务器荡机或是失去响应的时候,它将通过e-mail通知你。 在我们讲述Mbean方式之前,简短概括一下集群中的WebLogic服务器实例检测其他对等服务器故障的过程将会很有帮助。 这里讲述的一些信息来自WebLogic文档。详细情况可以参见位于的关于集群的详细信息。 服务器实例监视以下内容: 和对等服务器的套接字连接 定期的服务器“心跳”消息 使用IP套接字探测故障 WebLogic服务器监测对等服务器实例之间IP套接字的使用情况,把这作为一种探测故障的直接方法。如果服务器连接到集群中的另一个对等服务器并且开始通过套接字传输数据,该套接字的意外关闭将会导致把对应的服务器标记为“故障”,而且它的相关服务将会被从JNDI名称树中删除。 WebLogic服务器“心跳” 如果集群服务器实例不含有为端到端通信服务而打开的套接字,出现故障的服务器还可能通过WebLogic服务器的“心跳”被探测到。集群中的所有服务器实例都使用多点传送的方式来广播定期的服务器“心跳”消息到集群中的其他服务器。每个服务器心跳包含了唯一的信息,用来标识发送它的服务器。服务器每隔10秒钟广播一次它们的心跳消息。接着,集群中的每一个服务器都监测广播地址,从而确认所有的对等服务器的心跳消息都发送出来了。 如果一个服务器监测到广播地址中缺少了一个对等服务器的三次心跳(例如,它已经30秒或者更长时间没有收到该服务器的心跳了),那么监控服务器就把该对等服务器标记为“故障”。接着,它会更新它的本地JNDI树,如果有必要,会取消掉驻留在出现故障的服务器中的服务。 这样,即使没有为端到端的通信打开的套接字,服务器仍然能够监测到故障。 在我们的例子中,每个服务器中AliveServerCount的值将会是一个更新过的列表,该列表包含了处于活动状态的服务器,它们也存在于服务器的集群jndi列表中。 下一个方案(如果你不想使用外壳脚本并支持非unix的平台)将使用WebLogic APIs生成陷阱,并且使用Java mail API生成通知。换句话说,就是作了下面这些事情: ● 生成一个参数列表,其中含有为Admin Server准备的参数,包括主机地址:端口、用户名、密码,参与集群的服务器的数量,可接受的生成e-mail的延迟间隔。这个参数列表将会被Java程序使用。 ● 通过传入这些特定的属性获得Admin MbeanHome。 ● 如果无法找到Admin home,就生成一个合适的错误消息。 ● 使用Admin MbeanHome来获得ClusterRunTime Mbean并且对其进行遍历,从而取得服务器的名称。 ● 检查处于活动状态的服务器的总数是否比作为参数传入Java程序的服务器的总数少。 ● 如果计数少于传入的参数,生成适当的字符串作为e-mail的内容。 ● 在SMTP(不要混淆为SNMP,前者是简单邮件传输协议,后者是简单网络管理协议)服务器指定的地址上生成一封e-mail。 清单2是这个方案的关键。 SNMP(简单网络管理协议)模型 现在,开始讲述我建议的第三种方法:使用SNMP模型。 WebLogic服务器软件具备了使用简单网络传输协议和行业范围的管理系统进行通信的能力。WebLogic服务器的SNMP能力使你能够把WebLogic服务器的管理集成到一个兼容SNMP的管理系统中,这个系统将会为你提供一个统一的界面来察看复杂分布式系统中各种各样的软件和硬件资源。 接下来的定义可以帮助我们得出一个关于集群监测的实用场景,而且,这些定义部分来自WebLogic文档。 SNMP管理建立在代理/管理器(agent/manager)模型之上,该模型是由国际 标准 excel标准偏差excel标准偏差函数exl标准差函数国标检验抽样标准表免费下载红头文件格式标准下载 化组织(International Organization for Standardization ,ISO)在网络管理标准中描述的。在该模型中,网络/系统管理器与被称为代理的分布式软件进程交换关于网络资源的监测和控制信息。在我们的例子中,SNMP代理是WebLogic的Admin Server。为了说明SNMP管理器,我使用名为“Trap Receiver”的可免费下载的第三方软件来作为例子。 任何可以通过信息交换来控制的系统和网络资源都被称为被管理资源(managed resource)。它可能是一个像JDBC连接池一样的软件资源,或者可能是一个像路由器一样的硬件资源。在我们的例子中,我们监控的是ClusterRuntime。 基本的思路是:充当SNMP 代理的WebLogic Admin server将扮演一个“收集装置”的角色,用来收集和发送被管理资源的信息,比如ClusterRuntime。 这一目标将会通过为ClusterRuntime的所有特定属性设置阈值(指的是监控器)来实现。本例中我们监控ClusterRuntime的AliveServerCount属性。假定集群中的服务器总数是三个,如果任何一个失去了响应,那么AliveServerCount的值将会减少为2,并且一个陷阱通知将会被发送到SNMP管理器,随后,SNMP管理器将会生成一封e-mail。 Trap Receiver依赖于一个数据库,该数据库中包含了关于被管理资源和代理所支持的服务的属性的定义和描述,这就构成了管理信息库(Management Information Base ,MIB)。本例中,MIB可以在WEBLOGIC_HOME/lib/ BEA-WEBLOGIC-MIB.asn1(参见图1)下面找到。(关于SNMP管理的更多信息,请访问)。 下面是建立我们的故障通知模型所需的基本步骤: 配置SNMP代理 配置SNMP管理器 配置SNMP代理 我们例子中的SNMP代理将会是WebLogic Admin Server。开始之前,假定我们已经在集群上运行着三台被管理服务器——managedserver1, managedserver2, managedserver3——分别在不同的ip地址,但是在相同的端口上监听它们。 操作步骤如下: ● 启动WebLogic的admin server后,进入WebLogic6.1 Admin的浏览器控制台。 ● 点击左侧控制栏中的Trap Destinations节点。 ● 输入适当的值(参见图2) ● 展开SNMP节点之后点击左侧控制栏中的Trap Destinations节点。 ● 点击左侧控制栏中的domain name,并且选择SNMP选项卡。 ● 确定选中了Enabled复选框。 ● 选择前面步骤中配置好的Trap Destination作为目标。 ● 默认的Mib数据刷新间隔是120秒,最小可以设为30秒。Mib数据刷新间隔表示SNMP代理完全刷新一次缓冲区的间隔,它以秒为计量单位。这个值最终会确定数据的刷新情况;在我们的例子中,从最后一次对处于活动状态的服务器数量进行检查的时间开始计算。降低这个值可能会明显地影响性能。 ● 如果希望使用Weblogic服务器荡机时生成的默认陷阱(OID 1.3.6.1.4.1.140.625.100.70,在SNMP代理部分做了详细解释),就不需要再进行下面的SNMP代理配置,可直接跳至“配置SNMP管理器” ● 展开左侧控制栏中Monitors节点。 ● 点击右侧控制栏中的“Configure a new gauge monitor”。 ● 输入图3中所示的值。 各个值代表的含义可以通过点击每个参数对应的“?”进行察看。 在这个例子中,我们将会创建三个这样的monitor:MyGaugeMonitor1, MyGaugeMonitor2, and MyGaugeMonitor3。你需要分别用被管理服务器的名字来代替每一个被管理的Mbean的名字。思路如下:当任何服务器的AliveServerCount值变成2或是低于2的时候,SNMP代理就会生成一个陷阱。当liveServerCount的值变成3或是高于3的时候,它也会生成一个陷阱,但是,在这个特殊例子中不需要该信息。你需要通过点击“apply”使所作的修改生效,并且选择“Servers Tab”来分别将各个服务器指定为目标。 配置SNMP管理器 如同前面提到的,我使用一个第三方的工具。可以从www.ncomtech.com/download.htm免费下载它。我选择了"Trap Receiver for NT/2000",因为我想要该工具安装在我的本地Windows 2000上面。针对各种属性的详细帮助请参见www.ncomtech.com/trmanual.html。接下来的步骤是安装之后快速配置SNMP服务器所必需的: ● 选择“MIBs”选项卡,点击Load,然后选择针对WebLogic的MIBs位置,例如WEBLOGIC_HOME/lib/BEA-WEBLOGIC-MIB.asn1。 ● 选择Actions选项卡,点击Add,然后从Watch下拉菜单中选择Varbind OID。 ● 在Equals栏中为trap填写真实的MIB值。 在我们的例子中,这个值将会是1.3.6.1.4.1.140.625.100.75。其中,1.3.6.1.4.1.140.625代表我们所用的WLS6.1实例的企业供应商标识(OID)。后面的75代表我们感兴趣的Monitor Trap。当达到这个值的时候我们希望生成一个e-mail,所以请在复选框选中e-mail这个选项。 ● 值的说明的是:如果我们希望通过使用默认的WebLogic traps来确保通知,我们就没有必要生成一个单独的monitor了。一些预定义好的WebLogic SNMP traps将会被自动生成。例如,服务器的启动陷阱编号是65,关闭陷阱编号是70。那么完整的Varbind OID将会分别是1.3.6.1.4.1.140.625.100.65 和1.3.6.1.4.1.140.625.100.70。如果我们不想执行创建单独monitor的步骤(图3中的MyGaugeMonitor1),我们需要做的仅仅是在前面的步骤中用1.3.6.1.4.1.140.625.100.70代替1.3.6.1.4.1.140.625.100.75。我发现在使用用户自定义的MyGaugeMonitor1的时候,尽管在关闭陷阱生成之前需要一段时间,但是陷阱通知几乎是与模拟挂机同时发出的。然而,这个例子的不足之处在于:当达到陷阱条件的时候,将要产生的e-mail的个数会依赖于建立了monitor的服务器个数与挂机的服务器个数的差。(在本例中,3 -1 =2) ● 在这里我们还使用了counter monitor,在其中只需给定一个阈值。 但是,这仅仅是值等于或是超出阈值的情况。使用Gauge monitor的好处在于:在服务器重启之后,以及达到上限值之后,计数器(counter)将会被重置。 ● 最后要做的是配置e-mail选项。选择“e-mail”选项卡并且为你的SMTP服务器输入适当的值。在消息框中,你可能想要给出这样的信息“启动/关闭/挂起,接收到从%SENDERIP%来的类型是%GENERICTYPE%/%SPECIFICTYPE%的陷阱。” 测试SNMP配置 现在,我们全都准备好了。当所有的三个服务器启动并且运转的时候,gauge的高值被达到了。这将会生成一封e-mail通知,但是,这对我们来说并不重要。我们想要的是:当服务器失去响应或是荡机的时候能够得到通知。关闭一个被管理服务器的实例将会再次生成一个陷阱,而且,既然AliveServerCount的值变成了2,那么将会生成陷阱,从而使e-mail通知能够发出。如果创建了非用户自定义的monitor并且使用了默认的OID,仍然应该得到通知。使用用户自定义monitor的目的是为了说明Mbeans和monitors的用法。 小结 这里给出的所有选择都有各自不同的优点。使用WebLogic ping工具产生的额外开销,远不会影响我们关心的WebLogic服务器性能,但是,当使用SNMP陷阱的时候,如果取样周期缩短就可能会有微小的性能影响。 另一方面,在第一种方法中,如果你想按照现在的样子使用外壳脚本(参见清单1),将会有利于Unix平台。但是,你将不会获得实时信息,而且将会分得一份单独CPU使用率。倘若代码中的sleep被除去,emailServersRunningInCluster.java(参见清单2)就能够作为cron job(工作流程)被安置于Unix平台,并且利用WebLogic指定的API’s。如果WebLogic指定的类存在于类路径(classpath)中,就可以在任何地方运行纯Java程序。这将再一次分得CPU的使用率。第三个选择,也就是使用SNMP管理器,除了通过构造OIDs和创建独立的monitor来捕获AliveServerCount,该方案也能够被用来捕获其他陷阱。Java程序就不能被如此使用,如果想要监测其他的Mbean,需要对代码作出大的改动。 结果,失去响应能力的服务器的Java进程id将会被当作一个ConnectException或是AliveServerCount荡机而被捕获,而且,会自动调用一个脚本对基于Unix的平台执行kill –3操作,从而获得线程日志(Thread Dump)来支持分析工作。 清单 1 #!/bin/sh# 502br> ## This script can be used to see if the server is alive of dead, and take actions like# sending an email when it sees a server is unresponsive.# This utilizes the setEnv.sh script under your WebLogic Home/config/domain_name and has# been tested in Bourne shell on Solaris# It requires you to pass the urls for each instance of the server that has been running# and would send out an email incase it receives a ConnectException# NO_OF_SERVERS The number of urls submitted to the script# setEnv.sh The default script that ships with weblogic# PING_INTERVAL The time interval in which the servers are pinged# Example: . serverMonitor.sh t3://mountview:7071 t3://hardie:7001 t3://mountview1:7060# Initialize the value to 5 minsPING_INTERVAL=5usage(){echo 'Usage: . serverMonitor.sh [URL_SERVER1] [URL_SERVER2] [URL_SERVER3].....'echo "for example:"echo '. serverMonitor.sh t3://localhost:7001 t3://localhost:8001 t3://server_host:9001'exit}#Run the setEnv.sh which will set the WL_HOME, JAVA_HOME and the CLASSPATH. setEnv.sh > /dev/null# Check that script is being run from the appropriate directoryif [ ! -f setEnv.sh ]; thenecho "serverMonitor.sh: must be run from the config/mydomain directory where setEnv.sh resides." 1>&2Check for classeselif [ ! -f /lib/weblogic.jar ]; thenecho "The weblogic.jar file was not found in directory /lib." 1>&2Check for JDKelif [ ! -f /bin/javac ]; thenecho "The JDK wasn't found in directory ." 1>&2else#Check if the URLs have been passed to the script...atleast one url has to be passedif [ = 0 ]; thenusagefi#Loop infinitely for pinging the servers running at the urls passed to see if they stopped/or are unresponsivewhile truedofor NO_OF_SERVERS in "";dojava weblogic.Admin -url PING 1 1>var.sh 2>&1if cat var.sh|grep ConnectException > /dev/nullthenecho stopped responding|mail yourmail.comfidonesleep donefi清单 2 import javax.mail.*;import javax.mail.internet.*;import java.util.*;import java.rmi.RemoteException;import javax.naming.*;import weblogic.jndi.Environment;import weblogic.management.MBeanHome;import javax.management.ObjectName;import weblogic.management.WebLogicMBean;import weblogic.management.runtime.ClusterRuntimeMBean;import weblogic.management.WebLogicObjectName;import weblogic.management.MBeanHome;public class emailServersRunningInCluster {/*** "main" method does the look up for the weblogic adminhome and gets the concerned MBean* to find if the number of active servers are less than specified and send out an email*/public static void main(String[] args) throws InterruptedException{//mail specific informationString smtpServer="abc.xyzsys.com";String to="hello.com";String from=" hello.com";String subject="Server Unresponsive/Stopped";String body="Please note that atleast one of the servers in the cluster is down";MBeanHome home = null;if (args.length<5){System.out.println("Usage is t3://hostname:port username password no_of_servers_in_cluster delay_in_seconds");System.exit(0);}System.out.println("Make sure that you have started all the servers in the cluster before running this program");//Build the Admin propertiesString url = args[0];String username = args[1];String password = args[2];final int MAX_SERVERS_IN_CLUSTER = Integer.valueOf(args[3]).intValue();int delay = (Integer.valueOf(args[4]).intValue())*1000;ClusterRuntimeMBean clusterRuntime = null;String serverlist = null;Set mbeanSet = null;Iterator mbeanIterator = null;String name = "";String[] aliveServerArray = new String[MAX_SERVERS_IN_CLUSTER];while (true){try {Environment env = new Environment();env.setProviderUrl(url);env.setSecurityPrincipal(username);env.setSecurityCredentials(password);Context ctx = env.getInitialContext();home = (MBeanHome) ctx.lookup("weblogic.management.adminhome");} catch (CommunicationException ce) {System.out.println("Please make sure that your admin server is up and running at "+url);System.out.println("Exception caught: " + ce);} catch (AuthenticationException ae){System.out.println("Please make sure that user " + username + "is authorized to access and is passing the correct password");System.out.println("Exception caught: " + ae);} catch (Exception e) {System.out.println("Exception caught: " + e);}try {mbeanSet = home.getMBeansByType("ClusterRuntime");mbeanIterator = mbeanSet.iterator();while(mbeanIterator.hasNext()) {clusterRuntime = (ClusterRuntimeMBean)mbeanIterator.next();name = clusterRuntime.getName();aliveServerArray = clusterRuntime.getServerNames();serverlist= aliveServerArray[0];}} catch (Exception e) {System.out.println("Caught exception: " + e);}if (clusterRuntime.getAliveServerCount() < MAX_SERVERS_IN_CLUSTER){for (int i=1; i < aliveServerArray.length; i++)serverlist=serverlist+" "+aliveServerArray[i];body = "At least one server is down out of "+MAX_SERVERS_IN_CLUSTER+" servers.The running servers in the cluster are:" + serverlist;send(smtpServer, to, from, subject, body);System.out.println("Exiting after sending email...");break;}Thread.sleep(delay);}// End while}//End main/*** "send" method implementation for sending the message.*/public static void send(String smtpServer, String to, String from, String subject, String body){try{Properties props = System.getProperties();// -- Attaching to default Session, or we could start a new one --props.put("mail.smtp.host", smtpServer);Session session = Session.getDefaultInstance(props, null);// -- Create a new message --Message msg = new MimeMessage(session);// -- Set the FROM and TO fields --msg.setFrom(new InternetAddress(from));msg.setRecipients(Message.RecipientType.TO,InternetAddress.parse(to, false));// -- Set the subject and body text --msg.setSubject(subject);msg.setText(body);// -- Set some other header information --msg.setHeader("X-Mailer", "BEAEmail");msg.setSentDate(new Date());// -- Send the message --Transport.send(msg);System.out.println("The email has been sent notifying the failure to " + to);}catch (Exception ex){ex.printStackTrace();}}//End send}// End Class   关于作者: Apurb Kumar是BEA Systems公司Backline WebLogic Support组内的一位开发人员关系协调工程师。他具有超过10年的行业经验,从一开始的实时程序 设计 领导形象设计圆作业设计ao工艺污水处理厂设计附属工程施工组织设计清扫机器人结构设计 到数据库,再到最后的Java开发。在来到BEA Systems之前,Apurb为诸如Charles Schwab,AllAdvantage.com,和Holland Systems这样的公司提供咨询服务。        
本文档为【集群中服务器的状态监测和通知】,请使用软件OFFICE或WPS软件打开。作品中的文字与图均可以修改和编辑, 图片更改请在作品中右键图片并更换,文字修改请直接点击文字进行修改,也可以新增和删除文档中的内容。
该文档来自用户分享,如有侵权行为请发邮件ishare@vip.sina.com联系网站客服,我们会及时删除。
[版权声明] 本站所有资料为用户分享产生,若发现您的权利被侵害,请联系客服邮件isharekefu@iask.cn,我们尽快处理。
本作品所展示的图片、画像、字体、音乐的版权可能需版权方额外授权,请谨慎使用。
网站提供的党政主题相关内容(国旗、国徽、党徽..)目的在于配合国家政策宣传,仅限个人学习分享使用,禁止用于任何广告和商用目的。
下载需要: 免费 已有0 人下载
最新资料
资料动态
专题动态
is_003124
暂无简介~
格式:doc
大小:19KB
软件:Word
页数:0
分类:互联网
上传时间:2019-08-21
浏览量:7