Jeden niewolnik, wielu panów MySql

9

Czy można skonfigurować replikację MySql, aby jeden slave nasłuchiwał dwóch różnych masterów?

Jonny
źródło

Odpowiedzi:

3

Z założenia jeden proces mysqld nie może jednocześnie słuchać dwóch różnych Masterów.

Polecenie CHANGE MASTER TO pozwala tylko ustawić jednego Master jako źródło do odczytu.

Aby to naśladować, musiałbyś programowo przełączać się między dwoma Mistrzami. Jak to robisz?

W StackOverflow opisałem, jak ręcznie podłączyć niewolnika do różnych panów, gdzie każdy pan był laptopem, a niewolnik był komputerem centralnym.

Oto podstawowy pomysł

  • Mistrz M1
  • Mistrz M2
  • Slave S1

Skonfiguruj replikację M1 do S1, a następnie M2 do S1 w ten sposób

  • 1) S1 uruchom CHANGE MASTER TO z M1 jako Źródłem
  • 2) ROZPOCZNIJ SLAVE;
  • 3) Uruchom replikację na chwilę
  • 4) STOP SLAVE;
  • 5) S1 uruchom CHANGE MASTER TO z M2 jako źródłem
  • 6) ROZPOCZNIJ SLAVE;
  • 7) Uruchom replikację na chwilę
  • 8) STOP SLAVE;
  • 9) Wróć do kroku 1

Za każdym razem, gdy przełączasz się z jednego urządzenia głównego na inny, musisz zapisać dwie wartości z SHOW SLAVE STATUS\G

  1. Relay_Master_Log_file
  2. Exec_Master_Log_Pos

Te dwie wartości reprezentują ostatnią instrukcję SQL, która pochodzi od Master i była następnie wykonywana w Slave.

Jest jedna główna uwaga: dopóki M1 i M2 aktualizują wzajemnie wykluczające się bazy danych, algorytm ten powinien być w porządku.

Wierzcie lub nie, w maju 2011 r. Zwróciłem się z takim pytaniem do ServerFault. Właściwie wyjaśniłem, jak emulować prawdziwego multimastera / pojedynczego slave'a za pomocą silnika pamięci BLACKHOLE opartego na książce „High Performance MySQL”.

RolandoMySQLDBA
źródło
Chociaż sam tak naprawdę go nie potrzebowałem, myślałem o tym wcześniej. Czy nie byłoby możliwe w zasadzie potokowanie binlogu drugiego mistrza do mysql slave? Wydaje mi się, że najlepszą rzeczą byłoby posiadanie narzędzia, które również monitoruje wyniki każdego zapytania i zatrzymuje się na błędzie, tak jak robi to normalny wątek replikacyjno-podrzędny. Ale w gruncie rzeczy zwykła fajka też powinna zrobić. Oczywiście obaj mistrzowie piszący do tej samej bazy danych / tabeli szybko staną się trudni. Coś, nad czym zastanawiają się guru?
Jannes,
1
Myślę, że warto dodać do twojej odpowiedzi, że chociaż MySQL 5.6 tego nie robi, to 5.7 będzie obsługiwać wiele wzorców.
Phil Sumner,
4

Rozwiązanie Rolando ma wiele zastrzeżeń. Pierwszy z nich to strumień repliki, który niekoniecznie się replikuje, podczas gdy drugi działa. To da ci okresy, w których twój niewolnik nie jest zsynchronizowany. Musisz teraz wykonać delikatny balans, aby upewnić się, że każdy ma wystarczająco dużo czasu, aby nadrobić zaległości, gdy ma swoją „turę”.

Jak opisano, musisz także zagrać w księgę pozycji dziennika, aby przełączyć się z powrotem. To naprawdę wydaje się błędne, otwierając okno na brakujące lub niespójne dane, a nawet przerywając replikację, gdy pójdzie nie tak (albo spowodowane przez błąd tylko „wyłączony przez jeden” w pozycji dziennika)

Poleciłbym po prostu uruchomienie wielu instancji mysql. Nic nie stoi na przeszkodzie, aby uruchomić dwa lub więcej mysqlów na tej samej maszynie. Oczywiście nie mogą one działać na tym samym porcie. Nie uważam tego jednak za problem, ponieważ każdy klient i biblioteka pozwala określić coś innego niż 3306.

Wystarczy podać port = 3307 (lub cokolwiek w jednym z plików .cnf).

Należy również zadbać o to, aby indywidualnie skonfigurowane pule buforów i inne konfiguracje pamięci nie były ze sobą sprzeczne. Jest to w rzeczywistości korzyść, ponieważ można dokładniej dostroić te ustawienia do konkretnych wymagań poszczególnych replikowanych baz danych.

W ten sposób masz tylko dwa strumienie replikacji uruchomione na tym samym serwerze; nigdy z tyłu, nie wymaga prowadzenia ksiąg rachunkowych, nie jest wymagany skrypt „zamiany”.

atxdba
źródło
Cieszę się, że ktoś rozumie szaleństwo księgowe. Dobra odpowiedź. +1 !!!
RolandoMySQLDBA
0

Wentylator w (replikacja z wielu źródeł) będzie obsługiwany z MySQL 5.7.

Wersja laboratorium jest dostępna tutaj: http://labs.mysql.com/

Morgan Tocker
źródło
0

Można użyć MariaDB, który może być użyty jako zamiennik w miejscu MySql. Obsługuje to od wersji 10.2

Problem ze wsparciem dla MySQL 5.7 polega na potrzebie GTID, co oznacza, że ​​MUSISZ również zostać zmieniony, w przypadku MariaDb tak nie jest.

Przykład / HowTo link: http://www.skysql.com/blogs/dean-ellis/multi-source-replication-mariadb-100

Roman M.
źródło