Java альтернативный алгоритм ротации резервных копий

Я новичок в мире алгоритмов вращения. Мне нужно улучшить уже существующий алгоритм резервного копирования, написанный на Java, который заботится о резервном копировании баз данных и их архивировании. Важным аспектом этого алгоритма является то, что он считывает файл INI, в котором вы можете указать, в какие дни недели пользователь хочет создавать резервные копии своих баз данных.

Например. вот так: ScheduledWeekDaysAct=MON, TUE, WED, THU, FRI или ScheduledWeekDaysAct=TUE, FRI

Таким образом, алгоритм ротации должен учитывать, что резервные копии могут создаваться во все комбинации дней. Это означает, что я не могу легко использовать алгоритм дед-отец-сын, который я уже реализовал. Потому что то, что я закодировал, предполагает, что резервные копии создаются каждый день в году, и это несовместимо с кодом резервного копирования.

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

  • Всегда следует сохранять первые 10 (десять) самых последних резервных копий.
  • After the most recent ten is kept, the rest older should be thinned. Not piece by piece, but by datetime. The date of the 10th oldest backup is a designated reference date, to which the older backups will be compared upon a new backup happens. Older backups should be kept and thinned something like the following. After the 10th oldest backup there should be kept:
    • 3 or 4 backups which are the newest on 3-4 prior weeks,
    • 11 ежемесячных резервных копий,
    • Резервное копирование на 1 год.

Я не могу использовать системную дату и время, мне нужно анализировать имена файлов резервных копий. Но в конце концов, даты резервных копий предоставляются.

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

Я могу это сделать, я читаю имена файлов, анализирую дату из String, получаю Date объектов из этих проанализированных строк. Я могу поместить их в Map<Path, Date> (позже мне также понадобится функция отсутствия дубликатов Set, чтобы избавиться от одинаковых дат [может быть несколько баз данных с одинаковой датой, но разными именами]). Я всегда могу определить дату 10-го сохранения, чтобы получить эталонный объект Date. Поэтому я всегда могу рассчитать относительный возраст резервной копии. Относительный возраст резервных копий уникален, и я могу сохранить относительный возраст с помощью Date, из которого он был рассчитан, вот так TreeMap<Integer, Date>.

Я полагаю, мне нужно работать с диапазонами относительных возрастов (keySet()). Если я могу определить минимальный и максимальный относительный возраст в диапазоне относительного возраста, я могу отфильтровать Date объектов, на которые ссылается относительный возраст. ( if relativeAge < 7,if relativeAge >= 7 & relativeAge < 14 и т. д.) Но мне также нужно повернуть Dates...

Я не могу обдумать это, любые идеи приветствуются. Спасибо!

Редактировать 1:

По сути проблема сводится к следующему:

У меня есть список целых чисел. (Список относительных возрастов): [1, 3, 5, 8, 10, 12, 15, 17, 19, 22, 24, 26...]

Мне нужно создать нижнюю и верхнюю границы, чтобы сформировать группы этих целых чисел. Целое число, относительный возраст может быть между 0 и 7 или 7 и 14, 14 и 21, 21 и 28, 28 и 56, 56 и 84 ... 336 и 364, и может быть больше 364. Мне нужно найти целые числа, которые попадают в эти диапазоны соответственно. После того, как я нашел эти группы целых чисел (группа может содержать 0, 1 или более целых чисел), я должен взять самый высокий/самый старший относительный возраст в определенном диапазоне, группу. Если диапазон выше 364, мне придется сохранить самое низкое сохранение, чтобы предотвратить накопление ежегодных сохранений. Я должен собрать эти самые высокие относительные возрасты в вышеуказанных диапазонах, и они образуют группу относительных возрастов.

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

Я могу интерпретировать понятие максимального относительного возраста (maxRelAge) в данной ротации, то есть возраста самой старой резервной копии относительно фактической контрольной даты.

Мне не нужно проверять диапазоны целых чисел выше максимального относительного возраста. Через 1 год алгоритм заработает в полном объеме.

Но я до сих пор не знаю, как закодировать этот алгоритм на Java.


person gllo    schedule 30.09.2014    source источник


Ответы (1)


Ответ на мой собственный вопрос.

Чтобы реализовать алгоритм, я поместил список целых чисел в TreeSet. Я перебрал этот набор и проверил, находится ли целое число (относительный возраст) в диапазоне относительных возрастов, и если да, я собираю их в другой набор, например так:

private void checkRelativeAge(TreeSet<Integer> ageGroup, int relAge, 
int boundary, int offset) {
    if (relAge > boundary & relAge <= boundary + offset) {
        ageGroup.add(relAge);
    }
}

Это может быть вызвано несколько раз при переборе относительных возрастов:

checkRelativeAge(relAgesBetween336And364, relAge, 336, 28);
checkRelativeAge(relAgesBetween308And336, relAge, 308, 28);
checkRelativeAge(relAgesBetween280And308, relAge, 280, 28);

...

checkRelativeAge(relAgesBetween7And14, relAge, 7, 7);
checkRelativeAge(relAgesBetween1And7, relAge, 0, 7);

После того, как я разделил, собрал относительные возрасты в группы, я снова перебираю относительные возрасты, проверяю, находится ли относительный возраст в диапазоне, и если это так, я беру последний и первый элемент диапазона.

    if (relAge > boundary & relAge <= boundary + offset) {
        toBePreservedSet.add(dateRelativeAgeMap.get(ageGroup.last()));
        toBePreservedSet.add(dateRelativeAgeMap.get(ageGroup.first()));
    }

Наконец, из набора toBePreservedSet я могу соотнести даты, которые нужно сохранить, соответственно, а из дат я могу соотнести обратно имена файлов и определить, какие сохранить, а какие удалить в данной ротации.

person gllo    schedule 03.10.2014