В настоящее время у нас есть одна мощная база данных MySQL, на которой работают несколько веб-сайтов на основе Django с высокой посещаемостью, а также несколько веб-сайтов электронной коммерции приличного размера. В результате у нас есть изрядное количество больших баз данных, использующих таблицы InnoDB и MyISAM.
К сожалению, недавно мы столкнулись с проблемой из-за большого объема трафика, поэтому я установил еще один главный сервер, чтобы облегчить чтение / резервное копирование.
На данный момент я просто использую mysqldump с несколькими аргументами, и это было хорошо… до сих пор. Очевидно, что mysqldump - это медленный и быстрый метод, однако я считаю, что мы перестали его использовать. Теперь мне нужна хорошая альтернатива, и я искал возможность использовать Maatkits мк-параллельный дамп утилита или решение для создания снимков LVM.
Краткая краткая версия:
Любые рекомендации или идеи будут оценены - так как мне нужно переделать то, как мы делаем вещи, я предпочитаю, чтобы это было сделано правильно / максимально эффективно :).
Я добился хороших результатов с репликацией MySQL и ночными архивами. Для меньшей базы данных, базы данных mysql и схемы я использую комбинацию сценариев, предназначенных для использования mysqlhotcopy и mysqldump.
InnoDB горячее резервное копирование - отличный коммерческий продукт, но я не уверен, как он обрабатывает смешанные таблицы в одной базе данных. Рекомендация pQd для XtraBackup может быть хорошей для сравнения с этим.
Другим нравятся снимки LVM, и я бы сказал, что это определенно нужно учитывать. В конечном итоге, вероятно, лучше всего будет комбинация решений.
Также примечательно, что это старая тема. Между Высокая производительность MySQL книга, Руководство по MySQL, и предыдущие вопросы ServerFault - это было исчерпано в целом. Видеть:
xtrabackup - по крайней мере, для innodb.
Наиболее распространенный способ решить эту проблему - настроить другой сервер MySQL, который может быть даже на том же компьютере, и запустить репликацию главный / подчиненный. Затем вы можете выполнить резервное копирование на ведомом устройстве без какого-либо воздействия на ведущее устройство.
На EC2 EBS я сейчас использую xfs_freeze. Я рассматриваю возможность перехода на xtrabackup в какой-то момент, но когда я провел первый тестовый запуск, он был очень и очень голоден.
Если вы запускаете репликацию базы данных, совместно используемой приложениями, возникает очевидный вопрос, можно ли улучшить производительность многих вещей, включая резервное копирование, путем выделения серверов баз данных приложениям. Совместное использование - это хорошо, пока это не так.
Если вы сохраняете свои таблицы MyISAM только для устаревших целей (вы не удосужились их изменять), вот что я использую, чтобы легко это исправить:
mysql -u root --password=<password> --database=db_name -B -N -e "SHOW TABLES" | awk '!/not_this_db/ && !/or_this_one/ && /^[a-z]/ {print "ALTER TABLE", $1, "ENGINE=INNODB;"}' | mysql -u root --password=<password> --database=db_name
Вы можете исключить и включить базы данных с регулярным выражением awk, например, только dbs, начинающиеся со строчной буквы в моем примере выше. Это, конечно, заблокирует таблицы во время изменения.
Затем используйте xtrabackup, чтобы скопировать всю базу данных прямо на другой сервер без блокировки каких-либо таблиц или использования слишком большого количества операций ввода-вывода диска (после настройки ключей ssh rsa):
innobackupex --throttle=500 --compress --stream=xbstream /doesntneedtoexist | ssh user@otherhost "xbstream -x -C /root/backup/"
а затем вы можете выполнить шаг применения журнала, полностью отделив его, и сэкономить дисковое пространство, ввод-вывод и ЦП на рабочем сервере.