服务器B挂载服务器A的磁盘,java使用默认线程池踩过的坑

我看ITIL在中国之特色的IT运维管理平台的建设

在开始筹划建设有“中国特色的IT运维管理平台”之前,先来看看我们目前面临的情况:

随着信息化建设的不断深入,各种企业的核心业务都逐步地迁移到IT平台上来,对IT管理的要求也越来越高,IT需要管理,向IT管理要效率,保证IT的有序化发展成为企业的一种共识,在这个过程中,ITIL作为最近几年IT界风头最劲的流行语,已经越来越广泛地被人们所认识和接受,并被很多企业选择作为IT管理优化和改造的首选工具,ITIL成为IT管理的一种标准,但在中国企业采用ITIL的方法来管理IT的时候,却出现了很多的问题,许多企业在落实ITIL流程化管理的过程中发现,管理的效率没有提高,宝贵的IT人力资源浪费惊人,许多管理岗位被淹没在大量的事件中,疲于应付,流程失去实质内容陷入空洞……

图片 1

所有这些都让企业感到失望和困惑,尽管ITIL拥有国外各大企业成功实践的“纯正血统”,但正如“南橘北枳”的道理一样,对他人成功的简单移植却并不一定能够确保自己的成功。根据我以往对国外各大企业的调查表明,国内企业上马ITIL的不少,但真正能够有效利用并体现其价值的却寥寥无几。为什么国外先进的管理方法在中国会遇到“水土不服”?结合之前几篇文章的分析,我认为还是要从更深的层面去看待这个问题。

之前的文章中也说到过,国外企业的管理方法形成与其所处的环境有关,所以像ITIL这样的理论落地,是在其基本功已经很扎实或者已经不会受到来自于这些层面的困扰基础上才达成的。而对于我们大多数企业来说,很多都需要自己负责整个IT基础设施及应用的管理工作,依然遵循国外的方法来建设自己的IT运维管理平台,显然会事倍功半。

在这里举些例子吧:

例子一:某次的网络故障可能会造成多个应用系统的故障,产生多个事件,由于基础设施管理的不完整、不全面,无法及时归并这些事件,就有可能产生多个工单,需要多人去处理,其实,它只是一个事件,这时,事件管理流程执行的越高效对企业造成的混乱和损失也越大。

例子二:对业务系统了解不全面,尤其是目前“云计算”的不断深化,很多的业务系统都开始运行在虚拟主机上,如果不能对这些业务进行有效的管理,不能构筑虚拟主机与实际物理主机的关系,在执行变更流程的时候,就会陷入盲目状态,造成变更失败和对其他业务的不可预测的影响。

如何解决好这些问题,如何构筑符合中国企业需要的IT运维管理平台?我认为在规划IT运维管理平台时,可以站在一个比较高的层次进行统筹规划,依据“自上而下”的设计过程,但是在建设过程中应该遵循“自下而上,先易后难”的原则,逐步搭建符合本企业实际需要的IT管理平台。

规划IT运维管理平台:自上而下,建设过程:自下而上,先易后难

由于我国的很多企业IT管理还处于建设初期,首先需要将所有的IT基础设施纳入到一个平台上,进行统一的管理,建立IT基础设施的统一管理,这是IT管理的基石,如果不能对已有的IT基础设施实施有效的透明化管理,是很难去实施其他管理的。之所以要建立统一的管理平台,一方面是今后进一步进行业务管理的需要,也是实施流程化管理的必然要求。

我国企业在落实基础设施透明化管理中,碰到的第一个现实问题就是综合管理平台的选择,用户需要采用怎样的管理系统,才能将IT基础设施的管理数据采集完整,展现在企业用户的面前?这是用户必须要考虑的问题,目前国外的大型软件都采用标准化(SNMP、RMON等等)的管理手段来管理基础设施,在国内,由于信息化经过了多年建设,采用了很多厂商的各种设备,非标的情况非常严重,即使是标准的设备,由于收集的MIB数据所表示的意义也各有不同,用户需要读懂这些数据,殊为不易。国内的一些厂商,正是看到了这样的情况,多年来坚持不懈的通过在实践中摸索和积累,屏蔽这些设备的差异性,为用户提供标准的基础设施数据,为了保护已有的IT投资,也为了更好更合理的管理这些基础设施,企业用户应该根据自己的实际情况,选择在基础设施管理上有多年实践经验的厂商的产品来搭建自己的综合管理平台,平台的管理对象应该涵盖从网络设备、主机、中间件到各种典型应用、机房环境等,只有这样才能够实现数据的紧耦合,为关联性分析和管理打下良好的基础。

以上对如何选择符合自身实际需求的IT综合管理平台,提出了些建议。那么做好基础设施的透明化管理决不是我们的终点,而是我们真正可以落实BSM、落实ITIL的起点而已。在下一篇文章里,我将最后把这个系列里的一些想法和我的经验给大家做个小结,希望真的可以帮到大家。


图片 2


在开始筹划建设有中国特色的IT运维管理平台之前,先来看看我们目前面临的情况:
随着信息…

java使用默认线程池踩过的坑(1)

场景

一个调度器,两个调度任务,分别处理两个目录下的txt文件,某个调度任务应对某些复杂问题的时候会持续特别长的时间,甚至有一直阻塞的可能。我们需要一个manager来管理这些task,当这个task的上一次执行时间距离现在超过5个调度周期的时候,就直接停掉这个线程,然后再重启它,保证两个目标目录下没有待处理的txt文件堆积。

问题

直接使用java默认的线程池调度task1和task2.由于外部txt的种种不可控原因,导致task2线程阻塞。现象就是task1和线程池调度器都正常运行着,但是task2迟迟没有动作。

当然,找到具体的阻塞原因并进行针对性解决是很重要的。但是,这种措施很可能并不能完全、彻底、全面的处理好所有未知情况。我们需要保证任务线程或者调度器的健壮性!

方案计划

线程池调度器并没有原生的针对被调度线程的业务运行状态进行监控处理的API。因为task2是阻塞在我们的业务逻辑里的,所以最好的方式是写一个TaskManager,所有的任务线程在执行任务前全部到这个TaskManager这里来注册自己。这个TaskManager就负责对于每个自己管辖范围内的task进行实时全程监控!

后面的重点就是如何处理超过5个执行周期的task了。

方案如下:

●一旦发现这个task线程,立即中止它,然后再次重启;

●一旦发现这个task线程,直接将整个pool清空并停止,重新放入这两个task
——task明确的情况下】;

方案实施

中止后重启

●Task实现类

class FileTask extends Thread { private long lastExecTime = 0; protected long interval = 10000; public long getLastExecTime() {     return lastExecTime; } public void setLastExecTime(long lastExecTime) {     this.lastExecTime = lastExecTime; } public long getInterval() {     return interval; } public void setInterval(long interval) {     this.interval = interval; }  public File[] getFiles() {     return null; } 

●Override

public void run() { while (!Thread.currentThread().isInterrupted()) { lastExecTime = System.currentTimeMillis(); System.out.println(Thread.currentThread().getName() + " is running -> " + new Date()); try { Thread.sleep(getInterval() * 6 * 1000); } catch (InterruptedException e) { Thread.currentThread().interrupt(); e.printStackTrace();    // 当线程池shutdown之后,这里就会抛出exception了             }         }     }     } 

●TaskManager

public class TaskManager  implements Runnable { private final static Log logger = LogFactory.getLog(TaskManager .class); public Set<FileTask> runners = new CopyOnWriteArraySet<FileTask>(); ExecutorService pool = Executors.newCachedThreadPool(); public void registerCodeRunnable(FileTask process) { runners.add(process); } public TaskManager (Set<FileTask> runners) { this.runners = runners; } 

@Override

public void run() {        while (!Thread.currentThread().isInterrupted()) {            try {                long current = System.currentTimeMillis();                for (FileTask wrapper : runners) {                    if (current - wrapper.getLastExecTime() > wrapper.getInterval() * 5) {                        wrapper.interrupt();                        for (File file : wrapper.getFiles()) {                            file.delete();                        }                     wrapper.start();                      }                }            } catch (Exception e1) {                logger.error("Error happens when we trying to interrupt and restart a task ");                ExceptionCollector.registerException(e1);            }            try {                Thread.sleep(500);            } catch (InterruptedException e) {            }        }    }     

这段代码会报错 java.lang.Thread
IllegalThreadStateException。为什么呢?其实这是一个很基础的问题,您应该不会像我一样马虎。查看Thread.start()的注释,
有这样一段:

It is never legal to start a thread more than once. In particular, a
thread may not be restarted once it has completed execution.

是的,一个线程不能够启动两次。那么它是怎么判断的呢?

public synchronized void start() {         /**          * A zero status value corresponds to state "NEW".    0对应的是state NEW          */ 

if (threadStatus != 0) //如果不是NEW state,就直接抛出异常!


图片 3


) 场景
一个调度器,两个调度任务,分别处理两个目录下的txt文件,某个调度任务应对某些复杂问题的时候会…

Linux学习-服务器B挂载服务器A的磁盘

环境: CentOS 7.0

1.centos中服务器B挂载服务器A的磁盘

服务器A:101,.10.0.1

服务器B:101.10.12.1

前提:保证服务器A、B都有/ifs/data/文件夹

目的:在服务器B上把服务器A的/ifs/data/文件夹挂载到自己的/ifs/data/文件夹下。

Step1.编辑服务器A的/etc/exports文件

# vi/etc/exports1

添加下列内容,让其对服务器B添加信任功能

/ifs/data 101.10.12.1 (rw,no_root_squash,no_all_squash,sync)1

输入下面命令,使配置生效

exportfs -r1

Step2.在服务器B上挂载共享磁盘

在服务器B上挂载服务器A的磁盘,输入命令:

使用mount挂载,只能当次生效,重启后无效,命令如下

mount -t nfs 101.10.0.1:/ifs/data /ifs/data1

如果想要重启后也生效,需要修改服务器B的/etc/fstab文件

vi /etc/fstab1

添加下列内容

101.10.0.1:/ifs/data /ifs/data nfs defaults 0 01

使用:wq保存退出后,可以使用mount -a命令查看是否可以成功挂载。


图片 4


环境: CentOS
7.0 1.centos中服务器B挂载服务器A的磁盘 服务器A:101,.10.0.1
服务器B:101.10.12.1 前提:保证服…

发表评论

电子邮件地址不会被公开。 必填项已用*标注