Удаленный шифрованный бэкап MySQL при помощи LVM snapshot

Имеем: высоконагруженый MySQL сервер с таблицами объёмом более 20 Гб.

Требуется: ежедневное резервное копирование на удавленный хост с шифрованием данных

Условия: процедура бекапа не должна ни коим образом сказаться на производительности MySQL во время проведения оной.

Итак, mysqldump отпадает автоматически, ибо локи таблиц там испортят нам весь аптайм. Выбор пал на технологию LVM снэпшотов, доступную в любом линуксе, утилитку шифрования gpg, а так же IO scheduler CFQ.

Итак, подготовка.
1. Подготовка LVM.

Нам нужна LVM группа с необходимым свободным местом для:

Баз MySQL
LVM снэпшота

Т.е. объема свободного пространства в группе LVM должно быть под базы + где-то 10-20% (в зависимости от тяжести IO записи работы с базами).

Создаем LVM Physical Volume на девайсе /dev/sda2 (у меня /dev/sda это RAID5 из 6 SAS дисков, sda2 можете заменить на свой девайс):

pvcreate /dev/sda2

Создаем Volume Group с именем vg0 на /dev/sda2:

vgcreate vg0 /dev/sda2

Теперь надо создать в группе vg0 логический том (Logical Volume) под партицию MySQL таблиц с именем mysql. У меня эта партиция занимает 500 Гб. При этом важно оставить в группе vg0 10-20% свободного места, не занятого логическими томами, дабы было возможно делать снэпшоты.

lvcreate -L 500G -n mysql vg0

Теперь наш девайс будет виден в:

/dev/mapper/vg0-mysql
/dev/vg0/mysql (symlink)

2. Подготовка ФС

Это, думаю, умеют делать все. Но на всякий напишу.

Делаем FS:

mke2fs -j -L lmysql /dev/mapper/vg0-mysql
mkdir /mysql

Прописываем в fstab:

LABEL=lmysql /mysql ext3 defaults,noatime 0 0

Монтируем, подготавливаем:

mount /mysql
mkdir /mysql/myisam
chown mysql:mysql /mysql/myisam

Прописываем в /etc/my.cnf:

datadir=/mysql/myisam

Стартуем MySQL:

/etc/init.d/mysqld start

Дальше любимым путем переносим на этот раздел (/mysql/myisam) свои базы.
3. Подготовка MySQL

Надо пропатчить RC-скрипт MySQL для выделения высокого приоритета IO, дабы наша мышца не сдулась в ходе интенсивного бекапа.

Так же следует заметить, что я использую IO scheduler CFQ. Если у вас не CFQ, то можно забыть про приоритеты IO. Узнать/Выставить IO scheduler на девайсе можно в файле:

/sys/block/sda/queue/scheduler
(sda заменить на ваш девайс)

Смысл патча в том, чтобы после старта MySQL отдавать ему высокий приоритет IO в CFQ. Патч на CentOS 5 RC скрипт /etc/init.d/mysqld выглядит так. Думаю, народ разберется.
4. Подготовка авторизации

Я буду делать бекап через кучу пайпов. Причин две:

Так проще
tar накидывается на дисковое IO с меньшим энтузиазмом когда пишет в пайп | gpg | ssh, чем когда пишет на диск.

Конечно, это увеличивает продолжительность бекапа. Но и уменьшает вероятность затыка MySQL на время бекапа.

А по сему, мы создаем Беспарольную авторизацию по публичному ключу с хоста MySQL (юзер root) на ваш некий бекап-хост user@backup.remotehost.com.
5. Скрипт бэкапа

Собственно скрипт состоит из двух частей. Я их сложил оба в /root/scripts/. И в скрипте backup.sh используется этот путь.
1. backup.php

Этот скрипт делает сброс таблиц MySQL на диск с READ LOCK. После лока он создает снэпшот тома /dev/vg0/mysql и после этого отпускает лок MySQL.

Скриптик это служебный, используется он из скрипта backup.sh.

В нем нужно поменять в строке коннекта к MySQL данные для коннекта рутового юзера к локальному серверу:

$link=@mysql_connect(‘localhost’,'root’,»);

Так же стоит обратить внимание на строку

exec(«/usr/sbin/lvcreate —size 30G —snapshot —name $lv /dev/{$vg}/$part»,$out,$ret);

А именно на 30G – это размер LVM снапшота. Нам он нужен на время бекапа, и размер снапшота должен превышать тот максимальный объем данных, которые MySQL сможет записать за это время на диск. Ну и конечно, в группе LVM vg0 должно быть именно столько или больше свободного места. 30G в общем за глаза.
2. backup.sh

А это именно тот скрипт, который будет запускаться из крона.

Он запускает backup.php для снятия снапшота, монтирует снапшот в указанную директорию, тарит раздел с таблицами, кидает это все в пайп к gpg для шифрования по алгоритму AES256 с симметричным ключом и кидает дальше в пайп ssh, который уже на удаленной стороне складывает с помощью dd все это хозяйство в файл бекапа с временной меткой. Фух.

Далее он размонтирует снапшот и удаляет его.

Если кто успел заметить, используется утилита gpg для шифрования симметричным ключом, который расположен в файле $keyfile. Данный файл должен содержать около 20 случайных ASCII символов одной строкой. Стоит заметить что нужно создать этот файл раз и навсегда и сохранить где то у себя его копию, поскольку расшифровать бекап можно будет только с его помощью. А сделать это можно будет сделать командой:

gpg —passphrase-file $keyfile —cipher-algo AES256 -d file.tgz.gpg > file.tgz

Прочие переменные:

gpgpath – путь к gpg, с завершающим слешем
vgname – имя группы LVM, содержащей том с таблицами MySQL
lvname – имя тома создаваемого снапшота
partitionlvname – имя тома с таблицами MySQL в группе $vgname
mntpoint – директория для монтирования снапшота
remotehost – юзер и хост для удаленного бекапа (см. пункт 4)
f — имя файла, в который на удаленной стороне будет складываться шифрованный бекап

Собственно, все.

Источник pentarh.com/wp/2010/08/12/mysql-remote-encrypted-backup-lvm-snapshot


Понравилась статья? Поделись с остальными.

Комментарии закрыты.