MySQL Master-Master Replikacja WSZYSTKICH baz danych. W jaki sposób?


16

Tło : Mam dwa serwery MySQL 5.1 skonfigurowane w replikacji opartej na wierszach Master-Master (RBR) zgodnie z tym doskonałym przewodnikiem . Chcę replikować wszystkie bazy danych i będę regularnie dodawać nowe bazy danych.

Cel : Chciałbym móc dodawać nowe bazy danych do replikacji, po prostu dodając bazę danych do jednego z serwerów; bez konieczności zatrzymywania obu urządzeń podrzędnych, zmiany plików konfiguracyjnych, restartowania serwerów MySQL i ponownego uruchamiania urządzeń podrzędnych.

Pytanie : Z tego co czytałem, ja myślę mogę to zrobić po prostu pomijając binlog-do-db, binlog-ignore-db, replicate-do-dboraz replicate-ignore-dbustawienia w konfiguracji każdego serwera, ale nie mogę być pewien. Dokumenty MySQL o tym, jak oceniane są opcje replikacji na poziomie bazy danych i tabeli, sprawiają, że myślę, że może to nie być w ogóle możliwe.

Odpowiednie części moich /etc/mysql/my.cnfplików są kopiowane poniżej. Czy jestem na dobrej drodze? Czy to, czego chcę, jest w ogóle możliwe?

Mistrz 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

Mistrz 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
Utwórz bazę danych na komputerze, na który kierujesz zapisy.
Martin

jaka jest twoja pełna konfiguracja? Próbuję odpowiedzi poniżej, to nie zadziałało :-(
zx1986,

Odpowiedzi:


17

Tak zrobiłem dla obu mistrzów

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

Czy jesteś w stanie dodać bazy danych do jednego z nich i automatycznie replikować je do drugiego?
Andrew Ensley,

tak, zrobili .. po prostu konfiguruję, które zignorować
Mike

1
Dwa pytania: Muszę tylko upewnić się, że oboje mówimy to samo. # 1 Czy jesteś w stanie dodać bazę danych do jednego z dwóch wzorców, a następnie utworzyć go automatycznie, a następnie wszystkie dane wstawione do nowej bazy danych są replikowane bez zmiany konfiguracji lub restartowania serwerów? # 2 Czy używasz replikacji opartej na instrukcjach lub wierszach? Potrzebuję replikować wszystkie zmiany we wszystkich bazach danych; nawet te działają wcześniej bez instrukcji „use”. Czy te ustawienia będą działać dobrze z replikacją opartą na wierszach?
Andrew Ensley,

3
tak tak tak tak tak :)
Mike

1
Ok, właśnie skonfigurowałem swoje serwery, używając tych ustawień zeszłej nocy. Pominąłem log-slave-updatesustawienie, ponieważ nie widziałem potrzeby. Wszystko działa idealnie. Jestem w stanie dodawać i usuwać bazy danych, a zmiany są replikowane. Dziękuję Ci! Nagroda przyznana.
Andrew Ensley,

4

Jeśli chodzi o tworzenie baz danych, nadal istnieją raporty o błędach dotyczące korzystania z funkcji UTWÓRZ BAZY DANYCH z replikacją opartą na wierszach.

Ten raport jest zamknięty, ale błąd pojawił się ponownie w MySQL 5.1.47.
Ten raport jest oparty na klastrze MySQL (silnik pamięci NDB).
Ten raport jest oparty na replikacji tabeli wild-ignore-ignore.

Replikacja oparta na wierszach powoduje, że dzienniki binarne rosną w niezwykłym tempie, co może zwiększyć ruch w sieci, wysyłając dane dziennika binarnego do dzienników przekaźników urządzenia podrzędnego.

@Mike mówi, że udało mu się stworzyć bazę danych i wykonać replikację. W ogóle w to nie wątpię. To, czym jestem, jest trochę obojętne na to, że MySQL (eh Oracle) nie ma problemów z replikacją opartą na wierszach po utworzeniu instancji bazy danych.

Możesz przełączyć na wiersz_format MIESZANY, jeśli nadal chcesz wpisy oparte na wierszach w dziennikach binarnych. Wewnętrzny format dziennika binarnego i tak ma tendencję do przemieszczania się między instrukcją a naprawiony: (Patrz http://bugs.mysql.com/bug.php?id=40146 ). Więcej raportów o błędach jest zamykanych przy użyciu mieszanych i unikających opartych na wierszach ( http://bugs.mysql.com/bug.php?id=39701 ), ale problemy nadal występują sporadycznie.

UWAGI KOŃCOWE

Dla własnego zdrowia powróć do replikacji opartej na instrukcjach i w ten sposób utwórz CREATE DATABASE (która jest instrukcją SQL) stabilną i spójną dla kolejnych instrukcji SQL względem utworzonej bazy danych. W rzeczywistości najnowszy raport o błędach pokazuje, że najlepiej jest korzystać z replikacji opartej na instrukcjach, niezależnie od tego, co dokumentacja mówi o opcjach na poziomie bazy danych i na poziomie tabeli.


Dzięki za te wszystkie informacje. Moim jedynym problemem z replikacją opartą na instrukcjach jest to, że zmiany określające bazę danych (tj. „INSERT INTO db1.table1 (col1) VALUES ('hi');”) nie będą działać, chyba że baza danych jest bieżącą bazą danych w użyciu. Przypuszczam, że nadszedł czas, aby przejść do replikacji opartej na instrukcjach i wyczyścić trochę kodu ...
Andrew Ensley

Okazuje się, że naprawienie niezbędnego kodu nie było takie trudne. Korzystam teraz z replikacji opartej na instrukcjach. Dzięki za radę.
Andrew Ensley,

0

Hmm ... Będziesz także musiał wymyślić sposób obsługi / różnicowania automatycznie zwiększanych klawiszy i pól. To wygląda interesująco .. http://mysql-mmm.org/


Jest to obsługiwane w ustawieniach auto-increment-incrementi auto-increment-offsetw moich plikach konfiguracyjnych. Zobacz tę stronę: dev.mysql.com/doc/refman/5.1/en/…
Andrew Ensley

Myślę, że źle zrozumiałeś. @Andrew mówi o dodawaniu nowych baz danych, a nie dodawaniu nowych serwerów baz danych. Gdyby @Andrew wprowadzał nowe serwery baz danych, to mogą wystąpić kolizje kluczy podczas redystrybucji danych między 3 lub więcej serwerami DB, co rozwiązałoby twoja odpowiedź. +1 za wysiłek, ale proszę uważnie przeczytać wszystkie pytania. Zostałem spalony w ten sam sposób.
RolandoMySQLDBA

@all: Ups .. Przepraszamy. Mógłbym przysiąc, że przeczytałem go w całości, ale nie musiałem w zamian
przejrzeć

-1

cmiiw pomyślałem, że powinieneś być w stanie utworzyć bazę danych na master1 i master2 bez zmiany conf lub zatrzymania slave, ale upewnij się, że replikacja master-master działa. ponieważ nie definiujesz bazy danych, która ma zostać zreplikowana, oznacza to, że cała baza danych zostanie zreplikowana, jeśli nie zdefiniujesz jej na my.cnf.


Właśnie o to tutaj pytam. Jak dotąd nie jestem w stanie znaleźć ostatecznej odpowiedzi.
Andrew Ensley,
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.