1

誰かがこの種の問題に対処し、アドバイスを提供できるかどうか疑問に思います:

ログファイルを解析して、ホストに障害が発生しているかどうか、いつ障害が発生しているか、およびホストの合計ダウンタイムを確認しています。私の問題は、ホストが別の倒れたホストの時間枠内にあるかどうかを把握する方法がわからないことです(2回カウントしたくない)

例:

ホストAは14:15-14:18に落ちます

ホストBは14:16-14:21に落ちます

ホストCは14:17-14:20に落ちます

これにより、

3分のダウンタイムを占めるホストA

ホストBを3分間

0のホストC(他のホストはその時点ですでにダウンしていた)

現在、私は配列upTime:downTimeにプッシュしています-配列をウォークスルーして比較するのが最も簡単だと思いました。しかし、この問題に取り組むための最善の方法が何であるかはわかりません。

                push(@arr, "$tempdown:$upTime"); 
        }
    }
}   
}


#temp vars x and y rep downtime and uptime
#count from x..y and see if any other service has fallen within x-y
for my $index (@arr) {
my $tempx;
my $tempy;
if ($index=~/(.*):/ && /($index=~(.*:(.*)/) {
    $tempx = $1;
    $tempy = $2;
}
for ($tempx..$tempy) {
.
.
.
4

2 に答える 2

1

データを次のように整理する必要があるように思われます。

  • T s —ダウンタイムの期間の開始時間。
  • T e —ダウンタイム期間の終了時間。
  • H t —一定期間のダウンタイムに対して「責任がある」ホスト。

ダウンタイムの期間をTの順に並べ替えることができます。2台(またはそれ以上)のマシンが同時にダウンタイムの期間を開始するという関係を解決するメカニズムが必要になります(時間が記録される解決策に従って)。さらに下に、2次キーは最新のT eであり、3次キーはホスト名のアルファベット順であることをお勧めします。

次に、ダウン期間の順序付きリストをTsでステップスルーできます

ダウンタイムの各期間について:

  • H tは、ダウンしている間ずっと責任を負います。
  • T eの前に開始するダウンタイムの各期間について:
    • 他のホストのダウンタイムから期間Ts..Teを減算します。
  • 次の反復のためにデータを並べ替えます。

サンプルデータが与えられると、次のようになります。

  • T s = 14:15、T e = 14:18、H t = A
  • T s = 14:16、T e = 14:21、H t = B
  • T s = 14:17、T e = 14:20、H t = C

これは正しいソート順です。同時にダウンタイムのあるホストはアルファベット順にソートされていると想定します。

アルゴリズムはAを選択します。

  • ホストAは14:15-14:18(3分)のせいにされます。

他のホストの期間は調整されます:

  • T s = 14:18、T e = 14:21、H t = B
  • T s = 14:18、T e = 14:20、H t = C

アルゴリズムはBを選択します

  • ホストBは14:18-14:21(3分)非難されます。

他のホストの期間が調整され、残りの時間はホストBのダウンタイムによって完全にカバーされるため、ホストCのレコードは消去されます。

タイブレーカーの順序付けが非常に重要であることがわかります。2回目の反復では、システムBとCの両方がダウンしており、Aが回復した後、どちらがダウンタイムの原因であるかを判断する方法が必要です。基準の1つが「最初にダウンしたホスト」であると判断する場合もあるので、サーバーが最初にダウンしたときのTdの記録を保持します。これはアルゴリズム中には変更されませんが、アルゴリズムが進むにつれてTsが調整されます。また、注文の一部が'最新のTeであると判断する場合もあります。'常に最も長くダウンしているマシンがダウンしているときに停止の責任を負い、以前にダウンしていたシステムがまだダウンしていないようにします。つまり、Aも14:19-14:30にダウンした場合、14:18-14:21の責任は負いませんが、14:21-14:30の責任は負います。

于 2012-07-01T22:36:20.113 に答える
1

YYYY-MM-DD HH:MMのようなものではなく、時間に時間:分しかない場合、コードは注意が必要です。その間、それは明確に解析される可能性があります。ロガーの出力を変更して完全に修飾された日付を指定できれば、作業がはるかに簡単になります。以下のコードはそれを行います。(免責事項:開始時刻は時系列である必要があります。そうでない場合は、最初に並べ替える必要があります)。

(注:このデータでは、時間区切り記号を「-」から「\ t」に変更しました)

#!/usr/bin/perl
use strict;
use warnings;
use DateTime::Format::Strptime;

my $re = '(\S{10}\s\S{5})\t(\S{10}\s\S{5})$';
my $max;
my $parser = DateTime::Format::Strptime->new(pattern => '%F %H:%M');

while (<DATA>) {
    chomp;
    my ($start, $stop) = /$re/ or die $!;

    $_ = $parser->parse_datetime($_) for $start, $stop;

    # one time initialization of $max for first record
    $max //= $start;

    # when there are breaks in the continuity
    $max = $start if $max < $start;

    my $minutes = $stop <= $max ? 0 : $max->delta_ms($stop)->in_units('minutes');

    printf "$_ %2d minutes\n", $minutes;
    $max = $stop if $max < $stop; # stop is the new max if stop > max
}

__DATA__
Host A fails at 2012-07-03 14:15    2012-07-03 14:18
Host B fails at 2012-07-03 14:16    2012-07-03 14:21
Host C fails at 2012-07-03 14:17    2012-07-03 14:20
Host D fails at 2012-07-03 23:57    2012-07-04 00:05
Host E fails at 2012-07-03 23:58    2012-07-04 00:07
Host F fails at 2012-07-04 00:00    2012-07-04 00:08
Host G fails at 2012-07-04 00:01    2012-07-04 00:09
Host H fails at 2012-07-04 00:02    2012-07-04 00:08
Host I fails at 2012-07-04 14:17    2012-07-04 14:20
Host J fails at 2012-07-04 23:57    2012-07-04 23:59
Host K fails at 2012-07-05 00:00    2012-07-05 00:10
Host L fails at 2012-07-05 00:02    2012-07-05 00:09
Host M fails at 2012-07-05 00:02    2012-07-05 00:11
Host N fails at 2012-07-05 00:02    2012-07-05 00:10

次の出力が生成されました。

Host A fails at 2012-07-03 14:15        2012-07-03 14:18  3 minutes
Host B fails at 2012-07-03 14:16        2012-07-03 14:21  3 minutes
Host C fails at 2012-07-03 14:17        2012-07-03 14:20  0 minutes
Host D fails at 2012-07-03 23:57        2012-07-04 00:05  8 minutes
Host E fails at 2012-07-03 23:58        2012-07-04 00:07  2 minutes
Host F fails at 2012-07-04 00:00        2012-07-04 00:08  1 minutes
Host G fails at 2012-07-04 00:01        2012-07-04 00:09  1 minutes
Host H fails at 2012-07-04 00:02        2012-07-04 00:08  0 minutes
Host I fails at 2012-07-04 14:17        2012-07-04 14:20  3 minutes
Host J fails at 2012-07-04 23:57        2012-07-04 23:59  2 minutes
Host K fails at 2012-07-05 00:00        2012-07-05 00:10 10 minutes
Host L fails at 2012-07-05 00:02        2012-07-05 00:09  0 minutes
Host M fails at 2012-07-05 00:02        2012-07-05 00:11  1 minutes
Host N fails at 2012-07-05 00:02        2012-07-05 00:10  0 minutes

これがお役に立てば幸いです。

クリス

于 2012-07-04T16:02:31.253 に答える