2016-08-02 1 views
0

Я поддерживаю сервер, который запускает ежедневные задания cron для агрегирования источников данных и создания отчетов, доступных частному приложению Ruby on Rails.Что такое эффективный способ поддержки локальной копии только для чтения живой удаленной базы данных MySQL?

Одним из наших источников данных является частичный сброс базы данных наших партнеров. Партнер запускает активное приложение, а база данных MySQL содержит сотни таблиц. Они дали нам доступ только для чтения к относительно маломощному ведомому только для чтения их прикладной БД.

Из-за проблем с задержкой и узких мест производительности на их подчиненной БД мы поддерживали ограниченную локальную копию их БД. Нам нужны только около 20 таблиц для наших отчетов, поэтому я просто отказываюсь от этих таблиц. Нам также нужны данные только для ежедневной детализации, поэтому синхронизация в реальном времени не является обязательным требованием.

В течение нескольких месяцев я реализовал ночной cron, который передавал дамп необходимых таблиц в локальную базу данных production_tmp. Затем, когда все таблицы были импортированы, я сбросил production и переименовал production_tmp в production. Это работало до тех пор, пока БД не выросла до более чем 25 ГБ, и мы начали использовать ограничения на дисковое пространство.

На данный момент, я удалил шаг избыточности, и я просто передаю свалку прямо на production на нашем локальном сервере. Мне это кажется немного хлипким, и я хотел бы применить более безопасный подход. Кроме того, в настоящее время полная загрузка дампа/загрузка занимает наш сервер в течение 2 часов, и я хотел бы реализовать подход, который не займет много времени. База данных будет продолжать расти, поэтому я хотел бы реализовать что-то в будущем.

Любые предложения будут оценены!

+0

Вы пробовали с помощью 'функции горячей backup' в MySql? Похоже, вы сбрасываете всю БД, чтобы сделать эту передачу, но на самом деле нужно только переместить изменения. Дополнительная информация: [Incremental Backup] (http://dev.mysql.com/doc/refman/5.7/en/glossary.html#glos_incremental_backup) –

+0

@SusannahPotts - единственный способ сделать это с помощью MySQL Enterprise Edition? –

+0

Я так считаю ... MySQL довольно строг в отношении функциональности платных версий. Я предположил, что вы будете использовать версию EE, поскольку лицензирование MySQL не разрешает коммерческое использование ... по крайней мере, с той части лицензии, которую я прочитал. –

ответ

2

Я полагаю, что вы никогда не слышали, или считаете MySQL Replication?

Идея состоит в том, что вы восстанавливаете один раз резервное копирование &, а затем настраиваете реплику на «подписку» на непрерывный поток изменений, поскольку они создаются на основном экземпляре MySQL. Любое изменение, применяемое к первичному, автоматически применяется к реплике в течение нескольких секунд. Вам не нужно снова делать резервную копию &, если только реплика не повреждена.

Требуется помощь в настройке и продолжении работы, но это гораздо более эффективный способ синхронизации двух экземпляров.

@SusannahPotts упоминает горячее резервное копирование и/или инкрементное резервное копирование. Вы можете получить обе эти функции бесплатно, не заплатив за MySQL Enterprise, используя Percona XtraBackup.

Вы также можете рассмотреть возможность использования MySQL Transportable Tablespaces.


Вам понадобится доступ к файловой системе для запуска Percona XtraBackup или MySQL Enterprise Backup. Например, невозможно использовать эти физические средства резервного копирования для Amazon RDS.

Альтернативой является создание ведомого репликации в той же сети, что и в режиме реального времени, и запуск Percona XtraBackup на этом подчиненном устройстве, где у вас есть доступ к файловой системе.

Другой вариант - передать двоичные журналы другому хосту (см. https://dev.mysql.com/doc/refman/5.6/en/mysqlbinlog-backup.html), а затем периодически передавать их в локальный экземпляр и воспроизводить их.

Каждое из этих решений имеет свои плюсы и минусы. Трудно рекомендовать, какое решение лучше для вас, потому что вы не делитесь полной информацией о своих требованиях.

+0

Не нужно быть снисходительным. Я знаком с репликацией, но не уверен, что это лучший выбор для синхронизации удаленного БД, который уже является подчиненным. Возможно, также следует отметить, что единственный доступ, который я должен удалить для slave-устройства, - это только туннель SSH, основанный только на MySQL. –

+1

Пожалуйста, не принимайте мой ответ как снисходительный. Это не мое намерение. В вашем вопросе нет ничего, что указывало бы, что вы знаете о опции репликации. Многие люди этого не делают. –

+0

Percona XtraBackup выглядит как хороший вариант для изучения. Транслируемые табличные пространства были бы хороши, если бы мы имели доступ к файловой системе на удаленном сервере, но мы этого не делаем. –

1

Это работало до тех пор, пока БД не выросла до более чем 25 ГБ, и мы начали использовать ограничения на дисковое пространство.

Некоторые знаки вопроса «здесь»:

  • Почему вы не просто увеличить доступную DISKSPACE для вашей базы данных? 25 GB ничего не кажется, когда дело доходит до дискового пространства?
  • Почему бы вам не изменить свой скрипт так: загрузить table1, import table1_tmp, drop table1_prod, переименовать table1_tmp в table1_prod; промыть и повторить.

Кроме этого:

  • Почему вы не спросите своего партнера для системы с достаточной производительностью для запуска отчетов о? Я уверен, он предпочел бы это, вместо того, чтобы каждый день загружать конфиденциальные данные на ваш «местный сайт»?

Последняя мысль (требуется MySQL Enterprise Backup https://www.mysql.de/products/enterprise/backup.html):

  • Вместо того, демпинг, загрузку и импорт 25 Гб каждый день:
  • Создать полную резервную копию
  • Скачать и импортировать
  • Используйте дифференциальные или инкрементные резервные копии.
  • На следующий день загрузки (и импорт) только данные-дельта: https://dev.mysql.com/doc/mysql-enterprise-backup/4.0/en/mysqlbackup.incremental.html
+1

Хорошие рекомендации. Глядя на эти первые две точки, я переместил свою БД на гибкий объем хранилища блоков.Я также изменил свой скрипт на синхронизацию в таблице сейчас, что значительно сокращает накладные расходы на диске, необходимые для синхронизации. Спасибо за предложения! –

+0

@ HunterBridges, пожалуйста. – dognose

 Смежные вопросы

  • Нет связанных вопросов^_^