Динамическое разделение таблицы с основного на удаленный сервер MySQL

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

РЕДАКТИРОВАТЬ: у меня настроена репликация, при которой таблица на главном сервере реплицируется на четырех подчиненных серверах. Ведомым не нужно реплицировать ВСЮ таблицу на главном сервере, а только ее часть, как показано на рисунке. Как этого добиться?

Изображение: Репликация разделов


person JuanV    schedule 06.03.2016    source источник
comment
Пожалуйста, не используйте раздел — у него есть конкретная техническая реализация, о которой вы не говорите.   -  person Rick James    schedule 07.03.2016
comment
Репликация — это метод, обычно используемый для синхронизации подчиненных серверов с главным сервером. Но вы, кажется, хотите, чтобы у каждого ведомого было только подмножество данных? Этого можно добиться, если разделение осуществляется по базе данных или таблице, а не по какому-либо ключу.   -  person Rick James    schedule 07.03.2016
comment
Итог: у MySQL нет инструментов, о которых вы просите; либо изобретите свой собственный инструмент, либо переосмыслите свой дизайн.   -  person Rick James    schedule 07.03.2016
comment
Я что-то упускаю. Насколько я понимаю, секционирование таблицы порождает несколько таблиц. Разве нельзя реплицировать только один из них на удаленном сервере?   -  person JuanV    schedule 07.03.2016
comment
Нет. Эти таблицы нельзя обрабатывать как отдельные таблицы. Вы можете экспортировать раздел, чтобы удалить его из таблицы, а затем рассматривать его как таблицу. Но это несколько шагов, и они не применяются к желаемой репликации.   -  person Rick James    schedule 07.03.2016
comment
У меня настроена репликация, при которой таблица на главном сервере реплицируется на четыре подчиненных сервера. Ведомым не нужно реплицировать ВСЮ таблицу на главном сервере, а только ее часть, как показано на рисунке. Как этого добиться?   -  person JuanV    schedule 08.06.2016
comment
Невозможно отфильтровать репликацию по PARTITION.   -  person Rick James    schedule 08.06.2016
comment
Можно ли синхронизировать раздел с таблицей в той же базе данных (не реплицируемой ведомой)?   -  person JuanV    schedule 08.06.2016
comment
Нет. Вы можете заменить таблицу или раздел на другой. См. переносимые табличные пространства.   -  person Rick James    schedule 08.06.2016
comment
Спасибо, но переносимые табличные пространства не решают мою проблему. Мне нужно свести к минимуму трафик данных из реплицирующей таблицы от мастера к ведомым. Вот почему мне было интересно, можно ли реплицировать только разделы. Например, если есть обновление только в одном столбце записи на ведущем устройстве, все ли данные для всех столбцов всей записи передаются подчиненному устройству или только обновленному столбцу? Я знаю, что это может звучать глупо, но я думаю, что смогу справиться с репликацией трафика данных со всей таблицей, если буду обновлять только столбцы TinyInt.   -  person JuanV    schedule 08.06.2016
comment
Вы можете фильтровать базу данных, чтобы ограничить то, что выходит из Мастера. Но это относится ко всем рабам. Мне трудно представить, что вы копируете столько данных, что сеть становится узким местом. Объясните, пожалуйста, почему у вас такая узкая трубка.   -  person Rick James    schedule 08.06.2016
comment
Ведомые базы данных работают на встроенных устройствах, и их количество со временем увеличивается в зависимости от требований. Это трехуровневая древовидная топология, в которой мастер является головным, а подчиненным на втором уровне нужно обрабатывать только подмножества данных устройств третьего уровня, которые соответствуют их ветви. Система должна быть масштабируемой, чтобы при добавлении дополнительных ведомых устройств реплицируемая таблица пропорционально увеличивалась. В ведущем устройстве обновляется только один столбец в определенной строке. Все столбцы передаются подчиненным устройствам или только обновленный?   -  person JuanV    schedule 08.06.2016


Ответы (1)


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

Мастер -> Реле -> Устройства

Каждое реле одновременно является ведомым (по отношению к ведущему) и ведущим по отношению к одному (или нескольким) устройствам. В Relay таблицы, которые вы не хотите открывать на устройстве, объявляются ENGINE=BLACKHOLE. Остальные таблицы в Relay объявляются нормально.

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

Изменить (на основе изображения)

Чтобы ограничить пространство на подчиненных устройствах, используйте команды «replicate_do/ignore» на подчиненных устройствах. Это не уменьшит пропускную способность от Мастера или к Ведомым. Настройки replicate_* удалят большую часть реплицированных данных.

Внедрите вышеупомянутые Relays и Blackhole, если вам нужно ограничить пропускную способность в Slave.

person Rick James    schedule 09.06.2016
comment
Я не правильно описал, когда писал, что устройствам второго уровня нужно обрабатывать данные, которые соответствуют их ветке. На самом деле им необходимо хранить данные и передавать их по радиоканалу на конечные устройства, потому что конечные устройства не имеют достаточной вычислительной мощности для поддержки сервера базы данных. - person JuanV; 10.06.2016
comment
Все данные должны храниться в одной таблице на главном сервере, но нет ограничений на добавление дополнительных таблиц в базу данных, если это необходимо для репликации. Лучше поясню на рисунке: i.imgur.com/F66H1Vy.jpg - person JuanV; 10.06.2016
comment
Понял, спасибо за помощь - person JuanV; 13.06.2016