Реплікація ВСІХ баз даних MySQL Master-Master. Як?


16

Передумови : У мене є два налаштування серверів MySQL 5.1 у програмі Master-Master на основі рядкової реплікації (RBR) за цим чудовим посібником . Я хочу, щоб усі бази даних повторювалися, і вони будуть регулярно додавати нові бази даних.

Мета : Я хотів би мати можливість додавати нові бази даних до реплікації, просто додавши БД на один із серверів; не потрібно зупиняти обох рабів, змінити конфігураційні файли, перезапустити сервери MySQL та запустити раби знову.

Питання : З того, що я прочитав, я думаю , що я можу зробити це, просто опускаючи будь binlog-do-db, binlog-ignore-db, replicate-do-dbі replicate-ignore-dbнастройки в конфігурації кожного сервера, але я не можу бути впевнений. Документи MySQL про те , як оцінюються параметри реплікації на рівні баз даних та таблиць , змушують мене думати, що це взагалі не може бути досягнуто.

Відповідні частини моїх /etc/mysql/my.cnfфайлів скопійовані нижче. Я на правильному шляху? Чи те, що я хочу, навіть можливо?

Майстер 1 :

[mysqld]
binlog-format = row
server-id = 1
replicate-same-server-id = 0
auto-increment-increment = 2
auto-increment-offset = 1

master-host = <master2_ip>
master-user = slave_user
master-password = <password>
master-connect-retry = 60

log-bin = /var/log/mysql/mysql-bin.log
relay-log = /var/lib/mysql/slave-relay.log
relay-log-index = /var/lib/mysql/slave-relay-log.index
expire_logs_days = 14
max_binlog_size = 2048M

Майстер 2 :

[mysqld]
binlog-format = row
server-id = 2
replicate-same-server-id = 0
auto-increment-increment = 2
auto-increment-offset = 2

master-host = <master1_ip>
master-user = slave_user
master-password = <password>
master-connect-retry = 60

log-bin = /var/log/mysql/mysql-bin.log
relay-log = /var/lib/mysql/slave-relay.log
relay-log-index = /var/lib/mysql/slave-relay-log.index
expire_logs_days = 14
max_binlog_size = 2048M

1
Створіть БД на машині, на яку направляєте, пише.
Мартін

яка ваша повна конфігурація? Я намагаюсь відповісти на тези нижче, це не вийшло :-(
zx1986

Відповіді:


17

Ось як я це зробив для обох майстрів

log-bin = mysqld-bin
binlog-ignore-db=test
binlog-ignore-db=information_schema
binlog-ignore-db=mysql
log-slave-updates
replicate-ignore-db=test
replicate-ignore-db=information_schema
replicate-ignore-db=mysql
relay-log=mysqld-relay-bin

Чи можете ви додати бази даних до будь-якого ведучого та автоматично повторювати їх в інші?
Ендрю Енслі

так, вони зробили .. Я просто встановив, які з них ігнорувати
Майк,

1
Два питання: Мені просто потрібно переконатися, що ми обидва говоримо одне і те ж. # 1 Чи можете ви додати базу даних до одного з двох ведучих, і вона створюється на іншому автоматично, а потім усі дані, вставлені в нову базу даних, реплікуються без зміни конфігурації або перезавантаження серверів? # 2 Ви використовуєте реплікацію або реплікацію на основі рядків? Мені потрібні всі зміни на всіх реплікуваних базах даних; навіть ті, хто працює заздалегідь без оператора "use". Чи добре ці налаштування працюватимуть із реплікацією на основі рядків?
Ендрю Енслі

3
так, так, так, так, так :)
Майк

1
Гаразд, я просто налаштував свої сервери за допомогою цих налаштувань минулої ночі. Я пропустив log-slave-updatesналаштування, бо не бачив у цьому потреби. Все працює чудово. Я маю змогу додавати та відміняти бази даних, а зміни тиражуються. Дякую! Нагороджений баунті
Ендрю Енслі

4

Що стосується створення баз даних, все ще є повідомлення про помилки щодо використання CREATE DATABASE з реплікацією на основі рядків.

Цей звіт закритий, але помилка знову з’явилася в MySQL 5.1.47
Цей звіт заснований на кластері MySQL (двигун зберігання NDB).
Цей звіт заснований на реплікації таблиці wild-ignore, яка все ще реплікується.

Реплікація на основі рядків призводить до того, що бінарні журнали зростають з надзвичайною швидкістю, що може спричиняти мережевий трафік, просто переносячи дані бінарних журналів у реле-журнали підлеглого.

@Mike каже, що він створив базу даних для роботи та реплікації просто чудово. Я в цьому зовсім не сумніваюся. Що я є, трохи змушує MySQL (е. Oracle), що не отримав усі перегини від реплікації на основі рядків, як тільки база даних буде створена.

Ви можете перейти на row_format MIXED, якщо ви все ще хочете запису на основі рядків у двійкових журналах. Внутрішній формат бінарного журналу має тенденцію проходити між оператором та фіксованим у будь-якому випадку: (Див. Http://bugs.mysql.com/bug.php?id=40146 ). Більше звітів про помилки закриваються за допомогою змішаних і відхиляються від рядків ( http://bugs.mysql.com/bug.php?id=39701 ), але проблеми з періодичністю зберігаються.

Фінальна примітка

Для власного розуму поверніться до реплікації на основі висловлювань і таким чином зробіть CREATE DATABASE (що є заявою SQL) стабільним та послідовним для наступних SQL проти створеної бази даних. Насправді, останній звіт про помилку показує, що найкраще використовувати реплікацію на основі оператора, незалежно від того, що говорить документація про параметри на рівні бази даних та рівня таблиці.


Дякую за всю цю інформацію. Моя єдина проблема з реплікацією на основі висловлювань полягає в тому, що зміни, що задають базу даних (тобто "INSERT INTO db1.table1 (col1) VALUES ('привіт');"), не працюватимуть, якщо база даних не є поточною базою даних, яка використовується. Я припускаю, що може прийшов час перейти до реплікації на основі висловлювань та очистити якийсь код ...
Ендрю Енслі

Виявляється, виправити необхідний код було не так складно. Зараз я використовую реплікацію на основі висловлювань. Дякую за пораду.
Ендрю Енслі

0

Хм ... Вам також доведеться розібратися з способом обробки / диференціювання автоматично збільшених ключів і полів. Це виглядає цікаво .. http://mysql-mmm.org/


Це обробляється в налаштуваннях auto-increment-incrementта auto-increment-offsetмоїх файлах конфігурації. Дивіться цю сторінку: dev.mysql.com/doc/refman/5.1/en/…
Ендрю Енслі

Я думаю, ти неправильно розумієш. @Andrew говорить про додавання нових баз даних, а не про додавання нових серверів баз даних. Якщо @Andrew представляє нові сервери баз даних, то, можливо, може відбутися зіткнення ключів при перерозподілі даних серед трьох і більше серверів БД, на які відповідатиме ваша відповідь. +1 за ваші зусилля, але уважно прочитайте всі питання уважно. Мене спалили так само.
RolandoMySQLDBA

@all: На жаль .. Вибачте. Я міг би поклястись, що я прочитав його повною
мірою

-1

cmiiw Я думав, ви повинні мати змогу створити базу даних на master1 та master2, не змінюючи конф або зупиняючи підлеглий, але переконайтеся, що реплікація master - master працює. оскільки ви не визначаєте, яку базу даних потрібно копіювати, це означає, що вся база даних буде реплікуватися, якщо ви не визначите її на my.cnf.


Це саме те, про що я тут прошу. Я поки не можу знайти остаточну відповідь на це.
Ендрю Енслі
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.