2013-09-07 21 views
8

Najczęściej spotykanym pytaniem, które słyszę o Couchbase i innych bazach danych NoSQL, jest generowanie unikalnych kluczy dla rekordów - lub dokładniej - jak powielać funkcję AUTO INCREMENT w typowych relacjach Bazy danych.Używanie licznika przyrostowego do unikalnego generowania kluczy w klastrze Couchbase

Często wymienianym rozwiązaniem w Couchbase jest funkcja inkrementacji, w której można wywołać inkrementację na kluczu numerycznym i wygeneruje ona nowy unikalny numer w sekwencji.

Moje pytanie brzmi, że nie mogę sobie poradzić z ogromnym problemem, który przewiduję, jeśli chodzi o replikację.

Weź pod uwagę, że masz skupisko trzech węzłów Couchbase i przechowujesz dziennik żądań. Chcesz wpisać ten dziennik, aby utworzyć pozycję o nazwie "requestlog_counter".

Teraz mówimy, że mamy 4 węzły sieci, z których każdy otrzymuje 20 żądań na sekundę, a każde z nich musi zostać zarejestrowane jako "żądanie :: {ID})". To 80 próśb na sekundę.

Powiedzmy, że węzły 1 i 3 mają niewielki opóźnienie sieci, ale obie otrzymują jedno z tych 40 żądań dokładnie w tym samym czasie. Twój skrypt zwiększa licznik żądań (powiedzmy, dla przykładu, wynosi obecnie 1500) i otrzymuje identyfikator. Z pewnością możliwe jest, że obie instancje Couchbase mogą zwrócić 1501 do węzłów internetowych 1 i 3, a oba serwery będą teraz próbowały zapisać żądanie, z którym mają do czynienia, jako "request: 1501".

Teraz replikacja sobie z tym poradzi i zasadniczo wygrywa. Ale teraz straciłeś zapis jednego wniosku.

Czy to oznacza, że ​​w rzeczywistości potrzebujesz lepszego sposobu na pozyskiwanie ważnych danych i że używanie automatycznych przyrostów do wartości bezwzględnych i unikatowego generowania kluczy jest czymś, czego należy unikać w środowisku klastra NoSQL?

Czy jest coś, co możesz zrobić jako część kluczowej procedury generowania, która sprawia, że ​​jest w 100% niezawodny.

Należy również wziąć pod uwagę środowisko wielu klastrów, korzystając z replikacji między centrami danych.

Dzięki.

Mike

Odpowiedz

7

Przede wszystkim według couchbase documentation funkcje increment i decremant są "atomowy" w ramach klastra. Więc jeśli użyjesz ich do wygenerowania "autoinkrecji", wszystko powinno działać poprawnie.

Ale jeśli chcesz to uchwycić, gdy zapiszesz nowy element w bazie na kanapie, nie zastąpisz istniejącego (sytuacja taka jak "OBIEKAWANIE instancji Couchbase może zwrócić 1501") możesz użyć operacji przechowywania z StoreMode.Add. Jeśli więc zadzwonisz pod numer couchbase.store(StoreMode.Add, "request:1501",value), jedno żądanie zakończy się sukcesem, inne zakończą się niepowodzeniem i możesz złapać to "niepowodzenie" i spróbować powtórzyć tę operację sklepu ponownie (z otrzymaniem nowego autoinkrementacji id dla nowego klucza)

+1

OK rozważyć przykład replikacji centrum danych. Powiedzmy, że połączenie pomiędzy DC1 i DC2 zanika na 5 sekund iw tym czasie DC1 i DC2 otrzymują i przetwarzają 200 żądań. Co dzieje się z naszym automatycznym inc inc teraz, gdy automatyczne przyrosty wzrosły do ​​1700 i oba DC mają zapisy przechowywane przy użyciu tych identyfikatorów "co się wtedy stanie? Komenda sklepu nie zawiedzie w tej sytuacji, a więc, atomowa czy nie, operacja doprowadzi do czegoś raczej okropnego dzieje się z konsekwencją danych? –

+2

Tak jak powiedziałem, przyrost jest atomowy w jednym skupisku.Jeśli zamierzasz korzystać z XDCR, musisz dodać coś w rodzaju identyfikatora klastra do "autoinkrementacji". To znaczy. 'request: : ' lub 'request: : '. W tym przypadku, nawet jeśli otrzymasz dwa identyczne autoinrementowane identyfikatory, klucz będzie unikalny, ponieważ będzie miał unikalny 'cluster_id'. Ale, tak jak dla mnie, jeśli potrzebuję XDCR, po prostu użyję identyfikatorów GUID i dodaję coś takiego jak znacznik czasu, aby sortować wartości i nie dbać o operacje atomowe. – m03geek

+0

OK, czyści to. Założę się, że tak może być, gdy zadaję pytanie i jestem pewien, że w przyszłości inni zadadzą te same pytania, przechodząc z RDB do NoSQL. Lub, co jest bardziej prawdopodobne, że ktoś nie będzie tego rozważał i wszystko rozpadnie się po wprowadzeniu XDCR - mam nadzieję, że to wytłumaczy im, co poszło nie tak i zapewni im sposób rozwiązania problemu. Dzięki za potwierdzenia i porady m03geek. –

Powiązane problemy