MySQL в топологии звезды - PullRequest
       19

MySQL в топологии звезды

9 голосов
/ 11 марта 2011

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

Вопрос

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

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

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

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

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

Ответы [ 3 ]

10 голосов
/ 26 апреля 2011

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

1 БД Мастер
Рабы 4 дБ


НАСТРОЙКА DB MASTER

  1. Установить MySQL 5.1.x
  2. Убедитесь, что /etc/my.cnf
    Сервер-ID = 1
    лог-бен = MySQL-бен
    истекают-журналы-дней = 14
    по умолчанию-storgae двигатель = InnoDB
  3. Запуск MySQL
  4. RESET MASTER; (Очистить двоичные журналы от DB Master)
  5. Загрузка данных в мастер
  6. GRANT SELECT, РЕБЛИКАЦИЯ РАБОТАЕТ НА . TO репликатору @ '%', идентифицированному 'repl-password';

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

  1. Установить MySQL 5.1.x
  2. Убедитесь, что /etc/my.cnf
    идентификатор сервера = (уникальный идентификатор сервера)
    лог-бен = MySQL-бен
    по умолчанию, при хранении двигателя = InnoDB
  3. Запуск MySQL
  4. CHANGE MASTER TO MASTER_HOST = 'IP-адрес Мастера БД', MASTER_PORT = 3306, MASTER_USER = 'репликатор', MASTER_PASSWORD = 'пароль repl-пароля', MASTER_LOG_FILE = 'mysql-bin.000001', MASTER_LOG_POS = 106 *
  5. НАЧАТЬ РАБА; (пусть репликация наверстает, проверьте SHOW SLAVE STATUS \ G)
  6. STOP SLAVE;
  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 1057 *
  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 = 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 = Step7);
  9. На DS, запустить START SLAVE; (пусть репликация догонит; изменения портов введены DM в DS)
  10. На DS, ОСТАНОВИТЬ РАБА;

CAVEAT

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

Попробуй !!!

Дайте мне знать, как это происходит !!!

2 голосов
/ 25 апреля 2011

Это звучит как работа особого типа топологии репликации MySQL

Топология, которую я имею в виду, называется «Мастер распространения», которая взята со страниц 368–370 книги. Высокопроизводительный MySQL: оптимизация, резервное копирование, репликация и многое другое в подзаголовке «Мастер, Мастер Распределения и Рабы ".

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

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


НАСТРОЙКА DB MASTER

  1. Установить MySQL 5.1.x
  2. Убедитесь, что /etc/my.cnf
    Сервер-ID = 1
    лог-бен = MySQL-бен
    истекают-журналы-дней = 14
    по умолчанию-storgae двигатель = InnoDB
  3. Запуск MySQL
  4. RESET MASTER; (Очистить двоичные журналы от DB Master)
  5. Загрузка данных в мастер
  6. GRANT SELECT, РЕБЛИКАЦИЯ РАБОТАЕТ НА . TO репликатору @ '%', ОПРЕДЕЛЯЕМОМУ 'repl-password';

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

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

НАСТРОЙКА РАБОВ DB

  1. Установить MySQL 5.1.x
  2. Убедитесь, что /etc/my.cnf
    Сервер-ID = 3
    по умолчанию, при хранении двигателя = InnoDB
  3. Запуск MySQL
  4. CHANGE MASTER TO MASTER_HOST = 'IP-адрес Мастера БД', MASTER_PORT = 3306, MASTER_USER = 'репликатор', MASTER_PASSWORD = 'пароль repl-пароля', 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 1097 *
  8. НАЧАТЬ РАБА;

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

Хотя я не полностью понимаю ваше приложение, эта топология должна должным образом поддерживать одну центральную базу данных и несколько ведомых считывающих устройств без ввода-вывода, ограничивающего центральную базу данных. Ваше приложение должно организовывать ВСТАВКИ, ОБНОВЛЕНИЯ и УДАЛЕНИЯ в клиентскую базу данных, если каждый ноутбук обрабатывает уникальный набор клиентов, отличных от других ноутбуков и отличных от них.


CAVEAT

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


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

0 голосов
/ 11 марта 2011

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

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

Вот раздел Replication из руководства MySQL 5.1.

...