2016-09-20 3 views
0

я наткнулся на эту проблему несколько дней назад, и было мастерить с- и размышлял о нескольких различных подходах, но я не могу найти хороший ответ:MySQL репликации/синхронизации: продувка от мастера, но не от раба

У меня есть два сервера MySQL, один мастер/горячий и один подчиненный/архив. Все запросы на запись отправляются мастеру, а также (в конечном итоге) копируются/копируются в подчиненный. Тем не менее, данные certan в мастере становятся «устаревшими» через некоторое время (скажем, неделю), а затем очищаются, поэтому короткие столы мастера становятся короткими. Однако эта чистка не должна влиять на подчиненную. Как я могу добиться этого?

По существу, моя основная база данных действует как «горячая» база данных, где данные свежие и очищаются, когда они устаревают. Он должен содержать данные, которые могут потребоваться пользователям быстро, и поэтому мы хотим, чтобы таблицы были небольшими. Мой раб, с другой стороны, больше похож на архив, который должен содержать все данные, независимо от «горячности». Запросы к ведомому устройству не нужно выполнять быстро, а данные подчиненных устройств могут отставать от нескольких минут, но с самого начала они должны содержать все записи.

  • Моя первоначальная мысль заключалась в использовании обычной репликации, но могу ли я каким-то образом фильтровать определенные запросы, чтобы не повлиять на подчиненный? Я думал создать запрос очистки, который удаляет старые данные с ведущего устройства, но не влияет на ведомое устройство. Из чтения документации MySQL кажется, что эта фильтрация может быть выполнена только на уровне базы данных или таблиц.

  • Еще одна мысль заключалась в том, чтобы сделать это через внешнее приложение и вручную выбрать данные из ведущего устройства и Вставить его в подчиненный, а затем использовать некоторую умную логику, чтобы решить, какие данные выбрать. Это хорошо работает для журнальных таблиц, которые будут только добавлять данные, но это не работает хорошо для таблиц, которые представляют состояния, такие как пользовательские настройки. Этот подход, вероятно, также включает в себя множество особых случаев, поскольку я не могу найти хороший, последовательный способ описания всех таблиц в нашей базе данных (есть журналы-таблицы, таблицы состояний, таблицы-таблицы и несколько, которые я не могу категоризировать).

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

Если больше информации необходимо, не стесняйтесь комментировать и я буду редактировать его в

ответ

1

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

SET sql_log_bin = 0; 
DELETE FROM my_table WHERE whatever = true; 
SET sql_log_bin = 1; 

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

  • подробнее об этом here
+0

Если я понимаю, это правильно, я должен назвать это с помощью SET SESSION SQL_LOG_BIN = 0, верно? Я хочу, чтобы команда очистки не регистрировалась, все остальные одновременные запросы все равно должны регистрироваться. – Gikkman

+0

Да, это так. Это только запрещает ведение записей в этом сеансе. Заявления в других сеансах не затрагиваются. – fancyPants

+0

Хорошо, я проведу некоторые испытания с этим, и если это сработает, я вернусь и отметю это как правильно :-) – Gikkman

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