MySQL в звездообразной топологии

У меня есть одна центральная база данных со всеми данными в MySQL 5.1-lastest-stable.
Я хочу подключить несколько клиентов в отношениях мастер-мастер.

Вопрос

Как настроить звездообразную топологию с 1 центральным сервером посередине с несколькими клиентскими базами данных, чтобы изменения в одном клиенте распространялись сначала на центральный сервер, а оттуда на все остальные клиентские базы данных?

Информация о базе данных

Я использую inno-db для всех таблиц и включил двоичный журнал.
Кроме этого, я научился делать master-master между базами данных.
Все таблицы имеют первичные ключи primary integer autoincrement . Если смещение и начало автоинкрементов настроены на разные клиентские базы данных, никогда не возникает конфликтов первичных ключей.

Почему я хочу этого

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


person Johan    schedule 11.03.2011    source источник
comment
Этот вопрос определенно относится к SF. Они бы знали гораздо больше о настройке MySQL (особенно в сценариях с несколькими серверами), чем SO.   -  person cHao    schedule 26.04.2011
comment
Будущие вопросы такого рода следует задавать на dba.stackexchange.com.   -  person RolandoMySQLDBA    schedule 29.04.2011
comment
@Rolando, заметил, сделает это.   -  person Johan    schedule 29.04.2011
comment
Ничего не стоит, что есть другие базы данных, которые изначально обрабатывают этот тип топологии. CouchDB заявляет, что это система распределенной базы данных на основе одноранговых узлов, которая позволяет пользователям и серверам получать доступ к одним и тем же общим данным и обновлять их при отключении, а затем двунаправленно реплицировать эти изменения позже. См. раздел Распределенные обновления и репликация. Если CouchDB делает это, вероятно, есть и другие, которые делают то же самое. (Я не использовал CouchDB для этой цели, просто руководствуясь их документацией).   -  person Animism    schedule 12.03.2014


Ответы (3)


Учитывая требование использовать MySQL Circular Replication против плавающих ведомых устройств в качестве средства для синхронизации БД, вот решение:

1 ведущий DB
4 ведомых DB


НАСТРОЙКА ГЛАВНОЙ БД

  1. Установите MySQL 5.1.x
  2. Убедитесь, что /etc/my.cnf
    server-id=1
    log-bin=mysql-bin
    expire-logs-days=14
    default-storgae-engine=InnoDB
  3. Запуск MySQL
  4. СБРОС МАСТЕРА; (Очистить двоичные журналы от мастера БД)
  5. Загрузить данные в Master
  6. ПРЕДОСТАВИТЬ ВЫБОР, ПОДЧИНЕННЫЙ РЕПЛИКАТОР НА . ДЛЯ replicator@'%' ИДЕНТИФИКАЦИЯ 'repl-password';

НАСТРОЙКА ПОДЧИНЕННЫХ БД

  1. Установите MySQL 5.1.x
  2. Убедитесь, что /etc/my.cnf
    server-id=(уникальный идентификатор сервера)
    log-bin=mysql-bin
    default-storage-engine=InnoDB
  3. Запуск MySQL
  4. CHANGE MASTER TO MASTER_HOST='IP-адрес мастера БД', MASTER_PORT=3306, MASTER_USER='replicator', MASTER_PASSWORD='repl-password', MASTER_LOG_FILE='mysql-bin.000001', MASTER_LOG_POS=106;
  5. НАЧАТЬ ПОДЧИНЕННЫЙ; (дайте репликации наверстать упущенное, проверьте SHOW SLAVE STATUS\G)
  6. СТОП РАБ;
  7. CHANGE MASTER TO MASTER_HOST='IP-адрес мастера распространения БД', MASTER_PORT=3306, MASTER_USER='replicator', MASTER_PASSWORD='repl-password', MASTER_LOG_FILE='mysql-bin.000001', MASTER_LOG_POS=106;
  8. НАЧАТЬ ПОДЧИНЕННЫЙ;

ПРОЦЕСС ИМПОРТИРОВАНИЯ

После того, как каждый ведомый БД подготовлен, миграция данных между главным и ведомым БД может выполняться следующим образом (DM для ведущего БД и DS для ведомого БД):

  1. На DS запустите SHOW MASTER STATUS;
  2. На DS запишите имя файла двоичного журнала и позицию
  3. В DM запустите CHANGE MASTER TO MASTER_HOST='IP-адрес DS', MASTER_PORT=3306, MASTER_USER='replicator', MASTER_PASSWORD='repl-password', MASTER_LOG_FILE='LogFile From Step2', MASTER_LOG_POS=(LogPos From Step2);
  4. На DM запустите START SLAVE; (позвольте репликации наверстать упущенное; изменения портов, внесенные DS в DM)
  5. На DM, СТОП РАБ;
  6. В DS запишите строку 2 /var/lib/mysql/master.info (файл журнала)
  7. В DS запишите строку 3 файла /var/lib/mysql/master.info (позиция журнала)
  8. На DS запустите CHANGE MASTER TO MASTER_HOST='IP-адрес DM', MASTER_PORT=3306, MASTER_USER='replicator', MASTER_PASSWORD='repl-password', MASTER_LOG_FILE='LogFile From Step6', MASTER_LOG_POS=(LogPos From Step7);
  9. На DS запустите START SLAVE; (позвольте репликации наверстать упущенное; изменения портов, внесенные DM в DS)
  10. На DS СТОП ВЕДОМОГО;

ВНИМАНИЕ

Процесс импорта имеет решающее значение !!! Вы должны каждый раз правильно записывать точный файл журнала и положение журнала.

Попробуйте !!!

Дай знать как дела!!!

person RolandoMySQLDBA    schedule 26.04.2011
comment
спасибо, что прояснили весь этот вопрос. Очень очень полезно, и я люблю детали. Я провел несколько тестов, и простая настройка работает, но мне все еще нужно провести более комплексное тестирование. Тем не менее награда вполне заслужена. - person Johan; 01.05.2011

Это похоже на работу особого типа топологии репликации MySQL.

Топология, которую я имею в виду, называется Distribution Master, она взята со страниц 368-370 книги Высокопроизводительный MySQL: оптимизация, резервное копирование, репликация и многое другое под заголовком "Мастер", "Мастер распространения" и "Подчиненные устройства".

Вам понадобится следующее

1 главный сервер БД
1 главный сервер распределения БД (известный как /dev/null Slave или Blackhole Slave)
любое количество подчиненных БД


НАСТРОЙКА ГЛАВНОЙ БД

  1. Установите MySQL 5.1.x
  2. Убедитесь, что /etc/my.cnf
          server-id=1
          log-bin=mysql-bin
          expire-logs-days=14
          default-storgae-engine=InnoDB
  3. Запуск MySQL
  4. СБРОС МАСТЕРА; (Очистить двоичные журналы от мастера БД)
  5. Загрузить данные в Master
  6. ПРЕДОСТАВИТЬ ВЫБОР, ПОДЧИНЕННЫЙ РЕПЛИКАТОР НА . ДЛЯ replicator@'%' ИДЕНТИФИКАЦИЯ 'repl-password';

НАСТРОЙКА ГЛАВНОГО РАСПРЕДЕЛИТЕЛЯ БД

  1. Установите MySQL 5.1.x
  2. Убедитесь, что /etc/my.cnf
          server-id=2
          log-bin=mysql-bin
          expire-logs-days=14
          default-storage-engine=BLACKHOLE
          пропустить -innodb
  3. Запуск MySQL
  4. CHANGE MASTER TO MASTER_HOST='IP-адрес мастера БД', MASTER_PORT=3306, MASTER_USER='replicator', MASTER_PASSWORD='repl-password', MASTER_LOG_FILE='mysql-bin.000001', MASTER_LOG_POS=106;
  5. НАЧАТЬ ПОДЧИНЕННЫЙ;
  6. ПРЕДОСТАВИТЬ ВЫБОР, ПОДЧИНЕННЫЙ РЕПЛИКАТОР НА . ДЛЯ replicator@'%' ИДЕНТИФИКАЦИЯ 'repl-password';
  7. Для каждой таблицы, которая не находится в базе данных information_schema и не находится в базе данных mysql, преобразуйте каждую таблицу в механизм хранения BLACKHOLE следующим образом: ALTER TABLE tblname ENGINE=BLACKHOLE;
  8. СБРОС МАСТЕРА; (Очистить двоичные журналы от мастера распределения БД)

НАСТРОЙКА ПОДЧИНЕННЫХ БД

  1. Установите MySQL 5.1.x
  2. Убедитесь, что /etc/my.cnf
          server-id=3
          default-storage-engine=InnoDB
  3. Запуск MySQL
  4. CHANGE MASTER TO MASTER_HOST='IP-адрес мастера БД', MASTER_PORT=3306, MASTER_USER='replicator', MASTER_PASSWORD='repl-password', MASTER_LOG_FILE='mysql-bin.000001', MASTER_LOG_POS=106;
  5. НАЧАТЬ ПОДЧИНЕННЫЙ; (дайте репликации наверстать упущенное, проверьте SHOW SLAVE STATUS\G)
  6. СТОП РАБ;
  7. CHANGE MASTER TO MASTER_HOST='IP-адрес мастера распространения БД', MASTER_PORT=3306, MASTER_USER='replicator', MASTER_PASSWORD='repl-password', MASTER_LOG_FILE='mysql-bin.000001', MASTER_LOG_POS=106;
  8. НАЧАТЬ ПОДЧИНЕННЫЙ;

Цель настройки состоит в том, чтобы мастер БД обрабатывал только SQL, предназначенный только для мастера БД. SQL, который должен быть реплицирован на подчиненные БД, обрабатывается мастером распространения БД. Это облегчит мастеру БД обработку передачи SQL на ведомый; это становится обязанностью мастера распространения БД. Все ведомые устройства читают изменения SQL из мастера распределения БД, а не из мастера БД.

Хотя я не полностью понимаю ваше приложение, эта топология должна должным образом поддерживать одну центральную базу данных и несколько подчиненных устройств чтения без ограничения ввода-вывода центральной базы данных. Ваше приложение должно организовывать INSERT, UPDATE и DELETE для клиентской базы данных, пока каждый ноутбук обрабатывает уникальный набор клиентов, отличающихся от других ноутбуков.


ПРЕДОСТЕРЕЖЕНИЕ

Возможно, вам придется провести серьезное тестирование подчиненных БД, чтобы убедиться, что данные не исчезают из-за установки BLACKHOLE. Если это произойдет, попробуйте удалить 'default-storage-engine=BLACKHOLE' и перезагрузить все.


Будущие вопросы такого рода следует задавать на dba.stackexchange.com.

person RolandoMySQLDBA    schedule 25.04.2011
comment
Спасибо, это было очень полезно. Позволит ли это изменениям с ноутбуков распространиться на главный и оттуда на другие ноутбуки? - person Johan; 25.04.2011
comment
@Johan Вот вопрос: если каждый ноутбук также является мастером, будет ли у мастера распределения БД отдельная база данных, которая будет обрабатываться отдельным ноутбуком, что касается операций INSERT, UPDATE и DELETE ??? - person RolandoMySQLDBA; 25.04.2011
comment
3 или 4 ноутбука могут совместно использовать базу данных. Таким образом, значения автоинкремента должны быть настроены так, чтобы идентификаторы ключей не конфликтовали, эту часть я знаю. И изменения в ноутбуках необходимо перенести на центральный мастер, а оттуда на другие ноутбуки. - person Johan; 26.04.2011
comment
@ Йохан, я вижу. Ответ, который я дал, будет работать только в том случае, если ноутбук запишет свои изменения в мастер БД и читает сам. На самом деле вам не нужен мастер распространения БД. Вам необходимо синхронизировать каждое ведомое устройство БД с главным устройством БД. Единственным ограничением является то, что только один ведомый DB подключен к ведущему DB из-за метода синхронизации циклической репликации, который вы хотите использовать. Я напишу другой ответ. - person RolandoMySQLDBA; 26.04.2011

Да, вы можете настроить несколько баз данных MySQL в описанной вами топологии.

То, что вы хотите сделать, называется репликацией.

Вот раздел Репликация из руководства по MySQL 5.1.

person Gilbert Le Blanc    schedule 11.03.2011
comment
Конфигурация, которую я хочу, официально не поддерживается MySQL (но я все равно хочу ее), поэтому мне нужно сделать некоторую умную настройку, чтобы заставить ее работать. Приложение имеет низкую скорость обновления и среднюю скорость чтения. Так что это не напрягает серверы. - person Johan; 11.03.2011
comment
Репликация — это отношения ведущий-ведомый. Мне нужны отношения мастер-хозяин, в которых каждый участник является хозяином для любого другого участника. - person Johan; 11.03.2011
comment
@Йохан; Отношения «хозяин-хозяин» можно рассматривать как пару взаимодополняющих отношений «ведущий-ведомый». Я не эксперт по репликации, но я уверен, что вам придется проделать некоторую работу самостоятельно, чтобы построить свою узловую и лучевую топографию. - person Gilbert Le Blanc; 11.03.2011