2013-04-04 12 views
6

Mam pewne oprogramowanie, które zbiera dane przez długi czas, około 200 odczytów na sekundę. Do tego wykorzystuje bazę danych SQL. Szukam korzystania z platformy Azure, aby przenieść wiele moich starych "zarchiwizowanych" danych do.Projektowanie partycji do przechowywania tabel Azure

Oprogramowanie wykorzystuje architekturę typu wielu dzierżawców, dlatego planuję użyć jednej tabeli Azure dla każdego najemcy. Każdy lokator może monitorować 10-20 różnych wskaźników, więc planuję użyć Metric ID (int) jako klucza partycji.

Ponieważ każda metryka ma tylko jedno czytanie na minutę (maks.), Planuję użyć DateTime.Ticks.ToString ("d19") jako mojego RowKey.

Brakuje mi odrobiny zrozumienia, jak to będzie jednak skalować; więc miałem nadzieję, że ktoś może to wyjaśnić:

Dla wydajności Azure może/może podzielić mój stół na partycje, aby wszystko było przyjemne i szybkie. W takim przypadku uzyskamy jedną partycję na metr.

Jednak mój wiersz może potencjalnie reprezentować dane przez około 5 lat, więc szacuję ok. 2,5 miliona wierszy.

Czy Azure jest na tyle sprytny, aby podzielić go na podstawie rowkey, czy też projektowałem w przyszłym wąskim gardle? Zwykle nie zoptymalizowałem przedwcześnie, ale z czymś takim jak Azure, które nie wydaje się tak rozsądne jak zwykle!

Poszukuję eksperta Azure, aby poinformować mnie, czy jestem na właściwej linii, czy też powinienem podzielić moje dane na więcej tabel.

Odpowiedz

16

Kilka komentarzy:

Oprócz przechowywania danych, można również zajrzeć do w jaki sposób chcesz pobrać dane, jak może zmienić swój projekt w znacznym stopniu. Niektóre z pytań, które możesz zadać sobie samemu:

  • Czy podczas pobierania danych zawsze będę pobierać dane dla poszczególnych danych i dla zakresu dat/godzin?
  • Czy muszę pobrać dane dla wszystkich danych dla określonego zakresu dat/czasu? Jeśli tak jest, to patrzysz na pełne skanowanie tabeli. Oczywiście można tego uniknąć, wykonując wiele zapytań (jedno zapytanie/PartitionKey).
  • Czy muszę najpierw zobaczyć najnowsze wyniki lub naprawdę mnie to nie obchodzi. Jeśli jest poprzednia, strategia RowKey powinna być podobna do (DateTime.MaxValue.Ticks - DateTime.UtcNow.Ticks).ToString("d19").

także od PartitionKey jest ciąg znaków, może chcesz przekonwertować int wartości na string z jakimś „0” prepadding tak, że wszystkie identyfikatory są wyświetlane w kolejności inaczej dostaniesz 1, 10, 11, .., 19, 2, ... itd.

Zgodnie z moją wiedzą system Windows Azure dzieli dane tylko na podstawie PartitionKey, a nie na RowKey. W obrębie partycji, RowKey służy jako klucz unikalny. Windows Azure spróbuje zachować dane z tym samym PartitionKey w tym samym węźle, ale ponieważ każdy węzeł jest urządzeniem fizycznym (a zatem ma ograniczenie rozmiaru), dane mogą również przepływać do innego węzła.

Możesz chcieć przeczytać ten post na blogu z zespołu Windows Azure Storage: http://blogs.msdn.com/b/windowsazurestorage/archive/2010/11/06/how-to-get-most-out-of-windows-azure-tables.aspx.

UPDATE Na podstawie poniższych komentarzy i niektórych informacji z góry, spróbujmy trochę matematyki. Jest to oparte na najnowszych opublikowanych tutaj celach skalowalności: http://blogs.msdn.com/b/windowsazurestorage/archive/2012/11/04/windows-azure-s-flat-network-storage-and-2012-scalability-targets.aspx. Dokumentacja stwierdza:

jednej tabeli Partition- partycji tabeli są wszystkie podmioty w tabeli z taką samą wartością klucza podziału, i zwykle mają wiele tabele partycji. Docelowa przepustowość dla jednej partycji tabeli jest:

  • do 2000 podmiotów na sekundę
  • Uwaga, to jest na jednej partycji, a nie jeden stół. W związku z tym tabela z dobrym partycjonowaniem może przetworzyć do 20 000 podmiotów na sekundę, czyli ogólny cel konta opisany powyżej.

Teraz wspomniałeś, że masz 10 - 20 różnych punktów metrycznych i dla każdego punktu metrycznym będziesz pisać maksymalnie 1 minutę zapis oznacza, że ​​można byłoby napisać maksymalnie 20 jednostek/minuta/tabela, która jest znacznie poniżej celu skalowalności 2000 podmiotów na sekundę.

Teraz pozostaje pytanie do czytania. Zakładając, że użytkownik odczytałby dane o maksymalnej wartości 24 godzin (tj. 24 * 60 = 1440 punktów) na partycję. Teraz, zakładając, że użytkownik otrzymuje dane dla wszystkich 20 pomiarów przez 1 dzień, każdy użytkownik (a więc każda tabela) pobierze maksymalnie 28 800 punktów danych. Pytanie, które ci pozostaje, wydaje mi się, ile takich wniosków można uzyskać na sekundę, aby osiągnąć ten próg. Gdybyś mógł w jakiś sposób ekstrapolować te informacje, myślę, że możesz dojść do wniosku na temat skalowalności twojej architektury.

Polecam również oglądanie tego wideo: http://channel9.msdn.com/Events/Build/2012/4-004.

Mam nadzieję, że to pomoże.

+0

Dziękuję za uwagi. Prawdopodobnym przypadkiem użycia jest żądanie podania zakresu danych tylko dla poszczególnych danych. Zakres ten będzie mały (być może okno 24-godzinne). Jeśli wymaganych jest wiele danych, można to zrobić za pomocą wielu zapytań. – KingCronus

+0

Dodatkowo w tym przypadku wypełnianie formularzy nie jest potrzebne, ponieważ dane nie muszą być w określonej kolejności, ale dziękuję za heads-up. – KingCronus

+0

Zaktualizowałem moją odpowiedź powyżej. Mam nadzieję że to pomoże. –

Powiązane problemy