Udostępnij za pośrednictwem


Zintegrowana pamięć podręczna usługi Azure Cosmos DB — omówienie

DOTYCZY: NoSQL

Zintegrowana pamięć podręczna usługi Azure Cosmos DB to pamięć podręczna w pamięci, która ułatwia zarządzanie kosztami i małymi opóźnieniami w miarę wzrostu ilości żądań. Zintegrowana pamięć podręczna jest łatwa do skonfigurowania i nie trzeba poświęcać czasu na pisanie niestandardowego kodu na potrzeby unieważnienia pamięci podręcznej ani zarządzania infrastrukturą zaplecza. Zintegrowana pamięć podręczna używa dedykowanej bramy na koncie usługi Azure Cosmos DB. Podczas aprowizowania dedykowanej bramy można wybrać liczbę węzłów i rozmiar węzła na podstawie liczby rdzeni i pamięci wymaganej dla obciążenia. Każdy dedykowany węzeł bramy ma oddzielną zintegrowaną pamięć podręczną od innych.

Zintegrowana pamięć podręczna jest automatycznie konfigurowana w ramach dedykowanej bramy. Zintegrowana pamięć podręczna ma dwie części:

  • Pamięć podręczna elementów dla odczytów punktów
  • Pamięć podręczna zapytań dla zapytań

Zintegrowana pamięć podręczna to pamięć podręczna odczytu i zapisu z zasadami eksmisji co najmniej ostatnio używanymi (LRU). Pamięć podręczna elementów i pamięć podręczna zapytań współdzielą tę samą pojemność w zintegrowanej pamięci podręcznej, a zasady eksmisji LRU mają zastosowanie do obu tych elementów. Dane są eksmitowane z pamięci podręcznej ściśle na podstawie tego, kiedy był on ostatnio używany, niezależnie od tego, czy jest to odczyt punktu, czy zapytanie. Dane buforowane w każdym węźle zależą od danych, które zostały ostatnio zapisane lub odczytane przez ten konkretny węzeł. Jeśli element lub zapytanie jest buforowane w jednym węźle, niekoniecznie jest on buforowany w innych.

Uwaga

Czy masz jakieś opinie na temat zintegrowanej pamięci podręcznej? Chcemy to usłyszeć! Możesz podzielić się opiniami bezpośrednio z zespołem inżynierów usługi Azure Cosmos DB: cosmoscachefeedback@microsoft.com

Obciążenia, które korzystają ze zintegrowanej pamięci podręcznej

Głównym celem zintegrowanej pamięci podręcznej jest zmniejszenie kosztów obciążeń wymagających odczytu. Małe opóźnienie, choć przydatne, nie jest główną zaletą zintegrowanej pamięci podręcznej, ponieważ usługa Azure Cosmos DB jest już szybka bez buforowania.

Odczyty punktów i zapytania, które trafią w zintegrowaną pamięć podręczną, mają opłatę za jednostki RU 0. Trafienia pamięci podręcznej mają znacznie niższy koszt operacji niż operacje odczytu z bazy danych zaplecza.

Obciążenia, które pasują do następujących cech, powinny ocenić, czy zintegrowana pamięć podręczna pomaga obniżyć koszty:

  • Obciążenia z dużym obciążeniem odczytu
  • Wiele powtórzeń odczytów punktów na dużych elementach
  • Wiele powtarzających się zapytań o dużą liczbę jednostek RU
  • Klucz partycji gorącej dla operacji odczytu

Największym czynnikiem oczekiwanych oszczędności jest stopień, w jakim odczyty powtarzają się. Jeśli obciążenie stale wykonuje ten sam punkt odczytu lub zapytań w krótkim czasie, jest to doskonały kandydat do zintegrowanej pamięci podręcznej. W przypadku używania zintegrowanej pamięci podręcznej do powtarzanych operacji odczytu należy używać tylko jednostek RU dla pierwszego odczytu. Kolejne operacje odczytu kierowane przez ten sam dedykowany węzeł bramy (w MaxIntegratedCacheStaleness oknie i jeśli dane nie zostały eksmitowane) nie używają przepływności.

Niektóre obciążenia nie powinny uwzględniać zintegrowanej pamięci podręcznej, w tym:

  • Obciążenia z dużym obciążeniem zapisu
  • Rzadko powtarzane operacje odczytu lub zapytań punktów
  • Obciążenia odczytujące zestawienie zmian

Pamięć podręczna elementów

Pamięć podręczna elementów jest używana dla odczytów punktów (wyszukiwanie klucza/wartości w oparciu o identyfikator elementu i klucz partycji).

Wypełnianie pamięci podręcznej elementów

  • Nowe zapisy, aktualizacje i usunięcia są automatycznie wypełniane w pamięci podręcznej elementów węzła, przez który żądanie jest kierowane
  • Elementy z żądań odczytu punktu, w których element nie znajduje się jeszcze w pamięci podręcznej (chybienie pamięci podręcznej) węzła, przez który żądanie jest kierowane, są dodawane do pamięci podręcznej elementów
  • Odczytywanie żądań dla wielu elementów, takich jak ReadMany, wypełnianie pamięci podręcznej zapytań jako zestawu zamiast pamięci podręcznej elementów jako pojedynczych elementów
  • Żądania, które są częścią transakcyjnej partii lub w trybie zbiorczym, nie wypełniają pamięci podręcznej elementów

Unieważnienie i eksmisji pamięci podręcznej elementów

Ponieważ każdy węzeł ma niezależną pamięć podręczną, możliwe jest unieważnienie lub eksmitowanie elementów w pamięci podręcznej jednego węzła, a nie innych. Elementy w pamięci podręcznej danego węzła są unieważniane i eksmitowane na podstawie poniższych kryteriów:

  • Aktualizowanie lub usuwanie elementów
  • Najmniej ostatnio używane (LRU)
  • Czas przechowywania pamięci podręcznej (innymi słowy : MaxIntegratedCacheStaleness)

Pamięć podręczna zapytań

Pamięć podręczna zapytań służy do buforowania zapytań. Pamięć podręczna zapytań przekształca zapytanie w wyszukiwanie klucz/wartość, gdzie klucz jest tekstem zapytania, a wartość jest wynikiem zapytania. Zintegrowana pamięć podręczna nie ma aparatu zapytań, przechowuje tylko wyszukiwanie klucza/wartości dla każdego zapytania. Wyniki zapytania są przechowywane jako zestaw, a pamięć podręczna nie śledzi poszczególnych elementów. Dany element może być przechowywany w pamięci podręcznej zapytań wiele razy, jeśli pojawia się w zestawie wyników wielu zapytań. Aktualizacje elementów bazowych nie są odzwierciedlane w wynikach zapytania, chyba że osiągnięto maksymalną nieaktualność zintegrowanej pamięci podręcznej dla zapytania, a zapytanie jest obsługiwane z bazy danych zaplecza.

Wypełnianie pamięci podręcznej zapytań

  • Jeśli pamięć podręczna nie ma wyniku dla tego zapytania (miss pamięci podręcznej) w węźle, przez który został przekierowany, zapytanie jest wysyłane do zaplecza. Po uruchomieniu zapytania pamięć podręczna będzie przechowywać wyniki dla tego zapytania
  • Zapytania o tym samym kształcie, ale różne parametry lub opcje żądania wpływające na wyniki (ex. max liczba elementów) są przechowywane jako ich własna para klucz/wartość
  • Odczytaj żądania dla wielu elementów, takich jak ReadMany, wypełnij pamięć podręczną zapytań. Wyniki ReadMany są przechowywane jako zestaw, a żądania z różnymi danymi wejściowymi będą przechowywane jako ich własna para klucz/wartość

Eksmisja pamięci podręcznej zapytań

Eksmisja pamięci podręcznej zapytań jest oparta na węźle, przez który żądanie zostało kierowane. Możliwe, że zapytania mogą być eksmitowane lub odświeżane w jednym węźle, a nie w innych.

  • Najmniej ostatnio używane (LRU)
  • Czas przechowywania pamięci podręcznej (innymi słowy : MaxIntegratedCacheStaleness)

Praca z pamięcią podręczną zapytań

Nie potrzebujesz specjalnego kodu podczas pracy z pamięcią podręczną zapytań, nawet jeśli zapytania mają wiele stron wyników. Najlepsze rozwiązania i kod stronicowania zapytań są takie same, czy zapytanie trafia do zintegrowanej pamięci podręcznej, czy jest wykonywane w akompaniacie zapytań zaplecza.

Pamięć podręczna zapytań automatycznie buforuje tokeny kontynuacji zapytań, jeśli ma to zastosowanie. Jeśli masz zapytanie z wieloma stronami wyników, wszystkie strony przechowywane w zintegrowanej pamięci podręcznej mają opłatę za jednostkę RU na 0. Jeśli kolejne strony wyników zapytania wymagają wykonania zaplecza, będą miały token kontynuacji z poprzedniej strony, aby uniknąć duplikowania poprzedniej pracy.

Ważne

Wystąpienia zintegrowanej pamięci podręcznej w różnych dedykowanych węzłach bramy mają niezależne pamięci podręczne od siebie. Jeśli dane są buforowane w jednym węźle, niekoniecznie są buforowane w innych. Wiele stron tego samego zapytania nie ma gwarancji, że zostanie przekierowanych do tego samego dedykowanego węzła bramy.

Spójność zintegrowanej pamięci podręcznej

Zintegrowana pamięć podręczna obsługuje żądania odczytu tylko z sesją i spójnością ostateczną. Jeśli odczyt ma spójny prefiks, powiązaną nieaktualność lub silną spójność, pomija zintegrowaną pamięć podręczną i jest obsługiwany z zaplecza.

Najprostszym sposobem skonfigurowania sesji lub spójności ostatecznej dla wszystkich operacji odczytu jest ustawienie go na poziomie konta. Jeśli jednak chcesz, aby niektóre operacje odczytu miały konkretną spójność, możesz również skonfigurować spójność na poziomie żądania.

Uwaga

Żądania zapisu z innymi składami nadal wypełniają pamięć podręczną, ale w celu odczytu z pamięci podręcznej żądanie musi mieć sesję lub spójność ostateczną.

Spójność sesji

Spójność sesji jest najczęściej używanym poziomem spójności zarówno dla kont pojedynczego regionu, jak i globalnie rozproszonych kont usługi Azure Cosmos DB. Dzięki spójności sesji pojedyncze sesje klienta mogą odczytywać własne zapisy. Wszelkie operacje odczytu ze spójnością sesji, które nie mają pasującego tokenu sesji, będą naliczać opłaty za jednostki RU. Obejmuje to pierwsze żądanie dla danego elementu lub zapytania po uruchomieniu lub ponownym uruchomieniu aplikacji klienckiej, chyba że jawnie przekażesz prawidłowy token sesji. Klienci spoza sesji wykonującej zapisy będą widzieć spójność ostateczną podczas korzystania ze zintegrowanej pamięci podręcznej.

MaxIntegratedCacheStaleness

Jest MaxIntegratedCacheStaleness to maksymalna akceptowalna nieaktualność dla buforowanych odczytów i zapytań punktów, niezależnie od wybranej spójności. Element MaxIntegratedCacheStaleness jest konfigurowalny na poziomie żądania. Jeśli na przykład ustawisz MaxIntegratedCacheStaleness 2 godziny, żądanie zwróci dane buforowane tylko wtedy, gdy dane mają mniej niż 2 godziny. Aby zwiększyć prawdopodobieństwo wielokrotnego odczytu przy użyciu zintegrowanej pamięci podręcznej, należy ustawić MaxIntegratedCacheStaleness wartość tak wysoką, jak zezwalają na wymagania biznesowe.

Element MaxIntegratedCacheStaleness, skonfigurowany w żądaniu, który kończy się wypełnianiem pamięci podręcznej, nie ma wpływu na czas buforowania tego żądania. MaxIntegratedCacheStaleness wymusza spójność podczas próby odczytu danych w pamięci podręcznej. Nie ma globalnego ustawienia czasu wygaśnięcia lub przechowywania pamięci podręcznej, więc dane są eksmitowane tylko z pamięci podręcznej, jeśli zintegrowana pamięć podręczna jest pełna lub jest uruchamiany nowy odczyt o niższym MaxIntegratedCacheStaleness wieku niż bieżący wpis w pamięci podręcznej.

Jest to poprawa sposobu działania większości pamięci podręcznych i umożliwia wykonanie następujących innych dostosowań:

  • Dla każdego punktu odczytu lub zapytania można ustawić różne wymagania dotyczące nieaktualności
  • Różni klienci, nawet jeśli uruchamiają ten sam punkt odczytu lub zapytania, mogą skonfigurować różne MaxIntegratedCacheStaleness wartości
  • Jeśli chcesz zmodyfikować spójność odczytu dla buforowanych danych, zmiana MaxIntegratedCacheStaleness ma natychmiastowy wpływ na spójność odczytu

Uwaga

Wartość minimalna MaxIntegratedCacheStaleness to 0, a wartość maksymalna to 10 lat. Jeśli nie skonfigurowano jawnie, wartości domyślne to MaxIntegratedCacheStaleness 5 minut.

Aby lepiej zrozumieć MaxIntegratedCacheStaleness parametr, rozważmy następujący przykład:

Czas Zażądaj Response
t = 0 s Uruchamianie zapytania A z parametrem MaxIntegratedCacheStaleness = 30 sekund Zwracanie wyników z bazy danych zaplecza (normalne opłaty za jednostki RU) i wypełnianie pamięci podręcznej
t = 0 s Uruchamianie zapytania B z wartością MaxIntegratedCacheStaleness = 60 sekund Zwracanie wyników z bazy danych zaplecza (normalne opłaty za jednostki RU) i wypełnianie pamięci podręcznej
t = 20 s Uruchamianie zapytania A z parametrem MaxIntegratedCacheStaleness = 30 sekund Zwracanie wyników ze zintegrowanej pamięci podręcznej (opłata za 0 RU)
t = 20 s Uruchamianie zapytania B z wartością MaxIntegratedCacheStaleness = 60 sekund Zwracanie wyników ze zintegrowanej pamięci podręcznej (opłata za 0 RU)
t = 40 s Uruchamianie zapytania A z parametrem MaxIntegratedCacheStaleness = 30 sekund Zwracanie wyników z bazy danych zaplecza (normalne opłaty za jednostki RU) i odświeżanie pamięci podręcznej
t = 40 s Uruchamianie zapytania B z wartością MaxIntegratedCacheStaleness = 60 sekund Zwracanie wyników ze zintegrowanej pamięci podręcznej (opłata za 0 RU)
t = 50 s Uruchamianie zapytania B z wartością MaxIntegratedCacheStaleness = 20 sekund Zwracanie wyników z bazy danych zaplecza (normalne opłaty za jednostki RU) i odświeżanie pamięci podręcznej

Dowiedz się, jak skonfigurować element MaxIntegratedCacheStaleness.

Obejście zintegrowanej pamięci podręcznej

Zintegrowana pamięć podręczna ma ograniczoną pojemność magazynu określoną przez aprowizowaną jednostkę SKU dedykowanej bramy. Domyślnie wszystkie żądania klientów skonfigurowane za pomocą dedykowanej bramy parametry połączenia przechodzą przez zintegrowaną pamięć podręczną i zajmują miejsce w pamięci podręcznej. Możesz kontrolować, które elementy i zapytania są buforowane za pomocą opcji pomijania zintegrowanej pamięci podręcznej. Ta opcja żądania jest przydatna w przypadku żądań zapisu lub odczytu elementów, które nie powinny być często powtarzane. Pomijając zintegrowaną pamięć podręczną dla elementów z rzadkim dostępem, oszczędza miejsce w pamięci podręcznej dla elementów z większą większa liczba powtórzeń, zwiększając potencjał oszczędzania jednostek RU i zmniejszając liczbę eksmisji. Żądania pomijające pamięć podręczną są nadal kierowane przez dedykowaną bramę. Te żądania są obsługiwane z zaplecza i jednostek RU kosztów.

Dowiedz się, jak pominąć zintegrowaną pamięć podręczną.

Metryki

Warto monitorować niektóre kluczowe metryki i IntegratedCache kluczowe DedicatedGateway metryki dla zintegrowanej pamięci podręcznej. Aby dowiedzieć się więcej o tych metrykach, zobacz Obsługiwane metryki dla bazy danych Microsoft.DocumentDB/DatabaseAccounts.

Wszystkie istniejące metryki są domyślnie dostępne w obszarze Metryki w witrynie Azure Portal (a nie metryki klasyczne):

Zrzut ekranu witryny Azure Portal przedstawiający lokalizację metryki zintegrowanej pamięci podręcznej.

Metryki są średnią, maksymalną lub sumą we wszystkich dedykowanych węzłach bramy. Jeśli na przykład aprowizujesz dedykowany klaster bramy z pięcioma węzłami, metryki odzwierciedlają zagregowaną wartość we wszystkich pięciu węzłach. Nie można określić wartości metryk dla każdego węzła.

Rozwiązywanie typowych problemów

W poniższych przykładach pokazano, jak debugować niektóre typowe scenariusze:

Nie mogę sprawdzić, czy moja aplikacja korzysta z dedykowanej bramy

Sprawdź element DedicatedGatewayRequests. Ta metryka zawiera wszystkie żądania korzystające z dedykowanej bramy, niezależnie od tego, czy trafią do zintegrowanej pamięci podręcznej. Jeśli aplikacja używa standardowej bramy lub trybu bezpośredniego z oryginalnym parametry połączenia, nie zobaczysz komunikatu o błędzie, ale będzie to DedicatedGatewayRequests zero. Jeśli aplikacja używa trybu bezpośredniego z dedykowaną bramą parametry połączenia, nadal może zostać wyświetlonych kilka DedicatedGatewayRequests.

Nie mogę stwierdzić, czy żądania trafiają do zintegrowanej pamięci podręcznej

Sprawdź i IntegratedCacheItemHitRate IntegratedCacheQueryHitRate. Jeśli obie te wartości są zerowe, żądania nie trafiają do zintegrowanej pamięci podręcznej. Sprawdź, czy używasz dedykowanej bramy parametry połączenia, nawiązywania połączenia z trybem bramy i używasz spójności sesji lub ostatecznej.

Chcę zrozumieć, czy moja dedykowana brama jest zbyt mała

Sprawdź i IntegratedCacheItemHitRate IntegratedCacheQueryHitRate. Wysokie wartości (na przykład powyżej 0.7-0.8) są dobrym znakiem, że dedykowana brama jest wystarczająco duża.

Jeśli wartość IntegratedCacheItemHitRate lub IntegratedCacheQueryHitRatejest niska, spójrz na .IntegratedCacheEvictedEntriesSize Jeśli wartość IntegratedCacheEvictedEntriesSize jest wysoka, może to oznaczać, że większy rozmiar dedykowanej bramy byłby korzystny. Możesz eksperymentować, zwiększając rozmiar dedykowanej bramy i porównując nowe IntegratedCacheItemHitRate i IntegratedCacheQueryHitRate. Jeśli większa dedykowana brama nie poprawi wartości IntegratedCacheItemHitRate lub IntegratedCacheQueryHitRate, możliwe, że odczyty po prostu nie powtarzają się wystarczająco dużo, aby zintegrowana pamięć podręczna była wpływowa.

Chcę zrozumieć, czy moja dedykowana brama jest zbyt duża

Trudniej jest zmierzyć, czy dedykowana brama jest zbyt duża, niż ma zmierzyć, czy dedykowana brama jest zbyt mała. Ogólnie rzecz biorąc, należy zacząć od małych i powoli zwiększać rozmiar dedykowanej bramy do momentu, aż IntegratedCacheItemHitRate i IntegratedCacheQueryHitRate przestanie się poprawiać. W niektórych przypadkach tylko jedna z dwóch metryk trafień pamięci podręcznej będzie ważna, a nie obie. Jeśli na przykład obciążenie dotyczy głównie zapytań, a nie odczytów punktów, IntegratedCacheQueryHitRate wartość jest znacznie ważniejsza IntegratedCacheItemHitRateniż .

Jeśli większość danych jest eksmitowana z pamięci podręcznej z powodu przekroczenia MaxIntegratedCacheStalenesswartości , a nie LRU, pamięć podręczna może być większa niż wymagana. Jeśli IntegratedCacheItemExpirationCount i IntegratedCacheQueryExpirationCount połączone są prawie tak duże, jak IntegratedCacheEvictedEntriesSize, możesz eksperymentować z mniejszym rozmiarem dedykowanej bramy i porównać wydajność.

Chcę zrozumieć, czy muszę dodać więcej dedykowanych węzłów bramy

W niektórych przypadkach, jeśli opóźnienie jest nieoczekiwanie wysokie, może być konieczne użycie większej liczby dedykowanych węzłów bramy, a nie większych węzłów. Sprawdź i DedicatedGatewayCPUUsage DedicatedGatewayMemoryUsage , czy dodanie większej liczby dedykowanych węzłów bramy zmniejszy opóźnienie. Warto pamiętać, że ponieważ wszystkie wystąpienia zintegrowanej pamięci podręcznej są niezależne od siebie, dodanie większej liczby dedykowanych węzłów bramy nie spowoduje zmniejszenia liczby IntegratedCacheEvictedEntriesSizewystąpień . Dodanie większej liczby węzłów poprawi wolumin żądania, który może obsłużyć dedykowany klaster bramy.

Następne kroki