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

1

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

Например: ScheduledWeekDaysAct=MON, TUE, WED, THU, FRI или ScheduledWeekDaysAct=TUE, FRI

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

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

  • Первые 10 (десять) последних резервных копий всегда должны храниться.
  • После того, как будут сохранены самые последние десять, остальные стареющие должны быть разбавлены. Не по частям, а по дате. Дата 10-й старейшей резервной копии - это назначенная контрольная дата, к которой будут сопоставляться старые резервные копии при новой резервной копии. Старые резервные копии должны храниться и утончаться примерно так: После 10-й старейшей резервной копии необходимо сохранить:
    • 3 или 4 резервных копии, которые являются самыми новыми на 3-4 предыдущих неделях,
    • 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.

Теги:
algorithm
rotation
backup

1 ответ

0
Лучший ответ

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

Чтобы реализовать алгоритм, я помещаю список целых чисел в 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 я могу относиться к датам, которые должны быть сохранены, соответственно, и из дат, которые я могу связать с именами файлов, и определить, что сохранить и удалить для данного вращения.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню