Главная
Блог разработчиков phpBB
 
+ 17 предустановленных модов
+ SEO-оптимизация форума
+ авторизация через соц. сети
+ защита от спама

Алгорифм разделения данных в кастере серверов в dCache

Anna | 4.06.2014 | нет комментариев
В продолжение статьи о dCache расскажу о некоторых деталях внутренней реализации.

Одна из значимых задач распределённых систем — как распределить нагрузку по имеющимся узлам. Для распределённого хранилища эта задача особенно значима, так как решение принятое на стадии записи влияет на то, как данные будут прочитаны.

Обыкновенно, данные записанные совместно, совместно и будут прочитаны. Будь то фотографии с последнего отпуска либо последние итоги научного эксперимента. Данный факт принуждает нас разбрасывать входящие данные по как дозволено огромному числу узлов, что-бы избежать собрания заказчиков на одном из серверов. Легко решаемая задача, если все узлы имеют идентичный размер и идентичное свободное дисковое пространство. Но это редкость в реальных условиях. Новые и, с огромным объёмом, сервера подсоединяются когда свободное место теснее на грани.

В dCache это решено при помощи 2-х механизмов: взвешенное произвольное разделение с учётом свободного места (weighted random distribution) при записи и переразделение данных (rebalancing) при добавлении новых узлов.

И так, как работает взвешенное произвольное разделение с учётом свободного места:

  • всякому узлу подсчитывается вес, тот, что равен объёму свободного пространства на узле делённому на всеобщее свободное место в системе:
    weight = FreeN / FreeTotal
  • произвольно выбирается один из узлов, причём вероятность выбора узла прямо пропорциональна еговесу

В коде это выглядит приблизительно так:

public Pool selectWritePool(Pool[]pools)
{
    double[] weights = new double[pools.length];
    long totalFree = 0;
    for (Pool pool:pools) {
      totalFree  = pool.getFree();
    }

    int i = 0;
    for (Pool pool:pools) {
      weights[i] = (double) pool.getFree() / totalFree;
      i  ;
    }
    return pools[i];
}

private final Random rand = new Random();
public static int weightetRandom(double[]weights, Random r)
{
    double selection = r.nextDouble();
    double total = 0;
    int i = 0;
    for (i = 0; (i < weights.length) && (total <= selection); i  ) {
      total  = weights[i];
    }
    return i - 1;
}

Данный механизм разрешает применять все узлы, но те, у которых огромнее свободного места — чаше. Вероятностная выборка, гарантирует, что решение, писать на какой-то один определенных сервер, не будет принято для различных заказчиков единовременно.

Как было сказано выше, внутренняя команда re-balance использует данный-же алгорифм, что-бы выровнять загрузку серверов. Загрузка рассчитывается отношением свободного места к всеобщему:
load = FreeN/TotalN

Данный алгорифм отлично зарекомендовал себя в боевых условиях.

Источник: programmingmaster.ru
Оставить комментарий
БАЗА ЗНАНИЙ
СЛУЧАЙНАЯ СТАТЬЯ
СЛУЧАЙНЫЙ БЛОГ
СЛУЧАЙНЫЙ МОД
СЛУЧАЙНЫЙ СКИН
НОВЫЕ МОДЫ
НОВЫЕ СКИНЫ
НАКОПЛЕННЫЙ ОПЫТ
Форум phpBB, русская поддержка форума phpBB
Рейтинг@Mail.ru 2008 - 2017 © BB3x.ru - русская поддержка форума phpBB