Posts Tagged ‘ BackUP

Debian Jessie: Установка и настройка bacula

Это заметка из цикла стетей моего небольшого HowTo по Debian Jessie.

Напомню что я описывал свою небольшую сетку и ее составляющие тут.
Настройка будет проводится на двух серверах nas.my.local и gw.my.local, я постараюсь указывать на каком сервере что выполнятеся, но также будет видно и в приветствии шела. Роли у них будут такие:
nas.my.local — основной менеджер (bacula-dir), хранилище (bacula-sd), консоль (bacula-console) и клиент (bacula-fd)
gw.my.local — основной клиент (bacula-fd) для бекапа (настройки, сайты, базы mysql …)

С ролями определились, вперед к настройке! Читать полностью

Debian Jessie: настройка бэкапа баз MySQL

Это заметка из цикла стетей моего небольшого HowTo по Debian Jessie.

Бэкапы и тормоза придумали трусы … это понятно. Непонятно только что делать когда железка померла или сайт похакали. Чтобы не попадать в такую непонятную и неприятную ситуацию — настроим автобэкап. Сразу скажу, что это только первый этап бэкапа, он делается на тот же хост где расположен mysql, следующим этапом будет настройка bacula — она заберет и файлы баз и директории с сайтами на удаленное хранилище … что обеспечит сохранность данных даже в случае поломки сервера.

У меня LVM, поэтому директорию для хранения бэкапов баз я решил расположить на отдельном LV.
Примерно прикиньте размер своих баз, учтите что храниться будет несколько бэкапов в заархивированном виде. В моем случае вполне хватит 2GB.
Создаем LV размером 2GB:

gw:~$ sudo lvcreate -L 2g -n lv_backup vgraid1
  Logical volume "lv_backup" created
gw:~$

Форматируем новый LV в ext4:

gw:~$ sudo mkfs.ext4 -L BACKUP /dev/mapper/vgraid1-lv_backup
mke2fs 1.42.12 (29-Aug-2014)
Creating filesystem with 524288 4k blocks and 131072 inodes
Filesystem UUID: b75fc3b1-4089-445b-8077-0840ad049348
Superblock backups stored on blocks:
    32768, 98304, 163840, 229376, 294912

Allocating group tables: done                            
Writing inode tables: done                            
Creating journal (16384 blocks): done
Writing superblocks and filesystem accounting information: done

gw:~$

Создаем директорию для бэкапов:

gw:~$ sudo mkdir /backup

Для автомонтирования раздела при старте сервера прописываем в /etc/fstab

gw:~$ sudo vim /etc/fstab

Вот такую строчку:

/dev/mapper/vgraid1-lv_backup /backup ext4 noatime,nodiratime,nodev,nosuid,noexec 1 2

Монтируем новый раздел:

gw:~$ sudo mount -a

Создаем директорию на lv_backup для будущих бэкапов mysql баз:

gw:~$ sudo mkdir /backup/mysql

Не забываем что это бэкапы баз, там есть много разной инфы, в том числе и приватной, поэтому не забываем урезать права на директорию. Доступ только тем что имеет sudo:

gw:~$ sudo chmod 0700 /backup/mysql

Создаем директорию для админских скриптов:

gw:~$ sudo mkdir /root/scripts

Создаем скрипт который будет бекапить базы:

gw:~$ sudo vim /root/scripts/mysql_db_backup.sh

С вот таким содержимым (не забываем сменить BASES_FOR_BACKUP и mysql_root_passwd_here на свои значения):

#!/bin/bash
# Script for BackUP MySQL bases
# Wrote at night 12.07.2010
# By Black_13

DATE=`date +%F`
BACKUP_DIR="/backup/mysql"
BASES_FOR_BACKUP="wordpress drupal6 evedb bmwdb"

# <Clean Old Archives> #
find ${BACKUP_DIR} -ctime +15 -exec rm -f  '{}' \;

cd ${BACKUP_DIR}

for DATABASE in ${BASES_FOR_BACKUP}
 do
    mysqldump --user='root' --password='mysql_root_passwd_here' ${DATABASE} > ${DATABASE}-${DATE}.sql
    bzip2 -9 ${DATABASE}-${DATE}.sql
done

Также обратите внимание на команду find в скрипте:

find ${BACKUP_DIR} -ctime +15 -exec rm -f  '{}' \;

Это очистка архивов старше 15-ти дней. Если вам нужно больше/меньше — просто исправьте данную циферку на нужную.

Даем скрипту права на выполнение:

gw:~$ sudo chmod +x /root/scripts/mysql_db_backup.sh

Итак, на данный момент директория с бекапами пуста, проверим это:

gw:~$ sudo ls -l /backup/mysql/
total 0
gw:~$

Пробуем запустить скрипт (не делайте это если база в активном использовании, лучше это делать когда база в минимальной нагрузке):

gw:~$ sudo /root/scripts/mysql_db_backup.sh

В случае корректного выполнения никакого вывода скрипт не дает, только если есть ошибки. У меня отработал без ошибок, вот листинг директории /backup/mysql после выполнения скрипта:

gw:~$ sudo ls -l /backup/mysql/
total 1324
-rw-r--r-- 1 root root 1257639 Oct 14 10:37 wordpress-2015-10-14.sql.bz2
-rw-r--r-- 1 root root   92233 Oct 14 10:38 evedb-2015-10-14.sql.bz2
...
gw:~$

Теперь добавим скрипт бэкапа в root-овый crontab чтобы он выполнялся автоматически каждый день в 03:00 ночи:

gw:~$ sudo crontab -e

Пишем вот следующее (не забывайте в конце оставлять пустую строку):

# m h  dom mon dow   command
0       3       *       *       *       /root/scripts/mysql_db_backup.sh

Завтра проверяйте содержимое директории /backup/mysql, там должны быть свежие бекапы …

Хай щастить!

Debian Jessie: Настройка MySQL Server (mariadb-server)

Это статья из цикла стетей моего небольшого HowTo по Debian Jessie.
Из популярных сборок mysql на сегодня я предпочитаю mariadb. С радостью воспринял тот факт что в официальных репах Debian Jessie предлагается 10-й релиз mariadb-server.
Напомню что описывал как добавить все официальные репозитарии в Debian Jessie.
Установим необходимые пакеты:

gw:~$ sudo apt-get install mariadb-server

В процессе установки спросит пароль root на mysql-server. Вводим 2 раза, желательно сложный. После инсталляции сервис будет запущен и добавлен в автозагрузку автоматически, учтите это 🙂
Поехали дальше … Читать полностью

MySQL — Восстановление таблиц Innodb

Шеф! Все пропало! База упала, данные пропали!

mysql> USE helldb;
mysql> SELECT * FROM cheaters;
ERROR 1146 (42S02): TABLE 'helldb.cheaters' doesn't exist
mysql>

Или это может выглядеть вот так, при попытке забекапить базу mysqldump -ом:

[red@hellsrv ~]$ mysqldump -uroot -p helldb > helldb.sql
Enter password:
mysqldump: Got error: 1146: Table 'helldb.cheaters' doesn't exist when using LOCK TABLES
[red@hellsrv ~]$

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

Debian Jessie: RAID (mdadm) + LVM — «Unable to find LVM volume VG01/root»

При установке Debian Jessie собрал зеркало из двух разделов. На одном md0 — просто /boot в ext4, на втором md1 VG с кучей LV (aka root, home, opt …)
Собственно все работало замечательно, пока не отключил один из винчестеров. После того как система теряет винт — грузится не хочет. Grub отрабатывает, а в initrd ошибка «Unable to find LVM volume VG01/root» и вывал в initrd консоль.

Проблема решается так, в initrd консоли ломаем RAID:

(initrd): mdadm -S /dev/md0
(initrd): mdadm -S /dev/md1

После этого скан:

(initrd): mdadm -A --scan

И вуаля! RAID находит рабочий винчестер, на нем нужные раздеры и собирает md0, md1 в active статусе. Собственно разделы становятся активными и lvm тоже замечательно начинает работать. Читать полностью

Debian GNU Linux — Установка/миграция eGroupWare

Итак, у меня новая задача — перенести программу eGroupWare со старого сервера на новый. Тем кому нужно заинсталить с нуля — тоже статья пригодится … хоть и ничего сложного в этом нет 🙂
Старая версия 1.8.003 установлена на Debian, база в mysql
Новая версия доступная в репозитарии 1.8.005, ее и будем подымать на новом сервере. Hostname нового сервера — cr.mycom.loc

Делается миграция очень просто:
1. На новом сервере устанавливаем с нуля самую новую версию mysql-server и EGW
2. На старом сервере делаем дамб базы данных и переносим его на новый сервер
3. На новом сервере восстанавливаем базу с дампа в «рабочую базу» свежеустановленного EGW
4. На новом сервере делаем Upgrade EGW (Через WEB интерфейс)
5. При желании, немного оптимизации

Поехали …. Читать полностью

MySQL — master/slave replication error «Duplicate entry»

Не так давно в очередной раз отвалилась MySQL реплика!
Казалось бы репликация в mysql за многие годы должна быть вылизана до идеала, но почемуто на практике это не так. Очень часто репликация master/slave в MySQL отваливается с ошибкой:

2014-09-26 08:57:14 42399 [ERROR] Slave SQL: Could not execute Write_rows_v1 event on table diff_wp.wp_options; Duplicate entry '_transient_is_multi_author' for key 'option_name', Error_code: 1062; handler error HA_ERR_FOUND_DUPP_KEY; the event's master log mysql-bin.000051, end_log_pos 128112, Error_code: 1062
2014-09-26 08:57:14 42399 [ERROR] Error running query, slave SQL thread aborted. Fix the problem, and restart the slave SQL thread with "SLAVE START". We stopped at log 'mysql-bin.000051' position 127907

У меня уже такое было, и я писал что на тот момент нашел временное решение. Но почему временное? Просто не было времени разбираться, а разобравшись … понял что тот вариант не совсем мне подходил. Итак, вариантов решения много — выбирай что нравится! Читать полностью

Tube AMP 6П7С, 2A3, 6П31С — «Я просто оставлю это здесь ….»

В очередной раз «засрал» весь винт на работе чем не попадя и в поисках чего бы удалить наткнулся на свой проект двухлетней давности по разработке и изготовлению простенького лампового усилителя. В процессе, правда, простой проект переродился в довольно серьезный (по крайней мере по бюджету) … но не хочу вдаваться в подробности. Суть этого поста не рассказать как ИТ-шник собирал для себя ламповый усь, а скорее мини-пост-бэкап. В очередной раз в борьбе с мусором на винте боюсь потерять файлики со своими схемами — поэтому оставлю их здесь … Внизу есть «архив исходников» который содержит схемы как в jpeg формате так и исходники удобные для правок в формате splan. Чуть ниже приведу пару окончательных вариантов схем, которые показались мне интересными по звуку:
Tube AMP - 2A3 + 6Н7С
Дальше … больше! Читать полностью

FreeBSD — настройка bacula с SSL шифрованием трафика

Сначала чуть данных из wiki
Bacula — кроссплатформенное клиент-серверное программное обеспечение, позволяющее управлять резервным копированием, восстановлением, и проверкой данных по сети для компьютеров и операционных систем различных типов.
Итак, это то что мне нужно! Более подробно рассмотрим из чего состоит bacula, это даст больше понимания о том как она работает.
Director (DIR) — осуществляет централизованный контроль и администрирование всего комплекса задач. Планирование и управление заданиями на резервное копирование (Job). Обслуживание Каталога (Catalog) — центральной БД для хранения метаданных.
File Daemon (FD) — сервис, выполняющий непосредственное копирование, восстановление и проверку данных по запросу Director. File Daemon должен быть установлен на каждой клиентской машине. File Daemon обменивается информацией с Director и Storage Daemon.
Storage Daemon (SD) — читает и пишет данные на физический носитель: диск, ленту, DVD, USB.
Console — управляющая консоль оператора или администратора. Поддерживаются ACL для разных пользователей консоли. Типы консолей: TTY, wxWidgets (GUI) для Linux, Unix, Win32, GNOME (GUI), несколько веб-интерфейсов, Qt4.
Catalog database — база данных SQL : MySQL, PostgreSQL, или SQLite для хранения метаданных.
Tray Monitor — апплет GNOME/KDE/Win32 GUI для показа активности Director, File daemons, Storage daemon в реальном времени.

Вот как выглядит работа настроенной системы:
Bacula applications

Что такого уникального я опишу в данной статье? Зачем она вообще нужна? Такие вопросы лезли мне в голову когда я брался это писать.
Хочу написать, в первую очередь для себя! Дело в том что данную систему я настраивал уже 3 раза и каждый раз рассчитывал на то что «нагуглю» рецепт и спокойненько настрою, тем более что в голове уже есть понимание что к чему. Но каждый раз было одно и тоже — все рецепты в сети оказывались для меня непригодны по разным причинам.
Сразу скажу, эта заметка не подходит для тех кто будет настраивать систему первый раз не имея понимания «что это и как его едят». Делаю для себя чтоб в следующий раз заюзать по принципу «Ctrl + C, Ctrl + V» потом минимально подправил и «поехали». Тут нету разжеванных опций и подробных описаний, за этим либо в google либо на официальный сайт в документацию.

Чего мы хотим?
Я хочу не так много — бекапить сервера через сеть Интернет с шифрованием трафика. Просто звучит, но чтоб настроить придется поработать 🙂

Что нужно подготовить перед тем как взяться за настройку? Многое … пойдем по порядку.
1. Определим кто есть кто! Сразу оговорюсь что все сервера у меня под FreeBSD. Но для Linux статья вполне сойдет, только обратите внимание на пути к директориям/файлам. Также отмечу, что у меня 2 физических сервера, поэтому на одном будет DIR + SD, а второй будет FD (его будем бэкапить). В дальнейшем данное решение абсолютно просто масштабируется. Я опишу это в конце заметки.

dir1.domain.ua — директор, тут же будет расположен каталог (БД mysql)
sd1.domain.ua — сторадж, тут будут храниться бэкапы в виде файлов (pools) на HDD
fd1.domain.ua — клиент, это та машина которую мы будем бэкапить

Эти имена должны правильно резолвиться на любой из данных ПК. Это можно реализовать либо создав соответствующие записи в DNS в виде host A либо просто прописать в /etc/hosts

Например на каждой машине прописать в /etc/hosts

111.111.111.111 dir1.domain.ua sd1.domain.ua
111.111.222.222 fd1.domain.ua

Проверить с помощью ping связь между собой для каждого хоста.

2. Определиться какие части системы на каких хостах (серверах) будут установлены. У меня будет так:
111.111.111.111 — директор (DIR) + БД MySQL (Catalog) + сторадж демон (SD) + консоль управления (Console)
111.111.222.222 — клиент (FD)

3. Настроить фаервол. Если он есть то необходимо открыть порты на вход/выход для хостов:
Console -> DIR:9101
DIR -> SD:9103
DIR -> FD:9102
FD -> SD:9103

4. На директоре установить и настроить MySQL. Я писал об этом ранее, вполне подойдет и для этой задачи.

5. Сгенерить необходимые SSL сертификаты. Этот процесс я также описывал ранее.
Важно! В процессе генерации не забываем прописывать корректно параметр Common Name (eg, YOUR name) Прописывать туда нужно FQDN сервера для которого данный сертификат генерится. Например в процессе генерации запроса на сертификат для сервера fd1.domain.ua параметр Common Name будет fd1.domain.ua Это очень важно!

6. Скопировать сертификаты на хосты. Создаем директорию /usr/local/etc/bacula-ssl и копируем (rsync, scp) туда сертификаты таким образом:
DIR, SD — ca.crt, dir1.crt, dir1.key, sd1.crt, sd1.key
FD — ca.crt, fd1.crt, fd1.key

7. Установить порты (напомню что я настраиваю на FreeBSD):
dir1.domain.ua (он же sd1.domain.ua) — bacula-server с опциями MYSQL, NLS, OPENSSL
fd1.domain.ua — bacula-client с опциями NLS, OPENSSL
И добавить в rc.conf опции для автозагрузки
На сервере dir1.domain.ua

# <= Bacula => #
bacula_dir_enable="YES"
bacula_sd_enable="YES"

На сервере fd1.domain.ua

# <= Bacula => #
bacula_fd_enable="YES"

8. На сервере dir1.domain.ua настроить в MySQL базу данных для bacula. Для этого есть готовые скрипты, которые нужно выполнить от рута:

root@dir1# /usr/local/share/bacula/grant_mysql_privileges
root@dir1# /usr/local/share/bacula/create_mysql_database
Creation of bacula database succeeded.
root@dir1# /usr/local/share/bacula/make_mysql_tables
Creation of Bacula MySQL tables succeeded.
root@dir1#

9. Создать на сервере хранения директорию для бэкапов и дать права :

root@dir1# mkdir -p /home/bacula/pools

И дать права бакуле туда писать/читать:

root@dir1# chown bacula:bacula /home/bacula

10. Ну и собственно сами конфиги, начнем с простого — файл-сервер (FD), это у нас хост fd1.domain.ua
Ранее мы на этом серваке установили bacula-client и настроили его автозапуск.
Также напомню что на сервере уже должны быть сертификаты, у меня они расположены в /usr/local/etc/bacula-ssl:

root@fd1:~# ls -l /usr/local/etc/bacula-ssl/
total 16
-rw-r--r--  1 root  bacula  1655 23 окт 15:38 ca.crt
-rw-r--r--  1 root  bacula  4632 23 окт 15:43 fd1.crt
-rw-r--r--  1 root  bacula  1679 23 окт 15:42 fd1.key
root@fd1:~#

Теперь настроим конфиг:

root@fd1:~# cat /usr/local/etc/bacula/bacula-fd.conf |egrep -v '^#|^$'
Director {
  Name = dir1
  Password = "fd1_5XLGGiNNxLfjMxCcfgLM"
  TLS Enable = yes
  TLS Require = yes
  TLS Certificate = /usr/local/etc/bacula-ssl/fd1.crt
  TLS Key = /usr/local/etc/bacula-ssl/fd1.key
  TLS CA Certificate File = /usr/local/etc/bacula-ssl/ca.crt
  TLS Verify Peer = yes
  TLS Allowed CN = "fd1.domain.ua"
  TLS Allowed CN = "sd1.domain.ua"
  TLS Allowed CN = "dir1.domain.ua"
}
FileDaemon {
  Name = fd1
  FDport = 9102
  WorkingDirectory = /var/db/bacula
  Pid Directory = /var/run
  Maximum Concurrent Jobs = 20
  FDAddress = fd1.domain.ua
  Heartbeat Interval = 30 sec
  TLS Enable = yes
  TLS Require = yes
  TLS Certificate = /usr/local/etc/bacula-ssl/fd1.crt
  TLS Key = /usr/local/etc/bacula-ssl/fd1.key
  TLS CA Certificate File = /usr/local/etc/bacula-ssl/ca.crt
}
Messages {
  Name = Standard
  director = dir1 = all, !skipped, !restored
}
root@fd1:~#

Ну вот, первая ласточка пошла 🙂 УРА! Перегрузите сервис (или запустите) стандартными средствами:

root@fd1:~# service bacula-fd restart

Настройку FD можно считать завершенной! Идем дальше …

11. Дальше чуть сложнее но тоже осилим! Настройка сервера хранения бэкапов (SD) — это у нас хост sd1.domain.ua Напомню что у меня DIR и SD на одном сервере, если у вас на разных, предварительно нужно на SD-сервер скопировать необходимые сертификаты ca.crt, sd1.crt и ключ sd1.key

root@dir1:~# cat /usr/local/etc/bacula/bacula-sd.conf |egrep -v '^#|^$'
Storage {
  Name = sd1
  SDPort = 9103
  WorkingDirectory = "/var/db/bacula"
  Pid Directory = "/var/run"
  Maximum Concurrent Jobs = 20
  SDAddress = sd1.domain.ua
  Heartbeat Interval = 30 sec
  TLS Enable = yes
  TLS Require = yes
  TLS Verify Peer = no
  TLS CA Certificate File = /usr/local/etc/bacula-ssl/ca.crt
  TLS Key = /usr/local/etc/bacula-ssl/sd1.key
  TLS Certificate = /usr/local/etc/bacula-ssl/sd1.crt
}
Director {
  Name = dir1
  Password = "sd1_ho6a&teSuA@CC2HnEEgu"
  TLS Enable = yes
  TLS Require = yes
  TLS Verify Peer = yes
  TLS Allowed CN = "fd1.domain.ua"
  TLS Allowed CN = "dir1.domain.ua"
  TLS CA Certificate File = /usr/local/etc/bacula-ssl/ca.crt
  TLS Key = /usr/local/etc/bacula-ssl/sd1.key
  TLS Certificate = /usr/local/etc/bacula-ssl/sd1.crt
}
Device {
  Name = FileStorage
  Media Type = File
  Archive Device = /home/bacula/pools
  LabelMedia = yes;
  Random Access = Yes;
  AutomaticMount = yes;
  RemovableMedia = no;
  AlwaysOpen = no;
}
Messages {
  Name = Standard
  director = dir1 = all
}
root@dir1:~#

Перегрузите сервис (или запустите) стандартными средствами:

root@dir1:~# service bacula-sd restart

Настройку SD можно считать завершенной! Идем дальше …

12. Настроим директор (DIR) — это основная часть системы. Тут будет много всяких параметров, углубляться не буду, для этого есть официальные доки. Вот что у меня:

root@dir1:~# cat /usr/local/etc/bacula/bacula-dir.conf |egrep -v '^#|^$'
Director {
  Name = dir1
  DIRport = 9101
  QueryFile = "/usr/local/share/bacula/query.sql"
  WorkingDirectory = "/var/db/bacula"
  PidDirectory = "/var/run"
  Maximum Concurrent Jobs = 1
  Password = "dir1_Ag@6Uzp8tHUW6PuRumc"
  Messages = Daemon
  DirAddress = dir1.domain.ua
  Heartbeat Interval = 30 sec
  TLS Enable = yes
  TLS Require = yes
  TLS Certificate = /usr/local/etc/bacula-ssl/dir1.crt
  TLS Key = /usr/local/etc/bacula-ssl/dir1.key
  TLS CA Certificate File = /usr/local/etc/bacula-ssl/ca.crt
  TLS Verify Peer = yes
  TLS Allowed CN = "fd1.domain.ua"
  TLS Allowed CN = "sd1.domain.ua"
  TLS Allowed CN = "dir1.domain.ua"
}
Job {
  Name = "RestoreFiles"
  Type = Restore
  Client=fd1                
  FileSet="Full Set"                  
  Storage = sd1                      
  Pool = Default
  Messages = Standard
  Where = /tmp/bacula-restores
}
FileSet {
  Name = "Full Set"
  Include {
    Options {
      signature = MD5
    }
    File = /usr/local/sbin
  }
  Exclude {
    File = /var/db/bacula
    File = /tmp
    File = /proc
    File = /tmp
    File = /.journal
    File = /.fsck
  }
}
Schedule {
  Name = "WeeklyCycle"
  Run = Full 1st sun at 23:05
  Run = Differential 2nd-5th sun at 23:05
  Run = Incremental mon-sat at 23:05
}
Schedule {
  Name = "WeeklyCycleAfterBackup"
  Run = Full sun-sat at 23:10
}
FileSet {
  Name = "Catalog"
  Include {
    Options {
      signature = MD5
    }
    File = "/var/db/bacula/bacula.sql"
  }
}
Storage {
  Name = sd1
  Address = sd1.domain.ua                # Use ONLY a FQDN here
  SDPort = 9103
  Password = "sd1_ho6a&teSuA@CC2HnEEgu"
  Device = FileStorage
  Media Type = File
  TLS Enable = yes
  TLS Require = yes
  TLS Certificate = /usr/local/etc/bacula-ssl/fd1.crt
  TLS Key = /usr/local/etc/bacula-ssl/fd1.key
  TLS CA Certificate File = /usr/local/etc/bacula-ssl/ca.crt
}
Catalog {
  Name = MyCatalog
  dbname = "BACULA_DB"; DB Address = "127.0.0.1"; dbuser = "BACULA_USER"; dbpassword = "bacula_db_password"
}
Messages {
  Name = Standard
  mailcommand = "/usr/local/sbin/bsmtp -h localhost -f "\(Bacula\) \<%r\>" -s "Bacula: %t %e of %c %l" %r"
  operatorcommand = "/usr/local/sbin/bsmtp -h localhost -f "\(Bacula\) \<%r\>" -s "Bacula: Intervention needed for %j" %r"
  mail = admin@domain.ua = all, !skipped            
  operator = admin@domain.ua = mount
  console = all, !skipped, !saved
  append = "/var/log/bacula.log" = all, !skipped
  catalog = all
}
Messages {
  Name = Daemon
  mailcommand = "/usr/local/sbin/bsmtp -h localhost -f "\(Bacula\) \<%r\>" -s "Bacula daemon message" %r"
  mail = admin@domain.ua = all, !skipped            
  console = all, !skipped, !saved
  append = "/var/log/bacula.log" = all, !skipped
}
Pool {
  Name = Default
  Pool Type = Backup
  Recycle = yes                       # Bacula can automatically recycle Volumes
  AutoPrune = yes                     # Prune expired volumes
  Volume Retention = 365 days         # one year
}
Pool {
  Name = File
  Pool Type = Backup
  Recycle = yes                       # Bacula can automatically recycle Volumes
  AutoPrune = yes                     # Prune expired volumes
  Volume Retention = 90 days          # 90 days
  Maximum Volume Bytes = 50G          # Limit Volume size to something reasonable
  Maximum Volumes = 100               # Limit number of Volumes in Pool
}
Pool {
  Name = Scratch
  Pool Type = Backup
}
Console {
  Name = mon
  Password = "console_"
  CommandACL = status, .status
}
@/usr/local/etc/bacula-fd1.conf
root@dir1:~#

Что такого необычного мы видим в этом конфиге? Да ничего особенного, все просто «как двери». В конце данного конфига включен дополнительный файл настроек, в котором прописаны уникальные настройки для fd1.

13. И наконец конфиг бэкапа для fd1, тот что /usr/local/etc/bacula-fd1.conf

root@dir1:~# cat /usr/local/etc/bacula-fd1.conf |egrep -v '^#|^$'
Job {
    Name = "www-backup"
    Type = Backup
    Level = Full
    Client = fd1
    FileSet = "www Set"
    Schedule = "WeeklyCycle_www"
    Messages = Standard
    Pool = www-pool
    Full Backup Pool = www-pool-FULL
    Differential Backup Pool = www-pool-DIFF
    Incremental Backup Pool = www-pool-INCR
    Write Bootstrap = "/var/db/bacula/www-fd1.bsr"
    Priority = 3
}
FileSet {
  Name = "www Set"
  Include {
    Options {
      signature = MD5
      compression = GZIP
      recurse = yes
      xattrsupport = yes
    }
    File = /etc
    File = /usr/local/etc
    File = /home/backup
    File = /root
    File = /usr/local/www
    File = /usr/home/user1/htdocs
    File = /usr/home/user2/htdocs
    File = /usr/home/user3/htdocs
  }
  Exclude {
    File = /usr/local/www/apache22/data/somedomain.org.ua/drupal/sites/default/files
  }
}
Schedule {
  Name = "WeeklyCycle_www"
  Run = Level=Full 1st sun at 4:05
  Run = Level=Differential 2nd-5th sun at 4:02
  Run = Level=Incremental mon-sat at 4:07
}
Client {
  Name = fd1
  Address = fd1.domain.ua
  FDPort = 9102
  Catalog = MyCatalog
  Password = "fd1_5XLGGiNNxLfjMxCcfgLM"
  File Retention = 45 days
  Job Retention = 6 months
  AutoPrune = yes
  TLS Enable = yes
  TLS Require = yes
  TLS Certificate = /usr/local/etc/bacula-ssl/fd1.crt
  TLS Key = /usr/local/etc/bacula-ssl/fd1.key
  TLS CA Certificate File = /usr/local/etc/bacula-ssl/ca.crt
}
Pool {
  Name = www-pool
  Pool Type = Backup
  Recycle = yes                     # Bacula can automatically recycle Volumes
  AutoPrune = yes                   # Prune expired volumes
  Volume Retention = 65 days        # 65 days
  Recycle Oldest Volume = yes
  Maximum Volume Bytes = 4400m      # Limit Volume size to something reasonable
  Maximum Volumes = 7               # Limit number of Volumes in Pool
  Label Format = "www_pool-vol"
  Storage = sd1
}
Pool {
  Name = www-pool-FULL
  Pool Type = Backup
  Recycle = yes                     # Bacula can automatically recycle Volumes
  AutoPrune = yes                   # Prune expired volumes
  Volume Retention = 60 days        # 60 days
  Recycle Oldest Volume = yes
  Maximum Volume Bytes = 4400m      # Limit Volume size to something reasonable
  Maximum Volumes = 7               # Limit number of Volumes in Pool
  Label Format = "www_pool-FULL-vol"
  Storage = sd1
}
Pool {
  Name = www-pool-DIFF
  Pool Type = Backup
  Recycle = yes                     # Bacula can automatically recycle Volumes
  AutoPrune = yes                   # Prune expired volumes
  Volume Retention = 60 days        # 60 days
  Recycle Oldest Volume = yes
  Maximum Volume Bytes = 4400m      # Limit Volume size to something reasonable
  Maximum Volumes = 7               # Limit number of Volumes in Pool
  Label Format = "www_pool-DIFF-vol"
  Storage = sd1
}
Pool {
  Name = www-pool-INCR
  Pool Type = Backup
  Recycle = yes                     # Bacula can automatically recycle Volumes
  AutoPrune = yes                   # Prune expired volumes
  Volume Retention = 60 days        # 60 days
  Recycle Oldest Volume = yes
  Maximum Volume Bytes = 4400m      # Limit Volume size to something reasonable
  Maximum Volumes = 7               # Limit number of Volumes in Pool
  Label Format = "www_pool-INCR-vol"
  Storage = sd1
}
root@dir1:~#

Как видим, тут описано само задание на бэкап (Job), также описан FileSet — собственно те файлы/папки которые хотим бэкапить, время/день недели когда делаются бэкапы Shedule, а также пулы. Все относительно просто, для детального описания каждой опции смотрите официальную документацию.

Перегрузите сервис (или запустите) стандартными средствами:

root@dir1:~# service bacula-dir restart

Настройку DIR можно считать завершенной! Идем дальше …

14. Настроим консоль. Консоль я буду пользовать на сервере там же где и директор (dir1). Для настройки рихтуем конфиг:

root@dir1:~# cat /usr/local/etc/bacula/bconsole.conf
#
# Bacula User Agent (or Console) Configuration File
#

Director {
  Name = dir1
  DIRport = 9101
  address = dir1.domain.ua
  Password = "dir1_Ag@6Uzp8tHUW6PuRumc"

  TLS Enable = yes
  TLS Require = yes
  TLS Certificate = /usr/local/etc/bacula-ssl/dir1.crt
  TLS Key = /usr/local/etc/bacula-ssl/dir1.key
  TLS CA Certificate File = /usr/local/etc/bacula-ssl/ca.crt
}
root@dir1:~#

Настройку консоли можно считать завершенной.

15. Тестируем! Для этого на сервере dir1.domain.ua запускаем в root-овой консоли bconsole:

root@dir1:~# bconsole
Connecting to Director dir1.domain.ua:9101
1000 OK: dir1 Version: 5.2.12 (12 September 2012)
Enter a period to cancel a command.
*

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

*status all
dir1 Version: 5.2.12 (12 September 2012) i386-portbld-freebsd9.0 freebsd 9.0-RELEASE-p3
Daemon started 23-Mar-14 20:36. Jobs: run=4, running=0 mode=0,0
 Heap: heap=0 smbytes=80,026 max_bytes=113,890 bufs=296 max_bufs=327

Scheduled Jobs:
Level          Type     Pri  Scheduled          Name               Volume
===================================================================================
Incremental    Backup     3  28-Mar-14 04:07    www-backup         Vol_1
====

Running Jobs:
Console connected at 27-Mar-14 11:16
No Jobs running.
====

Terminated Jobs:
 JobId  Level    Files      Bytes   Status   Finished        Name
====================================================================
   379  Incr        101    6.737 M  OK       18-Mar-14 04:07 www-backup
   380  Incr         27    6.536 M  OK       19-Mar-14 04:07 www-backup
   381  Incr      1,634    18.16 M  OK       20-Mar-14 04:07 www-backup
   382  Incr         18    6.401 M  OK       21-Mar-14 04:07 www-backup
   383  Incr         17    6.402 M  OK       22-Mar-14 04:07 www-backup
   384  Diff         42    18.34 M  Error    23-Mar-14 04:02 www-backup
   385  Incr         27    12.79 M  OK       24-Mar-14 04:07 www-backup
   386  Incr      1,413    15.02 M  OK       25-Mar-14 04:07 www-backup
   387  Incr         22    6.412 M  OK       26-Mar-14 04:07 www-backup
   388  Incr         29    6.863 M  OK       27-Mar-14 04:07 www-backup

====
Connecting to Storage daemon sd1 at sd1.domain.ua:9103

sd1 Version: 5.2.12 (12 September 2012) i386-portbld-freebsd9.0 freebsd 9.0-RELEASE-p3
Daemon started 23-Mar-14 20:36. Jobs: run=4, running=0.
 Heap: heap=0 smbytes=90,823 max_bytes=224,190 bufs=93 max_bufs=113
 Sizes: boffset_t=8 size_t=4 int32_t=4 int64_t=8 mode=0,0

Running Jobs:
No Jobs running.
====

Jobs waiting to reserve a drive:
====

Terminated Jobs:
 JobId  Level    Files      Bytes   Status   Finished        Name
===================================================================
   379  Incr        101    6.755 M  OK       18-Mar-14 04:07 www-backup
   380  Incr         27    6.540 M  OK       19-Mar-14 04:07 www-backup
   381  Incr      1,634    18.39 M  OK       20-Mar-14 04:07 www-backup
   382  Incr         18    6.403 M  OK       21-Mar-14 04:07 www-backup
   383  Incr         17    6.405 M  OK       22-Mar-14 04:07 www-backup
   384  Diff         42    18.14 M  Error    23-Mar-14 04:02 www-backup
   385  Incr         27    12.80 M  OK       24-Mar-14 04:07 www-backup
   386  Incr      1,413    15.22 M  OK       25-Mar-14 04:07 www-backup
   387  Incr         22    6.416 M  OK       26-Mar-14 04:07 www-backup
   388  Incr         29    6.867 M  OK       27-Mar-14 04:07 www-backup
====

Device status:
Device "FileStorage" (/home/bacula/pools) is not open.
====

Used Volume status:
====

====

Connecting to Client fd1 at fd1.domain.ua:9102

fd1 Version: 5.2.12 (12 September 2012)  amd64-portbld-freebsd9.0 freebsd 9.0-RELEASE-p3
Daemon started 20-Mar-14 12:11. Jobs: run=7 running=0.
 Heap: heap=0 smbytes=23,861 max_bytes=372,763 bufs=73 max_bufs=215
 Sizeof: boffset_t=8 size_t=8 debug=0 trace=0
Running Jobs:
Director connected at: 27-Mar-14 11:16
No Jobs running.
====

Terminated Jobs:
 JobId  Level    Files      Bytes   Status   Finished        Name
======================================================================
   379  Incr        101    6.737 M  OK       18-Mar-14 04:07 www-backup
   380  Incr         27    6.536 M  OK       19-Mar-14 04:07 www-backup
   381  Incr      1,634    18.16 M  OK       20-Mar-14 04:07 www-backup
   382  Incr         18    6.401 M  OK       21-Mar-14 04:07 www-backup
   383  Incr         17    6.402 M  OK       22-Mar-14 04:07 www-backup
   384  Diff         42    18.34 M  Error    23-Mar-14 04:02 www-backup
   385  Incr         27    12.79 M  OK       24-Mar-14 04:07 www-backup
   386  Incr      1,413    15.02 M  OK       25-Mar-14 04:07 www-backup
   387  Incr         22    6.412 M  OK       26-Mar-14 04:07 www-backup
   388  Incr         29    6.863 M  OK       27-Mar-14 04:07 www-backup
====

*

Можно ради интереса запустить бэкап прямо сейчас, не дожидаясь ночного автозапуска (учтите нагрузку на сервер! Если у вас боевой сервер — лучше это делать в момент наименьшей нагрузки … вечером/ночью/рано утром):

*run job=www-backup

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

16. И пара слов про восстановление. В случай необходимости восстановить файлы идем в консоль и делаем следующее:

*restore

После чего выбрать те Job в которых находится необходимый вам файл. В случае как у меня, когда делается full бэкап раз в месяц, а каждый день либо diff либо incremental — нужно выбирать все Job-ы от full и до последнего Incremental-а. Дальше все просто, следуйте указаниям мастера восстановления.

Что делать если хотим добавить еще один FD в эту систему?
Да все проще простого:
— на новом сервере fd2 установить bacula-client и настроить также как описано выше для fd1
— на сервере dir1 копируем файлик настроек FD /usr/local/etc/bacula-fd1.conf в какойнить /usr/local/etc/bacula-fd2.conf
— генерим для fd2.domain.ua сертификат и ключ
— прописываем FileSet в новом конфиге и меняем пароль/сертификаты. По желанию можно по-другому назвать пулы или перестроить время бэкапа
Вот собственно, и все. 5 минут работы и сервак добавлен в систему. Просто? Ато!
Так же просто «перенести» SD на другую железку. Или подключить второй SD, для того чтобы разные FD бэкапить на разные SD. Система очень гибко настраивается — это дополнительный плюс.

P.S. Получилось не очень стройно, както сумбурно и не особо детально. Но статья рассчитана скорее на человека который уже имеет понимание и просто хочет «по быстрому подкинуть конфиги» и с минимальными правками стартонуть систему, а не на тех кто совсем с нуля осваивается. Можно конечно и с нуля разобраться, но придется изрядно поглядеть в официальные доки.

FreeBSD. HAST + UCARP = файловый кластер. Или нет?

Идея настроить репликацию файлов между серверами давно закралась мне в голову. Хочется такой себе файловый кластер на FreeBSD. Очень уж хотелось засунуть туда один web-ресурс. С базой данных все понятно, сам mysql прекрасно справляется с репликацией своих баз (я писал уже о репликации в mysql в одной из предыдущих заметок). Но что делать с файлами? Rsync и прочее не нравится, точнее нравится и даже трудится в данный момент, но есть одна проблема — решение содержит постоянную временную задержку синхронизации, а значит данные на slave-нодах всегда будут отставать от master-а. И вот както я нашел HAST, он лишен проблемы с задержкой синхронизации, так как синхронизирует данные в реальном времени. Жаль только что в данный момент HAST ограничен работой с двумя хостами в режиме master-slave или в терминологии самого HAST «Primary — Secondary». По сути можно построить клестер «с холодным резервом». И еще одна ложка дегтя — больше двух хостов в связку добавить нельзя, один мастер, один слейв …. эх 🙁 Также есть ограничения на общий ресурс — это может быть либо отдельный диск либо раздел, директорию или файл сделать общим ресурсом нельзя. Ну все равно интересно — пробуем!
Вводные данные:
FQDN server1 — node1.loc, IP — 10.10.10.10 — условный master
FQDN server2 — node2.loc, IP — 10.10.10.20 — условный slave
«Общий» для обоих нод IP, по сути, адрес кластера — 10.10.10.100
«Общий» ресурс — www
Диск который будем делать общим — /dev/da0
Точка монтирования «общего» ресурса — /usr/local/www/hast
Поехали! Читать полностью