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
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? –
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
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. –