Как подчинить данные в реальном времени из двух источников MySQL, сливающихся в одно место назначения MySQL?
У меня есть два разных экземпляра MySQL, которые я хотел бы "подчинить" третьему экземпляру. (так что я могу сделать легкие соединения в третьей инстанции)
например.
mysql1> show databases
db1
db2
mysql2> show databases
db3
db4
mysql3> show databases
db1
db2
db3
db4
Я посмотрел на maatkit (percona toolkit) pt-table-sync, но люди говорят, что он может повредить данные. (Очевидно, удаляет и повторно добавляет данные для создания вставок)
pt-archiver вроде работает для "снимков", но db1 занимает примерно 6 ГБ, и копирование всего этого требует гораздо больше данных, чем действительно необходимо. Обновления в реальном времени - всего около 100 МБ в день.
Для меня естественной концепцией было бы позволить mysql3 работать в качестве подчиненной реплики ОБА mysql1 и mysql2, но это, похоже, не вариант в MySQL
Репликатор вольфрама, кажется, позволяет синхронизировать данные такого типа, но он кажется немного громоздким для настройки, и меня беспокоит надежность.
У кого-нибудь есть другие решения, которые они использовали для этой проблемы?
2 ответа
По замыслу, один процесс mysqld не может одновременно слушать двух разных мастеров.
Команда CHANGE MASTER TO позволяет вам установить только один Master в качестве источника для чтения.
Чтобы подражать этому, вам придется программно переключаться между двумя Мастерами. Как ты это делаешь?
Вот основная идея
- Мастер М1
- Мастер М2
- Slave S1
Настройте репликацию M1 на S1 и затем M2 на S1 следующим образом
- 1) Пусть S1 запустит CHANGE MASTER TO с M1 в качестве источника
- 2) НАЧАТЬ РАБА;
- 3) Запустите репликацию на некоторое время
- 4) ОСТАНОВИТЬ РАБА;
- 5) Пусть S1 запустит CHANGE MASTER TO с M2 в качестве источника
- 6) НАЧАТЬ РАБА;
- 7) Запустите репликацию на некоторое время
- 8) ОСТАНОВИТЬ РАБА;
- 9) Вернитесь к шагу 1
Каждый раз, когда вы переключаетесь с одного мастера на другой, вы должны записать два значения из SHOW SLAVE STATUS\G
- Relay_Master_Log_file
- Exec_Master_Log_Pos
Эти два значения представляют собой последний оператор SQL, который поступил от мастера и должен был быть выполнен на ведомом устройстве.
Есть одно важное предостережение: пока M1 и M2 обновляют взаимоисключающие базы данных, этот алгоритм должен быть в порядке.
Хотите верьте, хотите нет, но я обратился к такому вопросу в ServerFault еще в мае 2011 года. На самом деле я объяснил, как эмулировать настоящего мультимастера / одного подчиненного с помощью BLACKHOLE Storage Engine, основанного на книге "High Performance MySQL".
Для этого нет хорошего инструмента для чтения. pt-table-sync работает не совсем так, как вам сказали (я написал;), но это не правильное решение. Я видел его функцию двунаправленной синхронизации, используемую для согласования серверов с центральным источником после преднамеренного отключения и обновления, но это не то решение, которое вам нужно.
Обычно я не рассказываю о продажах по таким темам, но, честно говоря, это тот случай, когда я бы привлек Percona для разработки нового инструмента для вас. Некоторые люди написали небольшие сценарии, которые соответствуют их личным сценариям, но качественного решения для общего пользования еще не существует, и на самом деле это не так сложно. Главное, что вам нужно формальное тестирование, и компоненты Percona Toolkit уже на 90% соответствуют тому, что вам нужно - просто нужно немного склеить между ними. Конечно, вы могли бы сделать это самостоятельно, но зачем создавать квадратное колесо и в конечном итоге поддерживать его самостоятельно и обнаруживать все его ошибки, когда вы меньше всего этого хотите?
Это сказало (конец продаж, извините) - решение, которое я предложил бы, должно избежать таблиц черной дыры и пойти с более простыми, менее проблемными методами. (Да, я тоже написал High Performance MySQL. Я знаю. В то время я не видел столько проблем с таблицами чёрных дыр, сколько имею сегодня.) Это должно делать примерно то, что предлагает Роландо, но есть некоторые тонкости. Например, он не должен позволять потоку ввода-вывода передавать поток данных с главного устройства, значительно опережая поток SQL, а затем выбрасывать все это при циклическом переходе на следующий сервер. Это было бы очень расточительно и сильно повлияло бы на мастера. Есть много мелких деталей, о которых нужно позаботиться - еще одна, которая приходит на ум, - это не переключение мастеров, когда используется временная таблица, вызванная репликацией.