Пользователь
0,0
рейтинг
1 декабря 2008 в 17:05

Администрирование → Настройка резервного копирования в Ubuntu

Настройка резервного копирования в Ubuntu за 20 минут.


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

Итак, мы имеем удаленный хост под управлением ubuntu, с некоторым массивом довольно критичных данных. Довольно логичным было бы настроить бэкап прямо на удаленном хосте, с помощью tar по крону, rsyns и т.д. Но, т.к. место на виртуальном выделенном хостинге довольно дорого и использовать его лучше по делу, идеально было бы, чтобы данные автоматически копировались на какую нибудь локальную машину, место на которой хоть отбавляй. В моем случае это файловый сервис в офисе, под управлением все той же Ubuntu.


Подготовка


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

$ ssh-keygen -t dsa

Оставьте папку по-умолчанию, а пароль сделайте пустым.
Эта команда должна создать в папке ~/.ssh(по умолчанию) два файла — private и public key. private предназначается для локальной машины, pub отправляется на удаленный.

Теперь копируем private key в папку /root/.ssh, чтобы пользователь root так мог пользоваться им

$ cd ~/.ssh
$ sudo mkdir /root/.ssh
$ sudo cp id_dsa /root/.ssh


Теперь надо скопировать public key на удаленную машину, с которой мы хотим копировать данные. Предварительно создайте пользователя backup на удаленной машине(команда adduser). Не забудьте дать этому пользователю права на чтение каталогов, которые вы хотите копировать.

$ cat ~/.ssh/id_dsa.pub | ssh backup@remotehost.ru "cat >> ~/.ssh/authorized_keys2"

Теперь можем попробывать зайти через ssh на удаленную машину:

$ ssh backup@remotehost.ru

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

remotehostru$ chmod 700 .ssh
remotehostru$ chmod 400 .ssh/authorized_keys2
remotehostru$ exit


Настройка rsnapshot


rsnapshot — утилита для создания копий состояния файловых систем на базе rsync. Она упрощает создание периодических копий с локальной и удаленных машин по ssh. Она использует, по возможности, жесткие связи, что позволяет существенно уменьшить объем необходимого дискового пространства. (цитата отсюда)

Установка


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

$ sudo apt-get install rsnapshot

Если вы используете не debian-подобный дистрибутив, rsnapshot наверняка тоже есть в репозиториях вашего дистрибутива. Для CentOS, при включенных RPMForge это делается, например, так:

# yum install rsnapshot

Теперь нам нужно создать директорию, где мы собираемся хранить наши «снимки»:

$ sudo mkdir /var/snapshots

Настройка


Теперь можно перейти к настройке, собственно, rsnapshot:

$ sudo nano /etc/rsnapshot.conf

Вместо nano вы можете использовать любой другой редактор, например vi, или gedit, если работаете в GNOME.
Настроить нужно следующие параметры:

snapshot_root - директория, в которую вы хотите сохранять "снимки".

interval xxx yy - ххх - название интервала(например hourly, daily), yy - количество снимков для каждого. Например:
interval hourly 6
interval daily 7


Означает, что мы хотим хранить 6 ежечасных копий и 7 ежемесячных. Если уже доступно указанное количество копий, rsnapshot будет заменить старую более новой.

Расскомментируйте cmd_cp. cmd_ssh расскоментируйте и измените на

cmd_ssh /usr/bin/ssh

Настройка бэкапа осуществляется командой backup <откуда> <куда>:

#Добавляем папку /etc/ с локальной машины в папку localhost/
backup /etc/ local/
#Добавляем папку /var/svn с удаленной машины в папку remotehost/
backup backup@remotehost.ru:/var/svn/ remotehost/


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

Пробный запуск


Запустим rsnapshot:
$ rsnapshot hourly

Второй параметр означает интервал, который мы задали в конфигурационном файле.
Команда может выполняется продолжительное время. После выполнения, смотрим, что она создала:
$ ls -l /var/snapshots

Пока что в директории должен быть один каталог: hourly.0. При следующем запуске rsnapshot будет создавать каталоги hourly.1, hourly.2 и т.д., пока не упрется в максимум, указанный нами в конфигурационном файле.

Настройка cron


В Ubuntu автоматически создается файл /etc/cron.d/rsnapshot со следующим содержанием:
0 */4 * * * root /usr/bin/rsnapshot hourly
30 3 * * * root /usr/bin/rsnapshot daily
0 3 * * 1 root /usr/bin/rsnapshot weekly
30 2 1 * * root /usr/bin/rsnapshot monthly


Вот и все. Теперь у вас 6 раз в сутки должен автоматически создаваться снимок данных с вашего удаленного сервера. Данные в сохранности, да еще и географически распределены.

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

Дополнительная информация


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

Прошу особо не ругать, на гуру администрирования(да и linux) я не похож, но довольно долго искал, как просто автоматизировать резервное копирование — нашел способ, решил поделиться.
Но конструктивной критике и предложениям буду, конечно, рад.
UPD: Эта же статья в моем блоге
Kolger @Kolger
карма
77,9
рейтинг 0,0
Реклама помогает поддерживать и развивать наши сервисы

Подробнее
Реклама

Самое читаемое Администрирование

Комментарии (23)

  • 0
    rsync /from host:/where/`date`
    • 0
      rsnapshot именно rsync и использует, вопрос про автоматизацию и rotation-копии.
  • +2
    В топике про sudo рекомендовали вместо sudo nano/gedit/vim писать sudoedit, вызывающий редактор по умолчанию, который легко изменить.
  • +3
    В дебиане и убунту есть замечательный wrapper для кучи методов бэкапа — backupninja. Использую его значительно удобнее работать с бэкапами.
    Для бэкапа на удаленный хост используется rdiff-backup (умеет инкрементный бэкап), который можно использовать и отдельно.
  • 0
    Как вариант, чтобы не страдать от проблемы выбора оптимального места для центрального репозитария, стоит подумать о переходе с Subversion на Git.
    • +2
      А вот за RSnapshot спасибо! Это ж прямо готовая маковская Time Machine в виде консольной утилиты.
      • 0
        Да, примерно так :)
        А по поводу Git'а — не созрел пока, наверное :) Svn во всем устраивает, а размер репозитория — не такая уж и важная составляющая. В разумных пределах :)
        • 0
          github.com/blog/248-git-is-better
  • 0
    А как потом восстанавливать?
    • 0
      Простым копированием.
      cp /var/snaphosts/foo/foodir /kuda/to/tam/
  • НЛО прилетело и опубликовало эту надпись здесь
  • +1
    для резервного копирования на домешнем сервере использую StoreBackup
    как 2 года назад настроил, так все и работает, хотя винт с системой всего 40 GB
    именно эа программа понравилась тем, что делает инкрементальные бекапы.
    резервное копирование у меня выполняется каждый день, но в бекапе те файлы, которые не менялись за день заменяются ссылками на тот же файл из полного бекапа, а измененные — ложатся сжатые gzip'ом. таким образом все эти бекапы занимают очень мало места, и вы можете позволить себе делать их чаще.
  • 0
    прочитал фразу «а пароль сделайте пустым» и заскучал. искать в гугле по словам keychain и ssh-agent. за статью спасибо.
  • +3
    Теперь надо скопировать public key на удаленную машину, с которой мы хотим копировать данные.
    [...]
    $ cat ~/.ssh/id_dsa.pub | ssh backup@remotehost.ru «cat >> ~/.ssh/authorized_keys2»


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

    ssh-copy-id [-i [identity_file]] [user@]machine
  • 0
    спасибо за rsnapshot. Я для резервного копирования использую scp -r /dir/to/backup/* user@host:/destionation/dir/
  • +1
    С помощью консольных программ mkisofs и cdrecord можно дополнительно автоматизировать запись данных на (CD|DVD)+(R|RW)
    • +1
      А каким образом автоматически загружать диск в дисковод?:)
      Есть какие-либо дивайсы?
  • 0
    Спасибо! Отличная программа. Особенно после tar с полуручными ротациями.
  • 0
    отлично, просто отлично. Спасибо за наводку — побудила настроить — отлично работает =). Пока только не разобрался, можно ли копировать локальный бэкап на удаленный сервер по ссх. То есть ситуация обратная упомянутой в статье.
  • 0
    Я так понял, что это не инкрементальный бекап, а фулл…

    Можно его настроить на инкрементальный?
    • 0
      Инкрементальный — посмотрите на размер.
      Просто он активно использует символические ссылки на файлы из прошлых бэкапов, которые не поменялись.
  • 0
    Очень актуальная статья, каждый раз к ней возвращаюсь при настройке резервного копирования, спасибо Вам!
    • 0
      Сам постоянно к ней обращаюсь, когда настраиваю очередной сервер )

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