Русский
Русский
English
Статистика
Реклама

Бэкап

Чего ожидать от бета-версии Proxmox Backup Server

15.07.2020 12:10:08 | Автор: admin

10 июля 2020 года австрийская компания Proxmox Server Solutions GmbH представила публичную бета-версию нового решения по резервному копированию.

Мы уже рассказывали, как использовать штатные методы бэкапа в Proxmox VE и выполнять инкрементальный бэкап с помощью стороннего решения Veeam Backup & Replication. Теперь же, с появлением Proxmox Backup Server (PBS) процесс резервного копирования должен стать удобнее и проще.


Распространяется PBS на условиях лицензии GNU AGPL3, разработанной Фондом свободного программного обеспечения (Free Software Foundation). Это позволит без проблем использовать и модифицировать ПО под свои нужды.


Инсталляция PBS практически ничем не отличается от стандартного процесса установки Proxmox VE. Точно так же задаем FQDN, сетевые настройки и другие требуемые данные. После завершения инсталляции можно перезагрузить сервер и зайти в веб-интерфейс, используя ссылку вида:

https://<IP-address or hostname>:8007

Основное предназначение PBS выполнение резервного копирования виртуальных машин, контейнеров и физических хостов. Для выполнения этих операций предоставляется соответствующий RESTful API. Поддерживается три основных типа резервного копирования:

  • vm копирование виртуальной машины;
  • ct копирование контейнера;
  • host копирование хоста (реального или виртуальной машины).

Структурно бэкап виртуальной машины представляет собой набор архивов. Каждый дисковый накопитель и конфигурационный файл виртуальной машины упаковывается в отдельный архив. Такой подход позволяет ускорить процесс частичного восстановления (например, нужно вытащить только отдельную директорию из бэкапа), поскольку отпадает необходимость сканирования архива целиком.

Помимо привычного формата img для хранения объемных данных и образов виртуальных машин, появился формат pxar (Proxmox File Archive Format), предназначенный для хранения файлового архива. Он спроектирован таким образом, чтобы обеспечить высокую производительность для выполнения ресурсоемкого процесса дедупликации данных.

Если посмотреть на типичный набор файлов внутри снапшота, то вместе с файлом .pxar еще можно обнаружить файлы catalog.pcat1 и index.json. Первый хранит список всех файлов внутри бэкапа и предназначен для быстрого поиска нужных данных. Второй же, помимо списка, хранит размер и контрольную сумму каждого файла и предназначен для проверки консистентности.

Управляется сервер традиционно с помощью веб-интерфейса и/или утилит командной строки. Подробные описания команд CLI приведены в соответствующей документации. Веб-интерфейс лаконичен и знаком всем, кто хоть раз использовал Proxmox VE.


В PBS можно настроить задания синхронизации локальных и удаленных хранилищ данных, поддержку ZFS, шифрование AES-256 на стороне клиента и прочие полезные опции. Судя по дорожной карте, скоро появится возможность импорта существующих бэкапов, хоста с Proxmox VE или Proxmox Mail Gateway целиком.

Также с помощью PBS можно организовать бэкап любого хоста на базе Debian, установив клиентскую часть. Добавляем репозитории в /etc/apt/sources.list:

deb http://ftp.debian.org/debian buster main contribdeb http://ftp.debian.org/debian buster-updates main contrib# security updatesdeb http://security.debian.org/debian-security buster/updates main contrib

Обновляем список ПО:

apt-get update

Устанавливаем клиент:

apt-get install proxmox-backup-client

В дальнейшем появится поддержка и других дистрибутивов Linux.

Пощупать бета-версию PBS можно уже сейчас, готовый образ есть на официальном сайте. На форуме Proxmox также появилась соответствующая ветка обсуждений. Исходный код также доступен всем желающим.

Подводим итоги. Первая публичная бета-версия PBS уже сейчас демонстрирует набор весьма полезных возможностей и заслуживает самого пристального внимания. Надеемся, что будущий релиз нас не разочарует.
Подробнее..

Пусть хоть потоп, но 1С должна работать! Договариваемся с бизнесом о DR

17.09.2020 12:16:31 | Автор: admin
Представьте себе: вы обслуживаете ИТ-инфраструктуру крупного торгового центра. В городе начинается ливень. Потоки дождя прорывают крышу, вода заполняет торговые помещения по щиколотку. Надеемся, что ваша серверная не в подвале, иначе проблем не избежать.

Описанная история не фантазия, а собирательное описание пары событий 2020 года. В крупных компаниях на этот случай всегда под рукой план послеаварийного восстановления, или disaster recovery plan (DRP). В корпорациях за него отвечают специалисты по непрерывности бизнеса. Но в средних и небольших компаниях решение таких задач ложится на ИТ-службы. Нужно самому разобраться в бизнес-логике, понять, что и где может упасть, придумать защиту и внедрить.

Здорово, если ИТ-специалисту удается провести переговоры с бизнесом и обсудить необходимость защиты. Но я не раз наблюдал, как компания экономила на решении для disaster recovery (DR), так как считала его избыточным. Когда наступала авария, долгое восстановление грозило убытками, а бизнес оказывался не готов. Можно сколько угодно повторять: А я же говорил, восстанавливать сервисы все равно предстоит ИТ-службе.



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

  • Что защищаем?
  • От чего защищаем?
  • Как сильно защищаем?

Во второй части поговорим о вариантах ответа на вопрос: чем защищаться. Приведу примеры кейсов, как разные заказчики строят свою защиту.

Что защищаем: выясняем критические бизнес-функции


Лучше начинать подготовку с обсуждения плана послеаварийных действий c бизнес-заказчиком. Тут главная сложность найти общий язык. Заказчика обычно не волнует, как ИТ-решение работает. Его волнует, может ли сервис выполнять бизнес-функции и приносить деньги. Например: если сайт работает, а платежная система лежит, поступлений от клиентов нет, а крайние все равно ИТ-специалисты.

ИТ-специалист может испытывать сложности в таких переговорах по нескольким причинам:

  • ИТ-службе не до конца известна роль информационной системы в бизнесе. Например, если нет доступного описания бизнес-процессов или прозрачной бизнес-модели.
  • От ИТ-службы зависит не весь процесс. Например, когда часть работы выполняют подрядчики, а у ИТ-специалистов нет на них прямого влияния.

Я бы построил разговор так:

  1. Объясняем бизнесу, что аварии случаются со всеми, а на восстановление требуется время. Лучше всего продемонстрировать ситуации, как это происходит и какие последствия возможны.
  2. Показываем, что от ИТ-службы зависит не все, но вы готовы помочь с планом действий в зоне вашей ответственности.
  3. Просим бизнес-заказчика ответить: если случится апокалипсис, какой процесс нужно восстановить первым? Кто и как в нем участвует?

    От бизнеса необходим простой ответ, например: нужно, чтобы колл-центр продолжил регистрировать заявки 24/7.
  4. Просим одного-двух пользователей системы подробно описать этот процесс.
    Лучше привлечь на помощь аналитика, если в вашей компании такой есть.

    Для начала описание может выглядеть так: колл-центр получает заявки по телефону, по почте и через сообщения с сайта. Потом заводит их в 1С через веб-интерфейс, оттуда их забирает производство вот таким способом.
  5. Затем смотрим, какие аппаратные и программные решения поддерживают процесс. Для комплексной защиты учитываем три уровня:
    • приложения и системы внутри площадки (программный уровень),
    • саму площадку, где крутятся системы (инфраструктурный уровень),
    • сеть (про нее вообще часто забывают).

  6. Выясняем возможные точки отказа: узлы системы, от которых зависит работоспособность сервиса. Отдельно отмечаем узлы, которые поддерживают другие компании: операторы связи, хостинг-провайдеры, дата-центры и так далее.С этим можно возвращаться к бизнес-заказчику для следующего шага.

От чего защищаем: риски


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

  • потеря времени из-за простоя сервисов;
  • потеря данных из-за физических воздействий, человеческого фактора и т.д.

Бизнесу страшно потерять и данные, и время все это ведет к потере денег. Так что снова задаем вопросы по каждой группе рисков:
  • Можем ли мы оценить для этого процесса, сколько в деньгах стоит потеря данных и потеря времени?
  • Какие данные мы не можем потерять?
  • Где не можем допустить простоя?
  • Какие события наиболее вероятны и сильнее нам угрожают?

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

Как сильно защищаем: RPO и RTO


Когда понятны критические точки отказа, рассчитываем показатели RTO и RPO.

Напомню, что RTO (recovery time objective) это допустимое время с момента аварии и до полного восстановления сервиса. На языке бизнеса это допустимое время простоя. Если мы знаем, сколько денег приносил процесс, то сможем посчитать убытки от каждой минуты простоя и вычислить допустимый убыток.

RPO (recovery point objective) допустимая точка восстановления данных. Она определяет время, за которое мы можем потерять данные. С точки зрения бизнеса, потеря данных может грозить, например, штрафами. Такие потери тоже можно перевести в деньги.



Время восстановления нужно рассчитывать для конечного пользователя: в какой срок он сможет войти в систему. Так что сначала складываем время восстановления всех звеньев цепи. Здесь часто делают ошибку: берут RTO провайдера из SLA, а про остальные слагаемые забывают.
Посмотрим на конкретном примере. Пользователь заходит в 1С, система открывается с ошибкой базы данных. Он обращается к системному администратору. База находится в облаке, сисадмин сообщает о проблеме сервис-провайдеру. Допустим, на все коммуникации уходит 15 минут. В облаке база такого объема восстановится из бэкапа за час, следовательно, RTO на стороне сервис-провайдера час. Но это не окончательный срок, для пользователя к нему прибавились 15 минут на обнаружение проблемы.

Дальше системному администратору надо проверить, что база корректная, подключить ее к 1С и запустить сервисы. На это необходим еще час, значит, RTO на стороне администратора уже 2 часа 15 минут. Пользователю нужно еще 15 минут: залогиниться, проверить, что нужные транзакции появились. 2 часа 30 минут общее время восстановления сервис в этом примере.
Эти расчеты покажут бизнесу, от каких внешних факторов зависит срок восстановления. Например, если офис заливают, то сначала нужно обнаружить протечку и устранить ее. Понадобится время, которое зависит не от ИТ.

Чем защищаем: выбираем инструменты для разных рисков


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

Начнем с первой группы рисков: потерь из-за простоев сервиса. Варианты решения для этой задачи должны обеспечивать хороший RTO.

  1. Разместить приложение в облаке

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

    Например, можно разместить в облаке виртуальную машину с базой данных. Приложение подключится к базе данных снаружи по установленному каналу или из этого же облака. Если возникнут проблемы с одним из серверов кластера, то ВМ перезапустится на соседнем сервере меньше чем за 2 минуты. После этого в ней поднимется СУБД, и через несколько минут база данных станет доступна.

    RTO: измеряется в минутах. Прописать эти сроки можно в соглашении с провайдером.
    Стоимость: считаем стоимость ресурсов облака под ваше приложение.
    От чего не защитит: от массовых сбоев на площадке провайдера, например, из-за аварий на уровне города.
  2. Кластеризовать приложение

    Если хочется улучшить RTO, предыдущий вариант можно усилить и сразу разместить в облаке кластеризованное приложение.

    Реализовать кластер можно в режиме active-passive или active-active. Создаем несколько ВМ, исходя из требований вендора. Для большей надежности разносим их по разным серверам и СХД. При отказе сервера с одной из БД, резервная нода принимает на себя нагрузку за несколько секунд.

    RTO: измеряется в секундах.
    Стоимость: чуть дороже обычного облака, потребуются дополнительные ресурсы для кластеризации.
    От чего не защитит: по-прежнему не защитит от массовых сбоев на площадке. Но локальные сбои будут не такими продолжительными.
    Из практики: У компании-ритейлера было несколько информационных систем и сайтов. Все базы данных располагались локально в офисе компании. Ни о каком DR не задумывались, пока офис не остался без электричества несколько раз подряд. Клиенты были недовольны сбоями на сайтах.

    Проблема с доступностью сервисов решилась после переезда в облако. Плюс к этому удалось оптимизировать нагрузку на базы данных за счет балансировки трафика между узлами.
  3. Переехать в катастрофоустойчивое облако

    Если нужно, чтобы работе не помешало даже стихийное бедствие на основной площадке, можно выбрать катастрофоустойчивое облако В этом варианте провайдер разносит кластер виртуализации уже на 2 дата-центра. Между дата-центрами происходит постоянная синхронная репликация, один-в-один. Каналы между ЦОДами зарезервированы и идут по разным трассам, так что такому кластеру не страшны проблемы с сетью.

    RTO: стремится к 0.
    Стоимость: самый дорогой вариант в облаке.
    От чего не защитит: Не поможет от порчи данных, а также от человеческого фактора, поэтому параллельно рекомендуется делать бэкапы.
    Из практики: Один из наших клиентов разработал комплексный план послеаварийного восстановления. Вот какую стратегию он выбрал:

    • Катастрофоустойчивое облако защищает приложение от сбоев на уровне инфраструктуры.
    • Двухуровневый бэкап обеспечивает защиту на случай человеческого фактора. Резервные копии делают двух видов: холодные и горячие. Холодный бэкап находится в выключенном состоянии, на его развертывание требуется время. Горячий бэкап уже готов к работе и восстанавливается быстрее. Его хранят на специально выделенной СХД. Третью копию записывают на ленту и хранят в другом помещении.

    Раз в неделю клиент тестирует защиту и проверяет работоспособность всех бэкапов, в том числе с ленты. Ежегодно в компании проводят тестирование всего катастрофоустойчивого облака.
  4. Организовать репликацию на другую площадку

    Еще один вариант, как можно избежать глобальных проблем на основной площадке: обеспечить георезервирование. Другими словами, создать резервные виртуальные машины на площадке в другом городе. Для этого подойдут специальные решения для DR: мы в компании используем VMware vCloud Availability (vCAV). С его помощью можно настроить защиту между несколькими площадками облачного провайдера или восстановиться в облако с on-premise площадки. Подробнее о схеме работы с vCAV я уже рассказывал тут.

    RPO и RTO: от 5 минут.

    Стоимость: дороже первого варианта, но дешевле, чем аппаратная репликация в катастрофоустойчивом облаке. Цена складывается из стоимости лицензии vCAV, платы за администрирование, стоимости ресурсов облака и ресурсов под резерв по модели PAYG (10% от стоимости работающих ресурсов за выключенные ВМ).
    Из практики: Клиент держал в нашем облаке в Москве 6 виртуальных машин с разными базами данных. Сначала защиту обеспечивал бэкап: часть резервных копий хранили в облаке в Москве, часть на нашей петербургской площадке. Со временем базы данных выросли в объеме, и восстановление из бэкапа стало требовать больше времени.

    К бэкапам добавили репликацию на базе VMware vCloud Availability. Реплики виртуальных машин хранятся на резервной площадке в Санкт-Петербурге и обновляются каждые 5 минут. Если на основной площадке происходит сбой, сотрудники самостоятельно переключаются на реплику виртуальной машины в Санкт-Петербурге и продолжают работу с ней.

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

5. Не забыть про резервное копирование

Все знают, что нужно делать бэкапы, даже если у вас самое крутое катастрофоустойчивое решение. Так что лишь коротко напомню несколько моментов.

Строго говоря, бэкап это не DR. И вот почему:

  • Это долго. Если данные измеряются в терабайтах, на восстановление потребуется не один час. Нужно восстановить, назначить сеть, проверить, что включится, посмотреть, что данные в порядке. Так что обеспечить хороший RTO можно, только если данных мало.
  • Данные могут восстановиться не с первого раза, и нужно заложить время на повторное действие. Например, бывают случаи, когда мы точно не знаем время потери данных. Допустим, потерю заметили в 15.00, а копии делаются каждый час. С 15.00 мы смотрим все точки восстановления: 14:00, 13:00 и так далее. Если система важная, мы стараемся минимизировать возраст точки восстановления. Но если в свежем бэкапе не нашлось нужных данных, берем следующую точку это дополнительное время.

При этом расписание резервного копирования может обеспечить нужный RPO. Для бэкапов важно предусмотреть георезервирование на случай проблем с основной площадкой. Часть резервных копий рекомендуется хранить отдельно.

В итоговом плане послеаварийного восстановления должно быть минимум 2 инструмента:

  • Один из вариантов 1-4, который защитит системы от сбоев и падений.
  • Резервное копирование для защиты данных от потерь.

Также стоит позаботиться о резервном канале связи на случай падения основного интернет-провайдера. И вуаля! DR на минималках уже готов.
Подробнее..

Аптайм 500 дней перезагрузка падение собираем бэкап по частям

09.06.2021 10:16:43 | Автор: admin

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

Все началось с того, что сервер статистики контактного центра заказчика (на тот момент ещё потенциального) сбросил все пользовательские сессии и перестал отвечать на запросы. Соответственно к нему подкатили тележку с монитором и перезагрузили. Это обычно надо делать раз в 90 дней по инструкции от вендора, но тут это не делалось больше 500 дней. В общем, сервер отметил юбилей аптайма.

Дальше быстро выяснилось, что на рестарте посыпалась база и пропали конфиги. Но главное, что сервер стартанул, бэкапы куда-то писались. Всё хорошо, железо работает, диски в порядке, надо просто накатить бэкап.

Но после накатывания бэкапа система просто легла.

В этот момент нас позвали отмечать день рождения сервера. Без него не работала балансировка нагрузки на операторов внутри КЦ.

Что это была за система?

Система Avaya Call Management System (CMS). Это кусок колл-центра, который собирает статистику по звонкам, операторам, нагрузке исторические и реал-тайм данные. На этом же сервере каждое утро собираются отчёты о работе. В реальном времени сервер говорит, какие операторы сейчас в каких статусах находятся, какие звонки обрабатываются, сколько звонков висит в очереди. В целом система нужна, чтобы следить за группами операторов, за колл-центром, чтобы правильно распределять нагрузку, потому что можно переносить операторов из ненагруженных линий в нагруженные и так далее. Обычно там просто сидят супервизоры и следят за всем происходящим. Прямых аналогов нет, обычно используются самописные решения или же всё вообще делается вручную. Аваевскую систему выбирают за надёжность и многофункциональность.

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

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

Первый день пятница

Ситуация абсолютно обычная. У кого-то что-то упало, нам никто деталей не сказал, но надо срочно. Это норма во всех странах, детали появляются потом, когда есть время их искать и рассказывать. На тот момент предполагалось, что мы, может быть, что-то придумаем и мгновенно спасём контакт-центр.

Приезжаем на место (напомню, что сервер лёг и удалённого доступа нет), подключаемся с монитором и клавиатурой, ещё раз смотрим, как система не стартует.

Я подключился не сразу. Когда подключился увидел, что диск переполнился ошибками из-за проблем бэкапа. Некоторые сервисы не стартовали почистили логи, стартовали руками.

У нас условно есть три части системы: железный сервер, который входит в ПАК, поставляемый сразу с софтом в виде чёрного ящика от вендора, CMS и база данных. Бэкапы CMS (конфигураций) и базы делаются в разные места.

ОК, система запустилась, но только база пустая данных никаких нет.

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

Итак, у нас на руках железный оракловский сервер, с которым что-то не то (но это не посыпавшийся раньше времени диск), на нём Solaris c базjq Informix от IBM + пакет CMS от вендора. Решение продаётся как программно-аппаратный комплекс, то есть всё там как поставил вендор, так никто и не трогал.

Бэкапы БД делались. Итерации были по 180 дней, бэкапирование настроено в планировщике системы. Логи бэкапов никто особо не читал, консистентность не проверяли, назад до этого юбилея сервака накатывать не пытались.

Складировались бэкапы прямо на этот же сервер.

То есть сначала уронили рестартом систему, ребутнули с тележки и поставили бэкап системы CMS, который уронил окончательно железный сервак. Мы починили сервак, но там не было вообще никаких полезных данных. Предстояли интересные выходные.

Дальнейшее исследование

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

К утру мы всё ещё думали, что справимся быстро (в КЦ уже начались проблемы). Решили не трогать бренную земную оболочку сервера, а сразу снять с него образ и развернуть на виртуалке. Это стандартная процедура и для форензики, и для восстановления чего-то, где может посыпаться дальше диск, и вообще очень удобно в конечном итоге в плане не навреди ещё.

Сначала мы развернули виртуалку на стенде прямо у заказчика и начали препарировать там. Фактически Авая сделала больше, чем должна была, подарив лицензию на виртуальную систему. Ну, точнее, заказчику. Выяснили, что бэкап встаёт с ошибкой устройства, но в остальном норм, правда, система пустая. Довольно быстро стало понятно, что бэкап битый полностью.

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

Откатили виртуалку из снапшота на начальное состояние (до бэкапа системы) и пробуем использовать только бэкап базы. Он восстанавливается удачно, но там нет данных.

Сохранились конфиги, но улетела вся статистика. У нас закралось сомнение, что они просто какие-то таблицы не добавляли в инкременты. Но в итоге мы нашли бэкап с меткой полный бэкап из старых. Развернули его, но пронаблюдали такую же картину.

В лаборатории

На стенде мы расковыряли уже сами базы данных и начали смотреть, что там внутри. Вендор дал набор диагностических утилит, которые позволяют делать частичные дампы базы. По сути, это такие отдельные куски системы, которые используют родные интерфейсы ПАКа, но ограниченно для доступа к отдельным таблицам.

Сразу стало понятно, что свежий бэкап неконсистентен и вообще похож на записанный прямо из /dev/random. То есть последний месяц (который не бэкапился) пропал просто в силу того, что его никто никуда не резервировал. Следующие полгода пропали из-за битого бэкапа. И только в следующей итерации нашлись таблицы, где были реальные данные. То есть минус семь месяцев от момента аварии, и, как позже выяснилось, целых данных там было не очень много, не больше года, а часто по некоторым показателям и меньше.

Вручную с таблицы перенесли данные в базу данных и скормили всё это нашей виртуалке.

То есть в итоге оставили систему в рабочем режиме со старыми данными, руками настраиваем всё то, что не удалось восстановить из бэкапа системы (пользовательские учётки, коннекторы к другим системам, скрипты).

Там, собственно, и стало понятно, что колл-центр как-то будет учиться обходиться без статистики за периоды. А это довольно больно: они не смогут проводить ретроспективы, делать поквартальное сравнение, использовать исторические данные для прогнозирования смен и так далее. Вся система поощрений операторов тоже была завязана на статистику на этом сервере, то есть заказчик как-то выплатил премии, разбирая потом технические логи самих соединений и записи других систем, но было довольно сложно и неприятно.

Дальше мы занялись тем, что из убитой базы данных с частично сохранившейся информацией делали подходящую для работы этого КЦ. По факту пришлось вбивать руками тысячи операторов, групп и их навыков. Причём за выходные. В понедельник система заработала в достаточной степени, чтобы гладко писать статистику дальше и делать ежедневные отчёты, но с историческими данными ничего больше придумать не вышло.

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

Выводы

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

Выводы достаточно очевидные: запишите где-нибудь процедуры обслуживания серверов, чтобы их не пропустили, раз. И проверяйте бэкапы два. Если у вас есть что-то критичное или держите это в виртуальной среде, или имейте второе железное решение для бесшовных перезагрузок (ну или готовьтесь к простою). Складируйте бэкапы не на сам сервер, который надо бэкапить. Имейте партнёра со SLA на такие поломки ну или хотя бы просто проверенные контакты, потому что, когда что-то падает, обычно надо решать сразу. Повезло, что это было перед выходными и что на выходных КЦ под минимальной нагрузкой.

Дальше у заказчика уже несколько месяцев работает виртуалка вместо ПАКа. Мы поддерживаем и эту систему, поэтому бэкапы сейчас делаются правильно. И есть где их проверять на тестовых стендах.

Подробнее..

Восстановление данных в современной инфраструктуре как один админ бэкапы настраивал

30.09.2020 20:16:11 | Автор: admin

Я всегда считал, что одна из основных проблем при использовании систем резервного копирования свойственный этому процессу консерватизм. Причин для него огромное количество, начиная с того факта, что первый бэкап был сделан ещё в 1951 году. При этом наличие бэкапов, которые можно восстановить, остаётся показателем зрелости компании и её опыта в эксплуатации.

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

Я не буду говорить о себе, а расскажу чужую историю. Все имена в ней выдуманные, а совпадения случайны. Её главный герой человек по имени Савелий. И, по случайному совпадению, он админ, как и я.

Савелий очень любил читать книжки о Linux. Он изучал всё, что мог купить и скачать бесплатно. В конце концов это увлечение зашло настолько далеко, что он устроился работать админом. Инфраструктура, которую Савелий построил на работе, поначалу была очень простой: один сервер баз данных, одна машина с нагрузкой под фронтенд и некий бэкенд. Он просто брал каждую машину, сливал всё, что на ней было, в хранилище и получался бэкап.

Из этой статьи вы узнаете об эволюции взглядов Савелия: как с усложнением инфраструктуры менялся его подход к бэкапам и к каким выводам он пришёл. Я рассказывал об этом на прошлогоднем HighLoad++, а сегодня делюсь текстом по мотивам доклада.

Глава 1, в которой Савелий полагается на систему управления конфигурациями

Наш Савелий жил-поживал и продолжал изучать материалы по Linux даже на работе. И однажды он узнал, что существуют системы управления конфигурациями: Ansible, Puppet, Chef и им подобные. Они избавляют от ручной работы при подготовке сервера ко вводу в эксплуатацию.

Какая классная штука, надо использовать! подумал Савелий. И тут же внедрил такую систему. После этого он решил, что бэкапить машину целиком уже не имеет смысла, и стал забирать в бэкап только часть необходимых данных. Всем остальным занималась система управления конфигурациями.

Со временем инфраструктура проекта усложнилась.

Разрослись серверы с фронтендами. Да и с бэкендами, честно говоря, тоже. Появились связи между компонентами, связи внутри каждого компонента.

Самое интересное изменение касалось баз данных: появилось шардирование. У каждого шарда было по одной или несколько реплик. Помимо того, что данные расползлись по инфраструктуре, произошло дублирование: данные одного шарда могли располагаться на пяти-шести репликах. Данных стало много.

Сервисы также изменились: их стало больше, появились связи и зависимости.

Савелий долго наблюдал за ситуацией, и ему всё нравилось. Всё работало хорошо и без сбоев. В конце концов он подумал: а зачем вообще бэкапы? Ведь теперь всё просто: машина упала поднял другую реплику, считал с мастера и всё поедет дальше.

Так Савелий отказался от бэкапов.

Глава 2, в которой появляется карта расположения сервисов

Савелий работал в компании не один, с ним было много программистов. Один из них Аристофан был его добрым другом.

Однажды, работая с базой данных, Аристофан случайно сделал дроп.

Савелий хороший админ. Когда он настраивал репликацию, то следил за отставанием от мастера. Точнее он его не допускал.

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

Что тут сказать: такое бывает не только в сказках.

После этого Савелий задумался. Нет, не о дружбе с Аристофаном, а о том, что бэкапы всё же нужны. И о том, что такое правильный бэкап.

Савелий пришёл к выводу, что бэкап это неизменяемые данные на определённый момент времени. У бэкапа должно быть несколько обязательных свойств:

  1. Он должен находиться в стороне и не должен быть подвержен изменению.

  2. Он обязательно должен восстанавливаться.

  3. Всегда нужно знать, сколько времени требуется на восстановление бэкапа.

После того как Савелий сформулировал эти правила, появился другой вопрос. Как правильно поступать: по старинке бэкапить сервер целиком или же делать именно сервисные бэкапы?

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

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

Сложность заключалась в другом: после восстановления бэкапа сервера рядом с нужными данными всегда лежали данные, которые были не нужны. Например, когда Савелию нужно было восстановить все данные сервиса А, но при этом на сервере жили ещё и сервисы Б и В, то в бэкапе сервера оказывались все файлы всех трёх сервисов (А, Б и В).

Процесс восстановления в таком случае мог пойти по двум сценариям:

  1. Восстановить весь бэкап сервера и потом взять нужные данные. Минусы:

    1. увеличение нагрузки на сеть;

    2. увеличение нагрузки на устройство хранения;

    3. увеличение времени на выборку нужных данных из общей кучи.

  2. Выбрать вручную только те данные, которые нужно восстановить. Минусы:

    1. увеличение времени на выборку нужных данных из общей кучи;

    2. высокая вероятность того, что будут выбраны не все данные и процедуру придётся повторить (опять-таки потраченное время).

Как видно, оба варианта имеют существенные недостатки.

Кроме того, иногда данные с одного сервера мигрировали на другой. В этом случае приходилось копаться, выяснять, куда они делись и какой сервер действительно нужен.

Савелий попробовал оба варианта и пришёл к выводу, что с точки зрения удобства и времени восстановления лучше бэкапить именно сервис. Мысль о том, что бэкапы не нужны, Савелию в голову больше не приходила. Перед ним стоял вопрос: как сообщить системе бэкапа, где какой сервис живёт?

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

Вывод, к которому пришёл Савелий, прост: современным бэкапам современную оркестрацию.

Глава 3, в которой Савелий понимает, что серверы созданы не только для того, чтобы их бэкапить (а голова не только для того, чтобы в неё есть)

Жил теперь Савелий хорошо: у него была чёткая стратегия, которой он придерживался. Но однажды к нему пришёл Аристофан и заявил, что бэкап мешает работе его сервиса.

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

Решение пришло быстро. Один из способов уменьшения потребления сети и места в хранилище инкрементальные бэкапы. Наученный опытом Савелий решил не рубить с плеча и сначала разобраться в плюсах и минусах такого подхода.

Минусы:

  • формирование инкрементального бэкапа на клиенте в некоторых случаях более затратно с точки зрения ресурсов, так как нужно вычислять разницу было-стало;

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

Плюсы:

  • экономия ресурсов сети, так как по ней передаётся не весь объём данных, а лишь те, которые изменились;

  • экономия места в хранилище.

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

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

В общем, Савелий молодец.

Глава 4, в которой появляется devel

Жили серверы Савелия долго и счастливо. Но пришла новая беда: стало невозможно выкатывать изменения сразу в боевое окружение. Было создано devel-окружение, которое нужно было поддерживать и бэкапить. Оно было точной копией продакшен-окружения, но располагалось на виртуальных машинах.

Проблема была в том, что devel это территория разработчика, вотчина Аристофана. Но Савелий понимал, что рано или поздно Аристофан придёт к нему с вопросом, а есть ли у него бэкап данных за какой-то день.

Выходит, только Аристофан может знать, что нужно бэкапить, а что можно выкинуть. И несёт за это ответственность.

Поэтому Савелий решил действовать хитро сыграть на опережение: раз в сутки брать из карты сервисов список виртуальных машин, вычёркивать из него машины с базами данных и давать Аристофану возможность влиять на это по большей части включать и выключать определённые виртуалки из бэкапа.

Как Савелий организовал процесс бэкапа виртуальных машин:

  1. На момент начала бэкапа виртуальной машины на ней не должно быть снапшотов.

  2. Если на виртуальной машине есть снапшот, сделанный вручную Аристофаном, то:

    • не удалять снапшот;

    • не выполнять бэкап;

    • сообщать об этом Аристофану и уточнять, нужен ли ему ещё снапшот, и действовать в зависимости от его ответа.

  3. По окончании бэкапа удалять временный снапшот.

Также Савелий придумал оповещалку, которая сообщала Аристофану о том, что машины в инфраструктуре уже нет, а запись о её бэкапе или не-бэкапе присутствует.

Почему Савелий не бэкапил виртуалки с базами данных? На самом деле всё просто: теперь он всегда бэкапит все инстансы с базами данных. По умолчанию. Потому что он помнит прекрасную историю про дроп. А на машинах с базами данных ничего ценного, кроме самих данных в базе (для всего остального есть Puppet!), нет.

Глава 5, в которой появляются отличия бэкапа базы данных от бэкапа сервиса

База данных тоже сервис. Бэкап сервиса тоже бэкап. В общем случае при выполнении бэкапа файлы берутся из локальной файловой системы. Сложность в том, что очень часто на сервере с базой данных датасет настолько большой, что локально положить выгрузку (дамп), а потом поместить её в систему резервного копирования невозможно на это просто не хватает места.

С этим столкнулся и наш герой. Он начал использовать pipe: подключался к базе и на лету сливал данные в удалённое хранилище. Причём даже в тех случаях, когда места на сервере хватало. Савелий принял решение бэкапить везде одинаково, чтобы не было энтропии. Админы довольно быстро понимают плюсы такого подхода, а кто не понимает, тот рано или поздно тонет в костылях (костыль в данном случае это использование разных подходов к решению одной и той же задачи).

Разрабатывая своё решение по бэкапу баз данных, Савелий решил, что нужно дать Аристофану несколько рычагов управления. Многие вещи в инфраструктуре Аристофан знал хорошо, даже лучше админа. Например, он знал, в какой момент времени какая база более нагружена, какую базу можно бэкапить, а какую нет.

Поэтому Савелий разрешил Аристофану:

  • включать и выключать бэкап;

  • менять параметры утилит бэкапа;

  • менять расписание бэкапа.

К реализации Савелий подошёл просто: он периодически формировал список со всеми машинами с базами данных и делал приоритизацию. Для чего в данном случае понадобилась приоритизация? Всё просто -- давайте представим себе ситуацию, когда нужно выполнить бэкап большого объема данных в условиях того, что этот большой объем расположен на большом количестве серверов? Очевидные проблемы, которые могут возникнуть при данных условиях:

  • устройство хранения может стать узким местом, так как сеть не резиновая (источников много, а устройство хранения -- одно)

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

При бэкапе базы данных важным моментом является то, что снять его (бэкап) желательно за оптимальный срок (чем быстрее - тем лучше, но не стоит забывать о том, что сервис не должен страдать во время бэкапа).

Взяв на вооружение данные факты, Савелий пришел ко мнению о том, что необходимо выстраивать очередь бэкапа. И вот какую приоритизацию он придумал: сначала всегда бэкапились мелкие базы, потом крупные, чтобы при появлении окна для бэкапа за это время проходила как можно большая часть работы. Длительные процессы оставались на потом и не держали в очереди всё остальное.

Глава 6, в которой Савелий не может жить без уведомлений

Долго ли, коротко ли, но бэкапы Савелий запустил. И больше они сервисам не мешали. Можно расходиться, всё работает.

Но всё оказалось не так просто.

Савелий решил проверить по метрикам, как ведёт себя сервис. Когда приходит бэкап, не начинает ли он, например, отвечать медленнее?

Изучив графики, он увидел, что есть сервисы, которые в процессе работы дампят свои данные на локальный диск. В то время, когда данные дампятся, иногда приходит бэкап и начинает забирать данные, которые на диск ещё не записаны.

Появляется сразу несколько проблем. Главная в бэкап уезжает мусор, так как данные не записались на диск целиком.

Последствия этого:

  • тратится место в хранилище;

  • потребляются ресурсы сети;

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

Отрицательные значения на графике это запись дампа. Зелёные линии бэкап. Как видно, они пересекаются по времени. Помимо того что довольно сильно нагружается дисковая система, ещё и не всегда получается консистентный бэкап.

Тогда Савелий задумался над расписанием и изменил его. На следующем графике видно, что локальные записи дампа сервиса и бэкапа не пересекаются по времени. Никто никому не мешает. Всё хорошо.

Всё сделано, все бэкапится. Савелий научился выявлять пересечения и составлять расписание.

Однако наш герой не мог спокойно спать, потому что не был уверен в том, что с тем, что он забэкапил, всё нормально: можно это достать и что-то с этим сделать.

Как об этом узнать?

Глава 7, в которой необходимо проверять бэкап

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

Шаг 1

Проверяется статус: бэкап завершился со статусом ОК или произошла ошибка. Если ошибка, то разбираемся почему. Если ОК, переходим к следующему шагу.

Шаг 2

Проверка цепочки. Проверяем на каждый момент времени состояние, необходимое для восстановления того или иного бэкапа: присутствуют ли нужные для восстановления данные на сервере хранения, есть ли успешный полный бэкап, потом цепочка живых инкременталов до даты восстановления. Если всё есть, отлично. Если нет, то это проблема. В этом случае происходит возврат на предыдущий шаг. Бэкап сервиса считается невалидным.

Шаг 3

Восстановление. Данные необходимо взять непосредственно из системы хранения, залить их на некий сервер и убедиться в том, что можно достать их из хранилища. Только на этом этапе можно выяснить, сколько данных (мегабайтов/гигабайтов/терабайтов) в час прокачивается при восстановлении из бэкапа.

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

Шаг 4

Запуск сервиса: либо он запускается, либо нет. Если сервис не запустился, это самая большая проблема. Значит, надо копать глубже.

Когда однажды это произошло, Савелий в очередной раз убедился: недостаточно просто положить данные в бэкап всегда нужно гарантировать их восстановление.

Глава 8, в которой появляется реализация бэкапов с помощью Bareos

Как в каждой правильной сказке, в конце Савелий должен был изобрести свою систему бэкапов, которая удовлетворяла бы всем его требованиям. На этом можно было бы закончить историю словами И жили они долго и счастливо!, но не тут-то было. Жизнь не сказка: работа сама себя не сделает, как и система бэкапов по щелчку из воздуха не появится.

На момент выбора решений было не то чтобы очень много:

  • коммерческие системы резервного копирования (чаще всего на них не хотят тратиться);

  • AMANDA;

  • Bacula;

  • возможно, было что-то ещё, но про это уже никто не помнит.

Савелий решил действовать по хардкору: начал использовать Bacula, а позже Bareos (форк Bacula). Он никогда не искал лёгких путей.

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

Совет 1

Используйте virtual changer (VC). Это не какой-то конкретный инструмент, а целый класс утилит.

Для примера представьте набор сервисов, который мы бэкапим в два пула. Один пул называется SOMETHING-full, второй SOMETHING-incremental. В этом случае можно бэкапить данные в два пула и не переживать о том, что пачка заданий, ожидающих полного бэкапа, встанет в очередь, пока не закончатся инкрементальные бэкапы. Это довольно часто бывает нужно.

Когда идёт набор бэкап-заданий и есть необходимость сделать восстановление, преимущества VC становятся понятны. Без него пришлось бы останавливать все бэкап-задания, монтировать нужные кассеты для восстановления и пытаться восстановиться. Virtual changer позволяет довольно просто осуществлять удаление и добавление кассет, маркировки, очистки, транкейта и пр.

Совет 2

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

Если вы имеете дело с отдельным блочным устройством, экспериментируйте с параметром read ahead. Конечно, всё зависит от того, хватит ли памяти на машине, но в случае восстановления это достаточно сильно помогало Савелию.

Совет 3

Кассеты в Bareos подвержены фрагментации. Если у нас есть некое хранилище и пятьдесять клиентов, которые в один момент времени решили писаться в кассеты одного пула, то получится такая ситуация: сначала запишется кусок первого задания, потом кусок второго, потом, возможно, опять кусок первого, потом третий, четвёртый вразнобой.

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

Второй вариант писать меньше заданий на одну кассету: например, не больше одного. В конечном итоге занимаемое бэкапом место совершенно одинаково при любом подходе.

Совет 4

В Bareos много собственных параметров и крутилок. Крутить можно всё что угодно. Основное, на что Савелий обращает внимание:

  • параметры, которые относятся к Maximum Volume Jobs и Concurrent Jobs, как раз для настройки количества заданий на кассете;

  • параметры, которые касаются block size и file size, влияют на скорость записи бэкапа, если их можно откуда-то линейно быстро читать и быстро писать;

  • параметры, которые дадут чуть больше гарантий того, что будет корректная цепочка бэкапов Max Full Interval;

  • параметры, которые остановят выполнение задачи, если нет подходящей кассеты Max Wait Time;

  • параметры Spool Attributes и Spool Data относятся больше к ленточному бэкапу, чем к файловому, но Савелий считает, что имеет смысл их тоже покрутить.

Всё очень сильно зависит от задачи, которая решается. Поэтому прежде чем изменять параметры, нужно понимать, зачем это делается, и измерять результаты до изменения и после него.

Совет 5

Когда Савелий решил бэкапить все базы по умолчанию, возникла проблема. Раз он бэкапит всё, то правила хранения одинаковые. У Савелия стандартные условия хранения бэкапа баз такие:

  • Full: два последних успешных бэкапа (делается один раз в неделю);

  • Incremental: всё до самого старого Full (делается один раз в сутки).

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

Если нужно хранить дольше, то с этим нужно что-то делать, например бэкапить базы или сервисы дополнительно в другие пулы. Но более правильным решением будет использование copy job (migration, если не хочется занимать в два раза больше места), которая заберёт то, что уже лежит в системе хранения, положит в другой пул и оно будет там жить столько времени, сколько нужно.

Совет 6

Если необходимо забэкапить кусок файловой системы с кучей директорий, миллионами мелких файлов и т. п., то простой вариант Bareos-бэкапа не подходит. Файловый демон будет тратить всё время на процесс построения дерева того, что необходимо забэкапить, а не заниматься копированием бэкапа в хранилище.

Нужно искать другие варианты решения, например:

  • бэкапиться снапшотом;

  • делать бэкап через pipe.

Или рассмотреть вариант не бэкапить Bareos по классической схеме File daemon -> Storage daemon, а придумать другую систему, которая будет заливать необходимые файлы в хранилище. Если выбран такой вариант, то его стоит обозначить как задачу с пустым fileset в Bareos. Нужно это для того, чтобы сведения обо всех бэкапах находились в одном месте.

Совет 7

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

Совет 8

Проверяйте базу Bareos: bareos-dbcheck в помощь. Обратите внимание на DB backend: MySQL, PostgreSQL. Как минимум стоит принять во внимание мнение разработчиков по данному вопросу, чтобы потом не удивляться.

Совет 9

Собирайте логи и метрики: в Elasticsearch, InfluxDB, Prometheus на ваш вкус. Они помогут ответить на кучу вопросов, а при построении бэкапа они возникнут абсолютно точно.

Приблизительно такие графики можно строить, собирая различные метрики:

Данный график показывает, как в течение определённого отрезка времени происходит запись в разные пулы.

Если посмотреть на большой отрезок времени, можно увидеть окна, где бэкап совсем не идёт и где выполняется много процессов, и поменять их местами.

Также будут видны попытки что-то ресторить.

Там, где график идёт вверх и скорость увеличивается, меняли параметр read ahead. В данном случае это изменение стандартного read ahead для блочного устройства.

Можно увидеть, какое количество данных поминутно, по часам сливается в бэкап-систему.

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

Начало работ:

Окончание и результаты работ:

Работы, завершённые с ошибками:

Выводы

Вот и подошла к концу история Савелия. Как известно, сказка ложь, да в ней всегда есть урок для добрых молодцев и девиц. А умение делать выводы по результатам проделанной работы одно из ключевых качеств хорошего инженера. При этом вывод это не обязательно жирная точка, это может быть и промежуточный результат. В нашей истории легко заметить, что Савелий делать выводы умеет. Он не боится трудностей и всегда продолжает совершенствовать свою систему.

Как бы ни менялся мир вокруг, какие бы технологии ни появлялись, данные это основная ценность проекта. Поэтому кто бы когда бы и что бы ни говорил, бэкапы нужны всегда. Бэкапы важны!

Савелий умеет расставлять приоритеты и точно знает, что недостаточно сделать бэкап. Тут-то всё очень просто скопировал и забыл. Важно уметь бэкапы восстанавливать. За восстановлением данных не приходят каждый день/неделю/месяц, но, если пришли, необходимо эти данные предоставить. Восстановление данных из бэкапа это очень важная (если не важнейшая) составляющая системы резервного копирования. Пожалуйста, уделяйте этому процессу достаточно внимания!

Не надо бояться экспериментировать. Хотя Bareos по своей сути довольно консервативен, всегда можно прикрутить что-то сбоку, чтобы сделать возможным и эффективным его использование в современных инфраструктурах. Рано или поздно всё точно получится. Савелий смог и вы сможете!

Внимательный читатель наверняка обратил внимание на то, что в истории не сказано ни слова о необходимости бэкапа базы самого Bareos. Давайте отнесёмся к этому философски и примем за аксиому: бэкап базы системы резервного копирования это само собой разумеющееся условие, без каких бы то ни было исключений.

Подробнее..

Из песочницы WAL-G бэкапы и восстановление СУБД PostgreSQL

14.06.2020 14:16:56 | Автор: admin
Уже давно известно, что делать бэкапы в SQL-дампы (используя pg_dump или pg_dumpall) не самая хорошая идея. Для резервного копирования СУБД PostgreSQL лучше использовать команду pg_basebackup, которая делает бинарную копию WAL-журналов. Но когда вы начнёте изучать весь процесс создания копии и восстановления, то поймёте что нужно написать как минимум пару трёхколёсных велосипедов, чтобы всё это работало и не вызывало у вас боль как сверху, так и снизу. Дабы облегчить страдания был разработан WAL-G.

WAL-G это инструмент, написанный на Golang для резервного копирования и восстановления PostgreSQL баз данных (а с недавнего времени и MySQL/MariaDB, MongoDB и FoundationDB). Он поддерживает работу с хранилищами Amazon S3 (и аналогами, например, Yandex Object Storage), а также Google Cloud Storage, Azure Storage, Swift Object Storage и просто с файловой системой. Вся настройка сводится к простым шагам, но из-за того что статьи о нём разрозненны по интернету нет полного how-to мануала, который бы включал все шаги от и до (на Хабре есть несколько постов, но многие моменты там упущены).

postgresql backup

Данная статья написана в первую очередь чтобы систематизировать свои знания. Я не являюсь DBA и где-то могу выражаться обывательско-разработческим языком, поэтому приветствуются любые исправления!

Отдельно отмечу что всё нижеприведенное актуально и проверено для PostgreSQL 12.3 на Ubuntu 18.04, все команды должны выполняться от привилегированного пользователя.

Установка


В момент написания данной статьи стабильная версия WAL-G v0.2.15 (март 2020). Её мы и будем использовать (но если вы захотите самостоятельно собрать его из master-ветки, то в репозитории на github есть все инструкции для этого). Для скачивания и установки нужно выполнить:

#!/bin/bashcurl -L "https://github.com/wal-g/wal-g/releases/download/v0.2.15/wal-g.linux-amd64.tar.gz" -o "wal-g.linux-amd64.tar.gz"tar -xzf wal-g.linux-amd64.tar.gzmv wal-g /usr/local/bin/

После этого нужно сконфигурировать вначале WAL-G, а потом сам PostgreSQL.

Настройка WAL-G


Для примера хранения бэкапов будет использоваться Amazon S3 (потому что он ближе к моим серверам и его использование обходится очень дёшево). Для работы с ним нужен s3-бакет и ключи доступа.

Во всех предыдущих статьях о WAL-G использовалось конфигурирование с помощью переменных окружения, но с этого релиза настройки можно расположить в .walg.json файле в домашней директории пользователя postgres. Для его создания выполним следующий bash-скрипт:

#!/bin/bashcat > /var/lib/postgresql/.walg.json << EOF{    "WALG_S3_PREFIX": "s3://your_bucket/path",    "AWS_ACCESS_KEY_ID": "key_id",    "AWS_SECRET_ACCESS_KEY": "secret_key",    "WALG_COMPRESSION_METHOD": "brotli",    "WALG_DELTA_MAX_STEPS": "5",    "PGDATA": "/var/lib/postgresql/12/main",    "PGHOST": "/var/run/postgresql/.s.PGSQL.5432"}EOF# обязательно меняем владельца файла:chown postgres: /var/lib/postgresql/.walg.json

Немного поясню по всем параметрам:

  • WALG_S3_PREFIX путь к вашему S3-бакету куда будут заливаться бэкапы (можно как в корень, так и в папку);
  • AWS_ACCESS_KEY_ID ключ доступа в S3 (в случае восстановления на тестовом сервере данные ключи должны иметь ReadOnly Policy! Об этом подробнее написано в разделе про восстановление);
  • AWS_SECRET_ACCESS_KEY секретный ключ в хранилище S3;
  • WALG_COMPRESSION_METHOD метод компрессии, лучше использовать Brotli (так как это золотая середина между итоговым размером и скоростью сжатия/разжатия);
  • WALG_DELTA_MAX_STEPS количество дельт до создания полного бэкапа (позволяют экономить время и размер загружаемых данных, но могут чуть замедлить процесс восстановления, поэтому не желательно использовать большие значения);
  • PGDATA путь к директории с данными вашей базы (можно узнать, выполнив команду pg_lsclusters);
  • PGHOST подключение к базе, при локальном бэкапе лучше делать через unix-socket как в этом примере.

Остальные параметры можно посмотреть в документации: https://github.com/wal-g/wal-g/blob/v0.2.15/PostgreSQL.md#configuration.

Настройка PostgreSQL


Чтобы архиватор внутри базы сам заливал WAL-журналы в облако и восстанавливался из них (в случае необходимости) нужно задать несколько параметров в конфигурационном файле /etc/postgresql/12/main/postgresql.conf. Только для начала вам нужно убедиться, что никакие из нижеприведенных настроек не заданы в какие-то другие значения, чтобы при перезагрузке конфигурации СУБД не упала. Добавить эти параметры можно с помощью:

#!/bin/bashecho "wal_level=replica" >> /etc/postgresql/12/main/postgresql.confecho "archive_mode=on" >> /etc/postgresql/12/main/postgresql.confecho "archive_command='/usr/local/bin/wal-g wal-push \"%p\" >> /var/log/postgresql/archive_command.log 2>&1' " >> /etc/postgresql/12/main/postgresql.confecho archive_timeout=60 >> /etc/postgresql/12/main/postgresql.confecho "restore_command='/usr/local/bin/wal-g wal-fetch \"%f\" \"%p\" >> /var/log/postgresql/restore_command.log 2>&1' " >> /etc/postgresql/12/main/postgresql.conf# перезагружаем конфиг через отправку SIGHUP сигнала всем процессам БДkillall -s HUP postgres

Описание устанавливаемых параметров:

  • wal_level сколько информации писать в WAL журналы, replica писать всё;
  • archive_mode включение загрузки WAL-журналов используя команду из параметра archive_command;
  • archive_command команда, для архивации завершённого WAL-журнала;
  • archive_timeout архивирование журналов производится только когда он завершён, но если ваш сервер мало изменяет/добавляет данных в БД, то имеет смысл выставить тут лимит в секундах, по истечению которого команда архивации будет вызвана принудительно (у меня интенсивная запись в базу каждую секунду, поэтому я отказался от установки этого параметра в продакшене);
  • restore_command команда восстановления WAL-журнала из бэкапа, будет использоваться в случае если в полном бэкапе (base backup) будет недоставать последних изменений в БД.

Подробнее обо всех этих параметрах можно прочитать в переводе официальной документации: https://postgrespro.ru/docs/postgresql/12/runtime-config-wal.

Настройка расписания резервного копирования


Как ни крути, но самым удобным способом для запуска является cron. Именно его мы и настроим для создания резервных копий. Начнём с команды создания полного бэкапа: в wal-g это аргумент запуска backup-push. Но для начала лучше выполнить эту команду вручную от пользователя postgres, чтобы убедиться что всё хорошо (и нет каких-то ошибок доступа):

#!/bin/bashsu - postgres -c '/usr/local/bin/wal-g backup-push /var/lib/postgresql/12/main'

В аргументах запуска указан путь к директории с данными напоминаю что его можно узнать, выполнив pg_lsclusters.

Если всё прошло без ошибок и данные загрузились в хранилище S3, то далее можно настроить периодический запуск в crontab:
#!/bin/bashecho "15 4 * * *    /usr/local/bin/wal-g backup-push /var/lib/postgresql/12/main >> /var/log/postgresql/walg_backup.log 2>&1" >> /var/spool/cron/crontabs/postgres# задаем владельца и выставляем правильные права файлуchown postgres: /var/spool/cron/crontabs/postgreschmod 600 /var/spool/cron/crontabs/postgres

В данном примере процесс бэкапа запускается каждый день в 4:15 утра.

Удаление старых резервных копий


Скорее всего вам не нужно хранить абсолютно все бэкапы с мезозойской эры, поэтому будет полезно периодически подчищать ваше хранилище (как полные бэкапы, так и WAL-журналы). Мы сделаем это всё также через cron задачу:

#!/bin/bashecho "30 6 * * *    /usr/local/bin/wal-g delete before FIND_FULL $(date -d '-10 days' '+%FT%TZ') --confirm >> /var/log/postgresql/walg_delete.log 2>&1" >> /var/spool/cron/crontabs/postgres# ещё раз задаем владельца и выставляем правильные права файлу (хоть это обычно это и не нужно повторно делать)chown postgres: /var/spool/cron/crontabs/postgreschmod 600 /var/spool/cron/crontabs/postgres

Cron будет выполнять эту задачу каждый день в 6:30 утра, удаляя всё (полные бэкапы, дельты и WALы) кроме копий за последние 10 дней, но оставит как минимум один бэкап до указанной даты, чтобы любая точка после даты попадала в PITR.

Восстановление из резервной копии


Ни для кого не секрет что залог здоровой базы в периодическом восстановлении и проверке целостности данных внутри. Как восстановиться с помощью WAL-G расскажу в этом разделе, а о проверках поговорим после.

Отдельно стоит отметить что для восстановления на тестовом окружении (всё то, что не production) нужно использовать Read Only аккаунт в S3, чтобы случайно не перезаписать бэкапы. В случае с WAL-G нужно задать пользователю S3 следующие права в Group Policy (Effect: Allow): s3:GetObject, s3:ListBucket, s3:GetBucketLocation. И, конечно, предварительно не забыть выставить archive_mode=off в файле настроек postgresql.conf, чтобы ваша тестовая база не захотела сбэкапиться по-тихому.

Восстановление производится лёгким движением руки с удалением всех данных PostgreSQL (в том числе пользователей), поэтому, пожалуйста, будьте предельно аккуратны когда будете запускать следующие команды.

#!/bin/bash# если есть балансировщик подключений (например, pgbouncer), то вначале отключаем его, чтобы он не нарыгал ошибок в логservice pgbouncer stop# если есть демон, который перезапускает упавшие процессы (например, monit), то останавливаем в нём процесс мониторинга базы (у меня это pgsql12)monit stop pgsql12# или останавливаем мониторинг полностьюservice monit stop# останавливаем саму базу данныхservice postgresql stop# удаляем все данные из текущей базы (!!!); лучше предварительно сделать их копию, если есть свободное место на дискеrm -rf /var/lib/postgresql/12/main# скачиваем резервную копию и разархивируем еёsu - postgres -c '/usr/local/bin/wal-g backup-fetch /var/lib/postgresql/12/main LATEST'# помещаем рядом с базой специальный файл-сигнал для восстановления (см. https://postgrespro.ru/docs/postgresql/12/runtime-config-wal#RUNTIME-CONFIG-WAL-ARCHIVE-RECOVERY ), он обязательно должен быть создан от пользователя postgressu - postgres -c 'touch /var/lib/postgresql/12/main/recovery.signal'# запускаем базу данных, чтобы она инициировала процесс восстановленияservice postgresql start

Для тех, кто хочет проверять процесс восстановления ниже подготовлен небольшой кусок bash-магии, чтобы в случае проблем в восстановлении скрипт упал с ненулевым exit code. В данном примере делается 120 проверок с таймаутом в 5 секунд (всего 10 минут на восстановление), чтобы узнать удалился ли сигнальный файл (это будет означать что восстановление прошло успешно):

#!/bin/bashCHECK_RECOVERY_SIGNAL_ITER=0while [ ${CHECK_RECOVERY_SIGNAL_ITER} -le 120 ]do    if [ ! -f "/var/lib/postgresql/12/main/recovery.signal" ]    then        echo "recovery.signal removed"        break    fi    sleep 5    ((CHECK_RECOVERY_SIGNAL_ITER+1))done# если после всех проверок файл всё равно существует, то падаем с ошибкойif [ -f "/var/lib/postgresql/12/main/recovery.signal" ]then    echo "recovery.signal still exists!"    exit 17fi

После успешного восстановления не забудьте запустить обратно все процессы (pgbouncer/monit и тд).

Проверка данных после восстановления


Обязательно нужно проверить целостность базы после восстановления, чтобы не возникло ситуации с побитой/кривой резервной копией. И лучше делать это с каждым созданным архивом, но где и как зависит только от вашей фантазии (можно поднимать отдельные сервера на почасовой оплате или запускать проверку в CI). Но как минимум необходимо проверять данные и индексы в базе.

Для проверки данных достаточно прогнать их через дамп, но лучше чтобы при создании базы у вас были включены контрольные суммы (data checksums):

#!/bin/bashif ! su - postgres -c 'pg_dumpall > /dev/null'then    echo 'pg_dumpall failed'    exit 125fi

Для проверки индексов существует модуль amcheck, sql-запрос к нему возьмём из тестов WAL-G и вокруг выстроим небольшую логику:

#!/bin/bash# добавляем sql-запрос для проверки в файл во временной директорииcat > /tmp/amcheck.sql << EOFCREATE EXTENSION IF NOT EXISTS amcheck;SELECT bt_index_check(c.oid), c.relname, c.relpagesFROM pg_index iJOIN pg_opclass op ON i.indclass[0] = op.oidJOIN pg_am am ON op.opcmethod = am.oidJOIN pg_class c ON i.indexrelid = c.oidJOIN pg_namespace n ON c.relnamespace = n.oidWHERE am.amname = 'btree'AND c.relpersistence != 't'AND i.indisready AND i.indisvalid;EOFchown postgres: /tmp/amcheck.sql# добавляем скрипт для запуска проверок всех доступных баз в кластере# (обратите внимание что переменные и запуск команд  экранированы)cat > /tmp/run_amcheck.sh << EOFfor DBNAME in \$(su - postgres -c 'psql -q -A -t -c "SELECT datname FROM pg_database WHERE datistemplate = false;" ')do    echo "Database: \${DBNAME}"    su - postgres -c "psql -f /tmp/amcheck.sql -v 'ON_ERROR_STOP=1' \${DBNAME}" && EXIT_STATUS=\$? || EXIT_STATUS=\$?    if [ "\${EXIT_STATUS}" -ne 0 ]    then        echo "amcheck failed on DB: \${DBNAME}"        exit 125    fidoneEOFchmod +x /tmp/run_amcheck.sh# запускаем скрипт/tmp/run_amcheck.sh > /tmp/amcheck.log# для проверки что всё прошло успешно можно проверить exit code или grepнуть ошибкуif grep 'amcheck failed' "/tmp/amcheck.log"then    echo 'amcheck failed: '    cat /tmp/amcheck.log    exit 125fi

Резюмируя


Выражаю благодарность Андрею Бородину за помощь в подготовке публикации и отдельное спасибо за его вклад в разработку WAL-G!

На этом данная заметка подошла к концу. Надеюсь что смог донести легкость настройки и огромный потенциал для применения этого инструмента у вас в компании. Я очень много слышал о WAL-G, но никак не хватало времени сесть и разобраться. А после того как внедрил его у себя из меня вышла эта статья.

Отдельно стоит заметить, что WAL-G также может работать со следующими СУБД:

Подробнее..

Перевод Какие возможности появились у утилиты rdiff-backup благодаря миграции на Python 3

22.09.2020 10:23:41 | Автор: admin
В процессе миграции на Python 3 разработчики утилиты rdiff-backup усовершенствовали её, добавив много новых фич.



В марте 2020 года вышел второй крупный релиз утилиты rdiff-backup. Второй за 11 лет. Во многом, это объясняется прекращением поддержки Python 2. Разработчики решили совместить приятное с полезным и доработали функционал утилиты.

Около 20 лет она верой и правдой служит Linux-сообществу помогает делать бэкапы на локальных и удалённых машинах, скажем так без лишней головной боли. Секрет прост: утилита позволяет делать бэкап только тех файлов, которые изменились с прошлого резервного копирования. Для более краткого обозначения этого процесса существует термин инкрементальное резервное копирование.

Второе рождение rdiff-backup пережила благодаря команде энтузиастов, которую возглавили Эрик Зольф и Патрик Дюфресне из IKUS Software, а также Отто Кекяляйнен из Seravo.


Новые фичи


Проект переехал в новый репозиторий и предлагает всем желающим стать контрибьюторами. Команда внесла в новый релиз все полезные доработки, которые появлялись в течение прошедших 11 лет. Среди них поддержка разрежённых файлов и баг-фиксы для жёстких ссылок.

Автоматизация на базе Travis CI


Другое важнейшее улучшение это конвейер CI/CD на базе распределённого веб-сервиса Travis CI. Теперь пользователи смогут запускать rdiff-backup в различных тестовых средах без риска сломать работающий проект. Конвейер CI/CD позволит выполнять автоматизированную сборку и доставку для всех основных платформ.

Простая установка с помощью yum и apt


Новая версия работает на большинстве ОС семейства Linux Fedora, Red Hat, Elementary, Debian и многих других. Разработчики постарались подготовить все необходимые открытые репозитории для лёгкого доступа к утилите. Установить rdiff-backup можно с помощью менеджера пакетов или пошаговой инструкции на GitHub-странице проекта.

Новый дом


Сайт проекта переехал с Savannah на GitHub Pages (rdiff-backup.net), разработчики обновили контент и дизайн сайта.

Как работать с rdiff-backup


Если вы познакомились с rdiff-backup только сейчас, вы удивитесь, насколько он прост в использовании. Разработчики позаботились о том, чтобы вы чувствовали себя комфортно: по их мнению, подобные утилиты не должны отвлекать своей сложностью от таких важных процессов, как подготовка бэкапа или планирование восстановления данных.

Бэкап


Чтобы запустить бэкап на локальном диске (например, USB), введите команду rdiff-backup, затем имя источника (откуда будете копировать файлы) и путь к каталогу, в который вы планируете сохранить их.

Например, чтобы сделать бэкап на локальном диске с именем my_backup_drive, введите:

$ rdiff-backup /home/tux/ /run/media/tux/my_backup_drive/

Для сохранения файлов во внешнем хранилище введите путь к удалённому серверу вместе со знаком ::

$ rdiff-backup /home/tux/ tux@example.com::/my_backup_drive/

Вероятно, ещё вам потребуются SSH ключи для доступа на сервер.

Восстановление файлов из бэкапа


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

Тут нам на помощь придут команды копирования cp для локального диска и scp для удалённого сервера.

Для локального диска нужно написать, например, такое:

$ cp _run_media/tux/my_backup_drive/Documents/example.txt \ ~/Documents

Для удалённого сервера:

$ scp tux@example.com::/my_backup_drive/Documents/example.txt \ ~/Documents

У команды rdiff-backup есть опции, которые позволяют настроить параметры копирования. Например, --restore-as-of даёт возможность указать, какую версию файла нужно восстановить.

Допустим, вы хотите восстановить файл в том состоянии, в котором он был 4 дня назад:

$ rdiff-backup --restore-as-of 4D \ /run/media/tux/foo.txt ~/foo_4D.txt

Или, может быть, вам нужна последняя версия:

$ rdiff-backup --restore-as-of now \ /run/media/tux/foo.txt ~/foo_4D.txt

Вы видите, что работать с rdiff-backup достаточно легко. У этой утилиты много настроек и возможностей. Например, вы можете исключать отдельные файлы из списка для бэкапа, делать резервное копирование с одного удалённого сервера на другой и так далее. С описанием всех её возможностей вы можете ознакомиться на странице с документацией.



На правах рекламы


Наши эпичные серверы используют only NVMe сетевое хранилище с тройной репликацией данных, надёжность на высоте! Вы можете использовать сервер не только для размещения своих проектов и любой информации, но и для хранения бэкапов важных данных с локальных машин или других серверов. К тому же, есть возможность делать резервные копии образа виртуального сервера в автоматическом или ручном режиме.

Подробнее..

Eще один бэкап больше, чем скрипт, проще, чем система

28.07.2020 10:08:24 | Автор: admin
Систем резервного копирования множество, но что делать, если обслуживаемые сервера разбросаны по разным регионам и клиентам и нужно обходиться средствами операционной системы?



Добрый день, Habr!
Меня зовут Наталья. Я тимлид группы администраторов приложений в НПО Криста. Мы Ops для группы проектов нашей компании. У нас довольно своеобразная ситуация: мы устанавливаем и сопровождаем наше ПО как на серверах нашей компании, так и на серверах, расположенных у клиентов. При этом бэкапить сервер целиком нет необходимости. Важны лишь существенные данные: СУБД и отдельные каталоги файловой системы. Конечно, клиенты имеют (или не имеют) свои регламенты резервного копирования и часто предоставляют некое внешнее хранилище для складывания туда резервных копий. В этом случае после создания бэкапа мы обеспечиваем отправку во внешнее хранилище.

Какое-то время для целей бэкапа мы обходились bash-скриптом, но по мере разрастания вариантов настроек пропорционально росла и запутанность этого скрипта, и в один прекрасный момент мы пришли к необходимости его разрушить до основанья, а затем.....

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

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

Условия задачи были следующие:
1. базовый инстанс бэкапа автономен, работает локально
2. хранение резервных копий и логов всегда в пределах сети клиента
3. инстанс состоит из модулей такой своеобразный конструктор
4. необходима совместимость с используемыми дистрибутивами Linux, включая устаревшие, желательна потенциальная кроссплатформенность
5. для работы с инстансом достаточно доступа по ssh, открытие дополнительных портов необязательно
6. максимальная простота настройки и эксплуатации
7. возможно (но не обязательно) существование отдельного инстанса, позволяющего централизованно просмотреть состояние бэкапов с разных серверов

То, что у нас получилось, можно посмотреть здесь: github.com/javister/krista-backup
ПО написано на python3; работает на Debian, Ubuntu, CentOS, AstraLinux 1.6.
Документация выложена в каталоге docs репозитария.

Основные понятия, которыми оперирует система:
action действие, реализующее одну атомарную операцию (бэкап БД, бэкап каталога, перенос из каталога А в каталог Б и т. д.). Существующие actions лежат в каталоге core/actions
task задание, набор actions, описывающий одну логическую задачу бэкапа
schedule расписание, набор task с опциональным указанием времени выполнения задачи

Конфигурация бэкапа хранится в yaml-файле; общая структура конфига:
общие настройки
раздел actions: описание действий, используемых на этом сервере
раздел schedule: описание всех заданий (наборов действий) и расписание их запуска по крону, если такой запуск требуется
Пример конфига можно посмотреть здесь: github.com/javister/krista-backup/blob/master/KristaBackup/config.yaml.example

Что умеет приложение на текущий момент:
поддерживаются основные для нас операции: бэкап PostgreSQL, бэкап каталога файловой системы через tar; операции с внешним хранилищем; rsync между каталогами; ротация бэкапов (удаление старых копий)
вызов внешнего скрипта
выполнение вручную отдельного задания
/opt/KristaBackup/KristaBackup.py run make_full_dump

можно добавить (или убрать) в кронтабе отдельное задание или все расписание
/opt/KristaBackup/KristaBackup.py enable all

генерация триггер-файла по результатам бэкапа. Эта функция полезна в связке с Zabbix для мониторинга бэкапов
может работать в фоне в режиме webapi или web
/opt/KristaBackup/KristaBackup.py web start [--api]


Разница между режимами: в webapi нет собственно веб-интерфейса, но приложение отвечает на запросы другого инстанса. Для режима web нужно установить flask и несколько дополнительных пакетов, а это не везде приемлемо, например в сертифицированной AstraLinux SE.

Через веб-интерфейс можно посмотреть состояние и логи бэкапов подключенных серверов: веб-инстанс запрашивает данные с бэкап-инстансов через API. Доступ к web требует авторизации, доступ к webapi нет.



Логи некорректно прошедших бэкапов размечаются цветом: warning желтым, error красным.





Если администратору не нужна шпаргалка по параметрам и серверные ОС однородны, можно скомпилировать файл и распространять уже готовый пакет.

Распространяем мы эту утилиту в основном через Ansible, выкатывая сначала на часть наименее важных серверов, а после тестирования на все остальные.

В итоге мы получили компактную автономную утилиту копирования, поддающуюся автоматизации и пригодную для эксплуатации даже малоопытными администраторами. Нам удобно может, пригодится и вам?
Подробнее..

Итоги конкурса Acronis True Image 2021 и еще немного о защите

28.08.2020 16:14:16 | Автор: admin
Вот и пришло время подвести итоги конкурса, который мы объявили 21 августа в посте, посвященном анонсу Acronis True Image 2021. Под катом имена победителей, а также еще немного информации о продукте и о потребностях в защите для персональных пользователей.

image

Прошлый пост, в котором мы рассказали о новшествах Acronis True Image 2021, вызвал достаточно большой отклик. Однако в комментариях были не только истории о реальных факапах с потерей данных, но также ряд вопросов, которые, судя по всему, волнуют многих. Поэтому сегодня мы ответим на основные из них и перейдем к чествованию победителей конкурса эпических фейлов.

Свой путь к российским пользователям


Сразу несколько хабровчан отметили, что ATI нельзя купить на глобальном сайте, если вы из России. И это чистая правда, потому что разработкой и локализацией Acronis True Image в России занимается ООО Акронис Инфозащита. Это российская компания, которая адаптирует технологии защиты данных и поддерживает продукт для российских пользователей. Версия Acronis True Image 2021 для российского рынка будет доступна осенью

image

С антивирусом?


В состав Acronis True Image входит антивирусная защита, но это не отдельный продукт, а встроенный в решение движок, который дополняет систему защиты данных. Возможность перехвата вирусов, шифровальщиков и других видов вредоносного ПО помогает не допустить незаметной порчи данных и удаления резервных копий, а также помогает автоматически восстановить оригинальные файлы в случае их повреждения.

Внедрение дополнительной защиты в продукт стало результатом реализации концепции SAPAS, включающей в себя 5 векторов киберзащиты безопасность, доступность, приватность, аутентичность и защищенность данных (SAPAS Safety, Accessibility, Privacy, Authenticity, Security). Таким образом удается дополнительно обезопасить информацию пользователей от порчи или утраты.

image

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

Победители!


Что же, с формальностями мы разобрались. И теперь, та-да-ам! Пришло время наградить наших победителей. В комментариях своими историями поделились 8 человек:

  • s37 рассказал о том, как важно наличие бэкапа для систем видеонаблюдения, и как можно упустить подозреваемого в краже, если не сохранить вовремя данные с дисков в надежное место
  • shin_g поведал трогательную историю о потере игровых сейвов в далеком 2004 году. Наличие бэкапа, но не регулярного привело недавно к потере xls-таблицы c домашним бюджетом и историей покупок за несколько лет, а также библиотеки iTunes, в которой уже были отмечены в избранное более половины из ~10000 треков.
  • wmgeek рассказал о том, как злой шифровальщик прятался в установщике взломанного ПО Acronis. В результате были зашифрованы документы пользователя, и он стал загружать только лицензионное ПО.
  • CaptainFlint отметил, что важно не только иметь бэкапы, но и хранить их достаточно долгое время. Он бэкапил почтовую базу в Backblaze, но после крэша компьютера узнал, что часть диска была испорчена раньше, чем упала вся система. Но время хранения старых версий в базовом тарифе сервиса составляло всего один месяц, и часть писем оказалась безвозвратно утеряна. Буду апгрейдить тариф до годового срока хранения.
  • sukhe рассказал студенческую историю с отключением электричества в аудитории рубильником.
  • wyp4ik признался, что факапов с данными было много, но больше всего ему запомнилась атака трояна-шифровальщик Dharma на большую контору, состоящую из микропредприятийю. В итоге было зашифровано 5 сетевых папок разных микропредприятий и для некоторых сотрудников были потеряны файлы за 5 лет работы некоторых сотрудников. При этом для тех ПК, на которых стоял Acronis, все кончилось благополучно.
  • drWhy поделился опытом сложностей организации ручного резервного копирования в офисных условиях
  • ByashaCat рассказал об атаке почтового шифровальщика, а также об отсутствии денег у подростка на нормальный антивирус и вредоносное ПО в торрентах

Мы обещали наградить троих лучших, но нам, увы, не удалось выбрать их из 8 претендентов. Поэтому общим собранием было принято решение наградить всех! Так что стучитесь в личку, дорогие победители! Мы пришлем вам ключ от продукта.
Подробнее..

Backup as a Service три пути решения одной задачи

05.02.2021 18:14:24 | Автор: admin

Перефразируя известного киногероя, Бэкапы это хорошо. Бэкапы это надежно. И чем больше опций для создания резервных копий есть у провайдера, тем лучше: клиенты получают возможность выбрать ровно то, что требуется бизнесу, ни больше, ни меньше.

В облаках ИТ-ГРАД и #CloudMTS мы развернули сразу три сервиса резервного копирования: на базе Veeam, Acronis Infoprotect и Commvault. С их помощью можно собрать решение под любую задачу. Под катом поговорим о причинах появления такого разнообразия и разберем, какие задачи пользователь может решать с помощью того или иного сервиса.

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

Veeam

Veeam стал первым внедренным нами сервисом резервного копирования данных в рамках IaaS. Сейчас порядка 70% наших клиентов пользуются именно им. С его помощью можно бэкапить как инфраструктуру в облаке, так и локальные площадки.

Резервное копирование IaaS

Резервное копирование с площадки клиента

Veeam Basic Backup

Veeam Self-Service

Veeam Cloud Connect

Veeam Agent

Резервное копирование IaaS

Самый джентльменский сервис в нашем пуле базовый бэкап на Veeam. Это простое решение всё из коробки, не требующее дополнительных настроек. При подключении услуги всем ВМ клиента автоматически назначается единая политика резервного копирования:

  • ежедневная инкрементная резервная копия;

  • еженедельная полная копия;

  • срок хранения 14 дней.

Доступа к порталу управления у пользователей базового бэкапа нет, поэтому процедура восстановления осуществляется по заявке в саппорт. Как правило, запрос на восстановления выполняется в течение рабочего дня.

Кому подходит: небольшим проектам, для которых гибко настраиваемое резервное копирование не принципиально. С одной стороны, данные виртуальных машин сохраняются и могут быть восстановлены в случае ЧП. С другой отсутствует возможность гибко вносить изменения. Однако в любой момент можно перейти с базового бэкапа на использование более продвинутых решений.

Если базового бэкапа мало, можно перейти на Veeam Self-Service и управлять всеми задачами резервного копирования и восстановлением через веб-портал самообслуживания, интегрированный с vCloud Director

Через портал Self-Service можно настраивать:

  • наименования заданий, количество точек восстановления и глубину хранения;

  • график запуска заданий, количество попыток выполнения и время между попытками, окно для резервного копирования;

  • ВМ/vApp, которые нужно бэкапить в рамках конкретного задания;

  • папки и файлы, который нужно включить или исключить из заданий;

  • уведомленияи многое другое.

Отметим, что для заказчиков, арендующих инфраструктуру в защищенном сегменте, развернута отдельная инсталляция сервиса. Решение в Облаке ФЗ-152 функционально идентично тому, что размещено в публичном, за исключением опции базового бэкапа. По очевидным причинам в защищенном сегменте облака провайдер не имеет права работать с данными за клиента даже с точки зрения резервного копирования.

Резервное копирование с площадки клиента

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

  1. C помощью Veeam Cloud Connect Backup, если у клиента уже есть сервер Veeam Backup & Replication не ниже версии Enterprise в рамках собственной инфраструктуры.

    VCC позволяет бекапить:

    • физические серверы с ОС Windows и Linux;

    • виртуальные машины на базе VMware и Hyper-V;

    • рабочие станции на Windows и Linux.

  2. С помощью Veeam Agent, если сервер Veeam B&R отсутствует. Агенты также позволяют бэкапить физические сервера, ВМ и клиентские машины, но только с Windows.

Дополнительные фичи

Если на стороне клиента есть Veeam B&R, можно реализовать DR-сценарии. Veeam Cloud Connect Replication позволяет быстро переключаться как на уровне отдельных виртуальных машинам, так на уровне всей площадки. После активации реплик в облаке запустятся копии ВМ, соответствующие по состоянию последним репликам.

Для кого подходит: Veeam Enterprise Manager позволяет закрыть сразу множество типовых клиентских задач: полноценная интеграция сервиса резервного копирования с облаком, копирование с площадки клиента в облачный репозиторий, DR и т.п. Это весьма практичное и универсальное решение, которое подходит подавляющему большинству заказчиков.

Тем не менее, Veeam не позволяет осуществлять кроссплатформенную миграцию и в рамках агентского бэкапа ОС поддерживает только Microsoft Windows.

Acronis Infoprotect

При всей своей гибкости и универсальности решение Veeam подходит не всем заказчикам. Если в крупном и среднем сегменте его использование оказывалось выгодным, то небольшим компаниям требовалась альтернатива с хорошим соотношением цена/качество. Мы проанализировали запросы таких клиентов и добавили в свой пул решение Acronis Infoprotect.

По возможностям копирования БД и приложений продукт Acronis близок к описанному выше Veeam. Однако Acronis Infoprotect:

  • дешевле;

  • без агента бэкапит ВМ множества платформ (VMware, Hyper-V, Virtuozzo, KVM, RHEV, Citrix XenServer, Nutanix AHV, Oracle VM при наличии доступа к гипервизору);

  • в рамках агентского бэкапа работает не только с Windows, но и с Linux и macOS;

  • умеет защищать от вредоносного ПО (в т.ч. от майнеров и вымогателей) выявляет нетипичную активность, блокирует попытки изменения файлов и автоматически восстанавливает их, если что-то повредить удалось;

  • поддерживает кроссплатформенную миграцию.

Для кого подходит: Acronis Infoprotect закрывает практически все задачи малого и среднего бизнеса. Заказчики могут без проблем бэкапить данные с собственных площадок в облако, даже если в компании нет выделенного специалиста под эти задачи с веб-интерфейсом Acronis Infoprotect легко подружиться, имея минимум технический знаний.

Кроссплатформенная миграция

Очень часто клиенты после некоторого времени использования нашего облака в качестве площадки для хранения данных переносили к нам свою инфраструктуру. На такой случай в арсенале Acronis имеется одна полезная функция Universal Restore. С ее помощью можно переводить физические серверы в облачные или мигрировать между разными гипервизорами. Для миграции заказчику достаточно сделать резервную копию и восстановиться в облаке.

Commvault

Это серьезное и многопрофильное решение Enterprise-уровня. Оно умеет работать как с инфраструктурой в облаке провайдера, так и с собственными площадками заказчика.

Commvault позволяет восстанавливать любые элементы инфраструктуры (от отдельных файлов до платформ и ИС), реализовать DR-сценарии, мигрировать между платформами.

Отдельно стоит рассказать о том, с чем умеет работать Commvault:

  • базы данных: Oracle, Microsoft SQL, MySQL, IBM DB2, MongoDB, PostgreSQL, Cassandra, DB2, Documentum, Hadoop, Informix, SAP for HANA, SAP MaxDB, SAP for Oracle, SQL Server, Sybase.

  • ОС (в рамках агентского бэкапа): Windows, Linux, Mac, Unix, FreeBSD, Solaris, NetWare;

  • платформы: VMware, Hyper-V, Azure Stack, OpenStack-KVM, Citrix XenServer, Huawei FusionCompute, Nutanix AHV, Oracle, Red Hat Virtualization;

  • приложения: Microsoft: Exchange, Active Directory, SharePoint, Office 365, Skype for Business; Lotus: Notes Database/Document, Domino; SAP; EMC Documentum, Cloud Apps.

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

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

Сравним функционал и возможности всех рассмотренных сегодня продуктов.

Veeam

Commvault

Acronis Infoprotect

Панель управления

Бэкап в сегменте ФЗ-152

DR

Резервное копирование, интегрированное в облако провайдера

Дополнительное хранение резервных копий на площадке клиента

Резервное копирование с площадки клиента в облако

Поддержка ОС (агентский бэкап)

Windows

Windows, Linux, Mac, Unix, FreeBSD, Solaris, NetWare

Windows, Linux, Mac

Кроссплатформенная миграция

Поддержка платформ

VMware, Hyper-V

VMware, Hyper-V, Azure Stack, OpenStack-KVM, Citrix XenServer, Huawei FusionCompute, Nutanix AHV, Oracle, Red Hat Virtualization

VMware, Hyper-V, Virtuozzo, KVM, RHEV, Citrix XenServer, Nutanix AHV, Oracle VM

Хранение копий в нескольких ЦОД

Защита от программ-вымогателей

Дедупликация

Резервное копирование БД

Oracle, SQL Server

Oracle, Microsoft SQL, MySQL, IBM DB2, MongoDB, PostgreSQL, Cassandra, DB2, Documentum, Hadoop, Informix, SAP for HANA, SAP MaxDB, SAP for Oracle, SQL Server, Sybase

Oracle, SQL Server

Резервное копирование приложений

Office 365, MS Exchange, MS SharePoint

Microsoft: Exchange, Active Directory, SharePoint, Office 365, Skype for Business; Lotus: Notes Database/Document, Domino; SAP; EMC Documentum, Cloud Apps

MS Exchange, MS SharePoint, Active Directory

Итог

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

Стартапам и малому бизнесу, в котором вопрос хранения резервных копий практически не стоит, подойдет базовый пакет на основе решения Veeam.

Резервное копирование Acronis Infoprotect бюджетное решение, которое сможет удовлетворить задачам малого и среднего бизнеса. К тому же, продукт включает несколько удобных дополнительных функций.

Если у компании уже есть сервер Veeam Backup and Replication резервные копии для большей надежности могут дополнительно храниться в облаке провайдера. Либо они полностью перенесены в облачный репозиторий для минимизации трат на закупку оборудования для локального хранения бэкапов.

Полнофункциональный продукт на основе Veeam Enterprise Manager подойдет среднему и крупному бизнесу с серьезными бэкап-запросами, уже перенесшего инфраструктуру в облако провайдера.

Решение на базе Commvault это дорогой серьезный продукт, ориентированный на большие компании со специфическими требованиями к организации резервного копирования.

Подробнее..

Перевод Как и зачем хранить домашние каталоги пользователей в Git-репозиториях

08.04.2021 12:19:54 | Автор: admin

В этой статье расскажу, как с помощью Git я управляю файлами в своём домашнем каталоге и синхронизирую их на других устройствах.

У меня несколько устройств: лэптоп на работе, стационарный комп дома, Raspberry Pi, портативный компьютер Pocket CHIP, а также Chromebook с несколькими версиями Linux на борту. Давно хотел, чтобы на таких разных устройствах я мог выполнять примерно одинаковые действия для настройки окружений. Поначалу я просто не знал, как этого добиться. Например, команды Bash alias я чаще использовал на работе, а многие вспомогательные скрипты хорошо работали в моём домашнем окружении.

С годами грань между моими рабочими и домашними устройствами начала стираться. Задач стало больше, увеличился и объём разнородных неупорядоченных данных в домашних каталогах, с которыми надо было как-то разбираться. Я начал испытывать большие трудности например, при работе над одним и тем же проектом на разных устройствах. Как ни странно, мою проблему решил Git.

Да, тот самый Git, который относится к классу распределённых систем управления версиями. Его широко используют крупные и мелкие open source проекты, а также компании, выпускающие проприетарный софт. Сначала я скептически смотрел на эту идею, потому что Git вроде бы создан для управления кодовой базой, а не домашним каталогом с кучей музыки, видео, фото, игр и прочего хлама. Я слышал, что кто-то из знакомых знакомых использует Git для управления файлами в домашнем каталоге. Но, всё же, я долго не решался попробовать. Думал, что таким образом гики просто развлекаются, а для задач обычных пользователей это не годится. Я ошибался.

Мне удалось добиться цели не сразу: пришлось учиться и искать решения по ходу дела. Но теперь я могу поделиться своим опытом, предложив готовые рецепты по управлению домашним каталогом с помощью Git.

1. Продумайте структуру и содержимое каталогов



Изображение: Seth Kenlon, CC BY-SA 4.0

С точки зрения Git ваш домашний каталог становится чем-то вроде слепой зоны для всего, кроме конфигурационных и других выбранных вами файлов. То есть, открыв вашу домашнюю директорию, вы не должны увидеть в корне ничего, кроме заранее сформированного списка каталогов. Там не должно быть никаких фото или документов. И никаких файлов, которые просто полежат тут минутку.

Всё, что вы не коммитите, Git должен игнорировать. Поэтому очень важно, чтобы вы сохраняли эти файлы в подкаталогах, которые нужно добавить в свой файл .gitignore.

Многие Linux-дистрибутивы по умолчанию предлагают примерно такой список подкаталогов внутри /home/<имя пользователя>:

  • Documents
  • Downloads
  • Music
  • Photos
  • Templates
  • Videos

Пользователь, конечно же, может добавить туда и свои подкаталоги. Например, я разделил музыку, которую создаю (папка Music), и музыку, которую покупаю для прослушивания (папка Albums). Точно так же мой каталог Cinema содержит фильмы, которые я смотрю, а Videos видеофайлы, которые мне нужны для монтажа.

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

2. Продумайте содержимое файла .gitignore


Когда вы наведёте порядок в домашнем каталоге, перейдите в него и создайте репозиторий:

$ cd$ git init .

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

$ git status  .AndroidStudio3.2/  .FBReader/  .ICEauthority  .Xauthority  .Xdefaults  .android/  .arduino15/  .ash_history[...]

Если вы долго пользуетесь домашним каталогом, этот список может быть длинным. Для начала добавьте подкаталоги из пункта 1 в скрытый файл с именем .gitignore. Тогда Git не будет отслеживать их:

$ \ls -lg | grep ^d | awk '{print $8}' >> ~/.gitignore

Далее решите, какие из оставшихся файлов будут неотслеживаемыми. Перебирая их, я обнаружил несколько устаревших конфигурационных файлов и каталогов, которые просто засоряли диск. Отдельного внимания заслуживают конфигурационные файлы, сгенерированные автоматически. Например, я оставляю неотслеживаемыми конфиги, которые генерирует KDE. Они хранят данные о недавно открытых документах и прочую информацию, которую имеет смысл хранить локально, только на одной машине.

Я принял решение коммитить мои собственные конфигурационные файлы, скрипты и профили, а также Bash-конфиги, мои конспекты и прочий текст, к которому я часто обращаюсь. Если вдруг я сомневаюсь по поводу какого-то файла, значит, ему место в списке неотслеживаемых. Ну и в любом случае файл .gitignore можно скорректировать позже.

3. Проанализируйте содержимое вашего диска


Для этой цели я использую сканер с открытым исходным кодом Filelight. Он рисует диаграмму, которая позволяет увидеть размер каждого каталога. Вы можете перемещаться по любому каталогу, чтобы понять, почему он столько весит. Если вы делаете такое исследование впервые, это изменит ваше представление о том, как и какие данные хранятся на вашем диске. И, опять же, вы увидите много мусора и сможете удалить его.


Изображение: Seth Kenlon, CC BY-SA 4.0

Если заметите, что некоторые приложения что-то кэшируют на вашем диске, вы сможете исключить эти данные из репозитория. Например, в KDE индексатор файлов Baloo хранит на диске достаточно много данных, которые востребованы лишь локально и совершенно не нужны в репозитории.

4. Делайте коммит .gitignore домашнего каталога


Серия закомиченных файлов .gitignore может многое рассказать о том, как формировалось Git-окружение моей мечты. Я храню его в репозитории вместе с другими важными файлами. Таким образом он доступен со всех моих устройств. И все мои окружения идентичны на уровне домашнего каталога: у них плюс-минус одинаковый набор папок по умолчанию и скрытых файлов конфигурации.

5. Не бойтесь коммитить бинарники


Я тестировал свой велосипед неделями и всё это время был уверен, что коммитить бинарники плохая идея. Боялся, что из-за этого раздуется размер репозитория. У меня даже был скрипт, который вынимал XML из файлов LibreOffice и только после этого делал коммит. Другой скрипт восстанавливал файл LibreOffice из сохранённого XML. Вот так я изворачивался, чтобы экономить дисковое пространство.

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

6. Используйте приватный репозиторий


Не размещайте свой домашний каталог в публичном Git-репозитории. У меня, например, есть SSH-ключи и цепочки ключей GPG, которые обеспечивают мне защищённый доступ.

На Raspberry Pi я развернул локальный Git-сервер, поэтому у меня полный контроль над моей системой. Особенно, когда я дома. Правда, работаю я удалённо, поэтому это удобно. На случай отъезда я сделал себе доступ через мой собственный VPN.

7. Не забывайте делать push


Особенность Git в том, что он отправляет изменения на ваш сервер только тогда, когда вы ему об этом скажете. Если вы давно пользуетесь Git, это для вас, вероятно, вполне естественно. Новым пользователям, которые, возможно, привыкли к автоматической синхронизации в Nextcloud или Syncthing, может понадобиться некоторое время, чтобы привыкнуть.

Git друг человека


Управление моими файлами с помощью Git не только помогло наладить регулярную синхронизацию между устройствами. Сейчас, имея полную историю всех моих конфигураций и служебных скриптов, я могу смело пробовать новые идеи, потому что всегда легко откатить изменения, если что-то пойдёт не так.

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



Маклауд предоставляет недорогие серверы, которые подойдут в том числе для хранения данных. Используем быстрое и надёжное дисковое хранилище на основе дисков NVMe.
Зарегистрируйтесь по вышеуказанной ссылке или кликнув на баннер и получите 10% скидку на первый месяц аренды сервера любой конфигурации!

Подробнее..

Категории

Последние комментарии

  • Имя: Макс
    24.08.2022 | 11:28
    Я разраб в IT компании, работаю на арбитражную команду. Мы работаем с приламы и сайтами, при работе замечаются постоянные баны и лаги. Пацаны посоветовали сервис по анализу исходного кода,https://app Подробнее..
  • Имя: 9055410337
    20.08.2022 | 17:41
    поможем пишите в телеграм Подробнее..
  • Имя: sabbat
    17.08.2022 | 20:42
    Охренеть.. это просто шикарная статья, феноменально круто. Большое спасибо за разбор! Надеюсь как-нибудь с тобой связаться для обсуждений чего-либо) Подробнее..
  • Имя: Мария
    09.08.2022 | 14:44
    Добрый день. Если обладаете такой информацией, то подскажите, пожалуйста, где можно найти много-много материала по Yggdrasil и его уязвимостях для написания диплома? Благодарю. Подробнее..
© 2006-2024, personeltest.ru