Расчет вероятности сбоя системы в распределенной сети - PullRequest
7 голосов
/ 22 июня 2010

Я пытаюсь построить математическую модель доступности файла в распределенной файловой системе.Я разместил этот вопрос в MathOverflow, но его также можно отнести к категории CS-вопросов, поэтому я тоже здесь его опишу.

Система работает следующим образом: узел хранит файл (закодированный с использованием кодов стирания) на удаленных узлах r * b, где r - коэффициент репликации, а b - целочисленная константа.У файлов с кодированием стирания есть свойство, что файл может быть восстановлен, если по крайней мере b из удаленных узлов доступны и возвращают свою часть файла.

Самый простой подход к этому состоит в предположении, что все удаленные узлынезависимы друг от друга и имеют одинаковую доступность с.С этими допущениями доступность файла следует за биномиальным распределением, то есть биномиальное распределение http://bit.ly/dyJwwE

К сожалению, эти два допущения могут привести к недопустимой ошибке, как показано в этой статье: http://deim.urv.cat/~lluis.pamies/uploads/Main/icpp09-paper.pdf.

Один из способов преодолеть предположение о том, что все узлы имеют одинаковую доступность, состоит в том, чтобы рассчитать вероятность каждой возможной комбинации доступного / недоступного узла и взять сумму всех этих результатов (что-то вроде того, что они предлагают в статье.выше, просто более формально, чем то, что я только что описал).Вы можете увидеть этот подход как двоичное дерево с глубиной r * b, и каждый отпуск является одной из возможных комбинаций доступных / недоступных узлов.Доступность файла - это то же самое, что и вероятность того, что вы получите отпуск с> = b доступными узлами.Этот подход является более правильным, но он требует вычислительных затрат Ordo http://bit.ly/cEZcAP. Кроме того, он не имеет отношения к предположению о независимости узла.

У вас, ребята, есть идеи хорошего приближения, которое вводитменьше ошибок, чем в случае биномиального распределения-распределения, но с лучшими вычислительными затратами, чем http://bit.ly/d52MM9 http://bit.ly/cEZcAP?

Можно предположить, что данные о доступности каждого узла представляют собой набор кортежей, состоящий из (measurement-date, node measuring, node being measured, succes/failure-bit),С помощью этих данных вы можете, например, рассчитать корреляцию доступности между узлами и дисперсии доступности.

Ответы [ 2 ]

5 голосов
/ 28 июня 2010

Для больших r и b вы можете использовать метод, называемый интеграцией Монте-Карло, см., Например, интеграцию Монте-Карло в Википедии (и / или главу 3.1.2 SICP) для вычислениясумма.Для малых r и b и значительно различных вероятностей отказа узла p[i] точный метод является лучшим.Точное определение small и large будет зависеть от нескольких факторов, и его лучше всего опробовать экспериментально.

Конкретный пример кода : Этоэто очень простой пример кода (на Python), демонстрирующий, как такая процедура может работать:

def montecarlo(p, rb, N):
    """Corresponds to the binomial coefficient formula."""
    import random
    succ = 0

    # Run N samples
    for i in xrange(N):
        # Generate a single test case
        alivenum = 0
        for j in xrange(rb):
            if random.random()<p: alivenum += 1
        # If the test case succeeds, increase succ
        if alivenum >= b: succ += 1
    # The final result is the number of successful cases/number of total cases
    # (I.e., a probability between 0 and 1)
    return float(succ)/N

Функция соответствует биномиальному тестовому сценарию и запускает N тесты, проверяя, если b выводит узлыr*b узлы живы с вероятностью отказа p.Несколько экспериментов убедят вас, что вам нужны значения N в диапазоне тысяч образцов, прежде чем вы сможете получить какие-либо разумные результаты, но в принципе сложность составляет O(N*r*b).Точность результата масштабируется как sqrt(N), т. Е. Чтобы повысить точность в два раза, нужно увеличить N в четыре раза.Для достаточно больших r*b этот метод будет явно лучше.

Расширение аппроксимации : вам, очевидно, нужно спроектировать тестовый пример такой, чтобы он учитывал все свойства системы.Вы предложили несколько расширений, некоторые из которых могут быть легко реализованы, а другие - нет.Позвольте дать вам пару советов:

1) В случае отличного, но некоррелированного p[i] изменения приведенного выше кода минимальны: в заголовке функции вы передаете массив вместо одного плавающего числаp и вы замените строку if random.random()<p: alivenum += 1 на

if random.random()<p[j]: alivenum += 1

2) В случае коррелированного p[i] вам потребуется дополнительная информация о системе.Ситуация, на которую я ссылался в моем комментарии, могла быть такой:

A--B--C
   |  |
   D  E
   |
   F--G--H
      |
      J

В этом случае A может быть «корневым узлом», а сбой узла D может означать автоматическийотказ со 100% вероятностью узлов F, G, H и J;в то время как отказ узла F автоматически приведет к отключению G, H и J и т. д. По крайней мере, это был тот случай, о котором я говорил в своем комментарии (это правдоподобная интерпретация, поскольку вы говорите о дереве).структура вероятностей в исходном вопросе).В такой ситуации вам потребуется изменить код, который p относится к древовидной структуре, а for j in ... пересекает дерево, пропуская нижние ветви текущего узла, как только тест не пройден.Конечно, итоговый тест все равно будет alivenum >= b, как и раньше.

3) Этот подход потерпит неудачу, если сеть представляет собой циклический граф, который не может быть представлен древовидной структурой.В таком случае вам нужно сначала создать узлы графа, которые либо мертвы, либо живы, а затем запустить алгоритм маршрутизации на графе для подсчета количества уникальных, достижимых узлов.Это не увеличит временную сложность алгоритма, но, очевидно, сложность кода.

4) Зависимость от времени является нетривиальной, но возможной модификацией, если вы знаете mtbf / r (среднее времямежду отказами / ремонтами), поскольку это может дать вам вероятности p древовидной структуры или некоррелированной линейной p[i] в виде суммы экспонент.Затем вам придется запускать процедуру MC в разное время с соответствующими результатами для p.

5) Если у вас просто есть файлы журналов (как указано в вашем последнем абзаце), это потребует существенногомодификация подхода, который выходит за рамки того, что я могу сделать на этой доске.Лог-файлы должны быть достаточно тщательными, чтобы позволить реконструировать модель для графа сети (и, следовательно, графа p), а также отдельных значений всех узлов p.В противном случае точность была бы ненадежной.Эти лог-файлы также должны быть значительно длиннее, чем временные масштабы сбоев и ремонтов, предположения, которые могут быть нереальными в реальных сетях.

2 голосов
/ 30 июня 2010

Предполагая, что каждый узел имеет постоянный, известный и независимый уровень доступности, на ум приходит подход «разделяй и властвуй».

Скажем, у вас есть N узлы.

  1. Разделите их на два набора N/2 узлов.
  2. Для каждой стороны вычислите вероятность того, что любое количество узлов ([0,N/2]) не работает.
  3. Умножьте и сложите их по мере необходимости, чтобы найти вероятность того, что какое-либо число ([0,N]) из полного набора упало.

Шаг 2 может быть выполнен рекурсивно, и на верхнем уровне вы можете суммировать по мере необходимости, чтобы выяснить, как часто падает больше, чем какое-то число.

Я не знаю, насколько это сложно, но если я угадаю, я бы сказал, что на уровне или ниже O(n^2 log n)


Механика этого может быть проиллюстрирована на корпусе терминала. Скажем, у нас есть 5 узлов с временем работы p1...p5. Мы можем разделить это на сегменты A с p1...p2 и B с p3...p5. Затем мы можем обработать их, чтобы найти время «N узлов вверх» для каждого сегмента:

Для A:

a_2

a_1

a_0

Для B:

b_3

b_2

Окончательные результаты для этого этапа можно найти, умножив каждое из a на каждое из b и суммировав соответствующим образом.

v[0] = a[0]*b[0]
v[1] = a[1]*b[0] + a[0]*b[1]
v[2] = a[2]*b[0] + a[1]*b[1] + a[0]*b[2]
v[3] =             a[2]*b[1] + a[1]*b[2] + a[0]*b[3]
v[4] =                         a[2]*b[2] + a[1]*b[3]
v[5] =                                     a[2]*b[3]
...