Снимки LVM очень пугают InnoDB при определенных обстоятельствах. Почему?
Если у вас отключено innodb_file_per_table, ibdata1 будет есть все и его бабушка в нем. Что живет в ibdata1? Четыре вещи:
- Страницы данных
- Индексные страницы
- Метаданные (например, список идентификаторов TableSpave)
- Данные MVCC
Если вы пытаетесь создать моментальные снимки LVM в среде с интенсивной записью БД с выключенным innodb_file_per_table, вы можете выстрелить себе в ногу. Для моментального снимка LVM необходимо, чтобы файл ibdata1 был заранее хорошо объединен.
Недавно я провел следующий эксперимент:
У клиента в хостинговой компании моего работодателя возникли следующие проблемы с настройкой MySQL:
- innodb_file_per_table выключен
- 1,4 ТБ данных1
- только 29 ГБ свободно в ibdata1
- файловая система ext3 (ограничение размера одного файла 2 ГБ, гадость)
Я хотел настроить ведомое устройство MySQL, перенаправив папку /var/lib/mysql на другой сервер БД. Когда rsync был выполнен на ibdata1 без простоя, это заняло 42 часа. Вторая rsync для ibdata1 заняла 84 часа, обнаружила только 220 ГБ изменений и была выполнена едва ли на 15%. Я прервал эту миссию.
Моментальный снимок LVM может работать намного лучше, чем rsync. Тем не менее, любой моментальный снимок LVM, включающий очень большой ibdata1, будет подвержен тем же проблемам.
Если вы используете моментальный снимок LVM, используйте следующие параметры:
- ВАРИАНТ 01) Используйте innodb_file_per_table. Снимки LVM понравятся вам за это, потому что они будут иметь дело с файлами меньшего размера. Вы также можете безвозвратно сжать ibdata1.
- ВАРИАНТ 02) Используйте репликацию MySQL и делайте снимки LVM на ведомом устройстве.
С подчиненным сервером репликации MySQL вы можете
STOP SLAVE;
(если у вас есть --skip-slave-start в my.cnf)
service mysql stop
- выполнить снимок LVM
service mysql start
START SLAVE;
(если у вас есть --skip-slave-start в my.cnf)
Таким образом, эти проблемы со снимками LVM никогда не увидят свет на Мастере производства.
Попробуйте и получайте удовольствие от этого !!!
person
RolandoMySQLDBA
schedule
06.02.2012