2013-04-01 28 views
7

AppA przechowuje/pobiera dane z dbA.tableA. AppB przechowuje/pobiera dane z dbB.tableA. Definicja tableA jest taka sama w tych bazach danych. Na początek: dbB.tableA został skopiowany z dbA.tableA (zakładając, że oba mają 5 wierszy).Replikacja dwukierunkowa dla tej samej tabeli MySQL

row6 został stworzony przez AppA (powiedz klucz podstawowy 6) row7 został stworzony przez AppB (powiedz klucz podstawowy 7). Chciałbym row7 być kopiowane do dbA.tableA i row6 do dbB.tableA

  1. Czy to w ogóle możliwe do konfiguracji dwukierunkowej replikacji, tak że Appa, AppB zobaczyć te same dane w dowolnym momencie.

  2. Jeśli klucz podstawowy jest automatycznym inkrementowaniem, czy możliwe byłoby zachowanie integralności danych lub czy istnieje możliwość kolizji na kluczu podstawowym.

+0

Podstawowe klawisze w różnych konfiguracjach brzmią jak wołanie o kłopoty. Podobnie jak wiele innych wymagań dotyczących spójności. Zdziwiłem się więc, czy można to zrobić w rozsądny sposób. Mogą jednak istnieć hackowe rozwiązania, obejmujące pomoc aplikacji i jej schematu bazy danych. Na przykład. można dołączyć identyfikator dla hosta generującego w kluczach podstawowych dla nowych wierszy. Możesz dodać kolumnę do zaznaczenia, które wiersze zostały przeniesione. I tak dalej. – MvG

+0

@Rpj Czy zaakceptujesz jedną z poniższych odpowiedzi? –

Odpowiedz

5

Tak, replikacja master-master jest dość dobrze obsługiwana w mysql, więc możesz robić to, co chcesz.

Będziesz chciał, aby dbA i dbB miały różne auto_increment_offsets, i aby ustawić auto_increment_increment na wartość większą niż domyślną 1. Zobacz

http://dev.mysql.com/doc/refman/5.0/en/replication-options-master.html

Podsumowując, nauczysz będziesz chciał dodać do waszych mój.CNF pliki coś takiego:

dbA:

[mysqld] 
server-id = 1 
auto_increment_increment = 10 
auto_increment_offset = 1 

DBB:

[mysqld] 
server-id = 2 
auto_increment_increment = 10 
auto_increment_offset = 2 

wtedy, gdy wkłady Serwer wartości użyje wartości jak 1, 11, 21, 31 do swojego pierwotnego wartości kluczy .. serwer B użyje 2, 12, 22, 32 itd., w ten sposób nigdy nie będzie konfliktu.

Oczywiście można użyć niższych wartości dla auto_increment_increment, na przykład 2, ale w zależności od tego, jak chcesz rozwijać swój klaster później, możesz dać sobie trochę miejsca.

+0

Nie sądzę, że pytanie dotyczy wielu deamons mysql. Czy można ustawić auto_increment_increment i auto_increment_offset na db/schema? –

+0

Och ... cóż, to byłoby dziwne ustawienie :) Jeśli tak jest, to żadne rozwiązanie nie zadziałałoby. – hexist

1

Ta odpowiedź zakłada, że ​​uruchomione są obie bazy danych/schematy na tym samym mysqld. Jeśli używasz różnych plików mysqlds, zobacz odpowiedź od heksadecymisty:

Oczywiście istnieje ryzyko kolizji: kto powiedział, że id 7 nie został utworzony w dbA i PRZED wykonaniem replikacji utworzono inny identyfikator 7 w dbB? Zwłaszcza przy użyciu automatycznego przyrostu

Można spróbować wielu rzeczy, między:

  • Jeśli ID jest podpisana int wartości max to 2147483647. W DBB spróbuj ustawić początkowy przyrost auto do 1073741824 (ustawić w połowie w połowie). W ten sposób wszystkie identyfikatory, które są tworzone w dbB, znajdują się w wyższej id strefie, a kolizja jest mniej prawdopodobna.
  • spróbować GUID zamiast identyfikatorów automatycznego przyrostu (How should I store GUID in MySQL tables?)

Jeśli oba DBA i DBB są na tym samym serwerze MySQL, można po prostu osiągnąć „replikacja” uruchamiając te zapytania zgodnie z harmonogramem lub z wyzwalacz (na wkładce)

Insert into dbA.tableA values (select b.* from dbB.tableA b left join dbA.tableA a on b.id = a.id where a.id is null) 
Insert into dbB.tableA values (select a.* from dbA.tableA a left join dbB.tableA b on a.id = b.id where b.id is null) 

edit: Niestety, nie można użyć automatycznego przyrostu. Automatyczna inkrementacja zawsze będzie oparta na najwyższym istniejącym już identyfikatorze. Więc nie możesz zmusić auto-inkrementacji na 1 komputerze, aby pozostać nisko po tym, jak uzyskał wyższy identyfikator.

+0

Ah, odpowiedź od Hexist daje mu miły akcent. Nie wiedziałem o @@ auto_increment_increment i @@ auto_increment_offset. Rzeczywiście, korzystając z nich, nadal można korzystać z automatycznie zwiększanego identyfikatora. Ale użycie tego rozwiązania prawdopodobnie wiąże się z uruchomieniem tabel na 2 różnych serwerach mysql. W takim przypadku utworzone przeze mnie "replikacje" nie będą działały, a będziesz musiał wykonać replikację mysql. –

1

Sugerowałbym nadanie sterowania przechowywaniem/odzyskiwaniem, powiedzmy, AppC, który miałby dostęp zarówno do dbA, jak i dbB. Również AppC utworzyłby klucz podstawowy.

0

Zakładając używasz obu baz danych na tej samej instancji mysqld dodam mój biedaka replikacji:

create view dbB.tableA as select * from dbA.tableA; 

co samo w sobie jest synonimy MySQL biedaka, ale działa bardzo dobrze praktyka, w tym operacje wstawiania, aktualizacji i usuwania.

Zasadniczo oznacza to zlikwidowanie jednej z dwóch kopii i zastąpienie jej synonimem drugiej. Niezależnie od tego, czy to pasuje do Twoich potrzeb, tylko Ty możesz to stwierdzić.

+0

To w żaden sposób nie odpowiada na pytanie OP. –

+0

Nie odpowiada na jego * pytanie *, ponieważ zostało postawione, zgadzam się, ale może odpowiedzieć na jego * potrzebę *, w zależności od dodatkowych warunków, które pominął w swoim pytaniu i ogólnej architektury jego konfiguracji. – Tobia

Powiązane problemy