Настройка резервного копирования в 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: Эта же статья в моем блоге
    Метки:
    Поделиться публикацией
    Комментарии 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
            А как потом восстанавливать?
            • 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
                                  Сам постоянно к ней обращаюсь, когда настраиваю очередной сервер )

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