Saturday, 11 November 2017

Ruch średnia grafit


Próbuję renderować graphite wykres, który ma movingAverage z sumy hit of kilka różnych metrics Ten cel. I oczekiwać, że movingAverage z tego target. would również dobrze, too. However mam straszne obrazu nie zamiast tego wyprowadzanie formatu JSON nie dostarcza użytecznych informacji w tym przypadku, niestety, zwracając prosto. Jak mogę obliczyć średnią ruchu powyższej sumy w Graphite Próbowałem dalej bez szczęścia, jak dobrze. Dziękuję za pomoc. Grafana nie robi same obliczenia, po prostu pyta o backend i rysuje ładne wykresy Tak więc agregowanie umiejętności zależy wyłącznie od twojego zaplecza Choć Graphite obsługuje funkcje okienkowania, takie jak średnia ruchoma, obecnie InfluxDB nie obsługuje jej. Istnieje wiele żądań, aby średnia ruchoma w influxdb była web Możesz zostawić 1 i śledzić postępy w tym bilecie. Możliwe, ale nie takie proste obejście polega na stworzeniu niestandardowego skryptu cron, demona, niezależnie od tego, która będzie prekursorować MA i zapisać ją jako eparate influxdb series. Grafana obsługuje dodawanie movingAverage Mam też trudności ze znalezieniem tego w dokumentach, ale można nieco cieszyć się jego użyciem na intro page. As jest to normalne, kliknij na tytuł wykresu, edytować, dodać metryki movingAverage zgodnie z opisem w dokumentacji grafitowej. Wykresy średniej ruchomej metryki lub metryki w określonej liczbie ostatnich punktów lub przedziału czasu. Pobiera jedną metrykę lub serię znaków wieloznacznych, a następnie liczbę N datapoints lub podany ciąg znaków długość czasu, jak 1 godzina lub 5 minut Zobacz od do momentu wyświetlenia w renderapi przykładów formatów czasu Wykresy średniej z poprzednich punktów danych dla każdego punktu na wykresie Wszystkie wcześniejsze punkty danych są ustawione na Brak na początku wykresu. Grafit 1 wykonuje dwa proste zadania przechowywania numerów, które zmieniają się wraz z upływem czasu i generują je na wykresie W tych samych zadaniach było wiele programów pisanych, co sprawia, że ​​grafit jest unikalny, zapewnia to funkcjonalność jako usługa sieciowa, która jest zarówno łatwa w obsłudze, jak i wysoce skalowalna. Protokół dostarczania danych do Graphite jest na tyle prosty, że można nauczyć się robić to ręcznie w ciągu kilku minut, a nie, że naprawdę chcesz, ale jest to przyzwoity test lakmusowy dla uproszczenia Grafiki renderowania i pobierania punktów danych są tak łatwe, jak pobieranie adresu URL Dzięki temu bardzo naturalne jest integrowanie grafitu z innym oprogramowaniem i umożliwia użytkownikom tworzenie silnych aplikacji na górze grafitu Jednym z najpopularniejszych zastosowań Graphite jest budowanie sieci WWW tablice rozdzielcze do monitorowania i analizy Firma Graphite urodziła się w dużej e-commerce, a jego projekt odzwierciedla tę skalowalność i dostęp do danych w czasie rzeczywistym są kluczowe cele. format pamięci masowej, mechanizm buforowania dla optymalizacji operacji przetwarzania danych oraz prosta, ale skuteczna metoda grupowania serwerów grafitowych Zamiast po prostu opisywać działanie programu Graphite Dziś wyjaśnię, jak Grafit był początkowo realizowany dosyć naiwnie, jakie problemy napotkałem, i jak rozwinąłem ich rozwiązania.7 1 Biblioteka baz danych zapisująca dane z serii czasowej. Graphite jest napisany w całości w Pythonie i składa się z trzech głównych elementów bibliotekę bazy danych o nazwie szeptem demona typu back-end o nazwie węglowej i interfejsu internetowego, który renderuje wykresy i zapewnia podstawowy interfejs użytkownika Mimo szeptu został napisany specjalnie dla grafitu, może on również być używany niezależnie Jest bardzo podobny do projektu, robin-database używana przez RRDtool i zapisuje jedynie numeryczne dane szeregowe Zwykle myślimy o bazach danych jako procesach serwerowych, które aplikacje klienckie rozmawiają przez gniazda Jednak szeptem jak RRDtool jest biblioteka baz danych używana przez aplikacje do manipulowania i pobierania zapisanych danych w specjalnie sformatowanych plikach Najbardziej podstawową operacją szeptu tworzy się nowy plik szeptu, aktualizacja, aby zapisać nowe punkty danych do pliku i pobrać, aby pobrać punkty danych. e 7 1 Podstawowa anatomia szeptu pliku. Jak pokazano na rysunku 7 1 szeptane pliki składają się z sekcji nagłówkowej zawierającej różne metadane, a następnie jednego lub więcej sekcji archiwalnych Każdy archiwum jest sekwencją kolejnych punktów danych, które są znacznikami czasu, pary wartości Kiedy wykonywana jest operacja uaktualniania lub pobierania, szept ustala przesunięcie w pliku, w którym dane powinny być zapisywane lub odczytywane, w oparciu o znacznik czasu i konfigurację archiwum.7 2 Back End Proste usługi magazynowania. Graphite's back end proces demona zwany buforem węglowym zwykle określany jako węgiel Jest zbudowany na Twisted, bardzo skalowalny interfejs IO dla Python Twisted pozwala na efektywne rozmowy z wieloma klientami i obsługiwać dużą ilość ruchu z niskim narzutem Rysunek 7 2 pokazuje przepływ danych między szeptem węgla a aplikacjami Clientapp Webapp zbierają dane i wysyłają je na tylny koniec grafitu, który przechowuje dane za pomocą szeptu Dane te mogą być dla nas ed Graphite Webapp do generowania wykresów. Rysunek 7 2 Przepływ danych Główną funkcją węgla jest zapisywanie punktów danych dla danych dostarczonych przez klientów W terminologii grafitowej metryczna jest dowolną wymierną ilością, która może zmieniać się wraz z upływem czasu, jak wykorzystanie procesora serwer lub liczba sprzedaży produktu Punkt danych jest po prostu znacznikiem czasowym, parą wartości odpowiadającą zmierzonej wartości określonego metryki w danym momencie Metryki są jednoznacznie identyfikowane przez ich nazwę, a także nazwę każdego metryki ponieważ punkty danych dostarczane są przez aplikacje klienckie Typowy typ aplikacji klienckiej jest agentem monitorującym gromadzącym dane o systemie lub aplikacji i wysyła zebrane wartości do węzła dla łatwiejszego przechowywania i wizualizacji Metryki w grafitach mają proste hierarchiczne nazwy, podobnie jak ścieżki systemu plików z wyjątkiem tego, że kropka jest używana do wyznaczania hierarchii, a nie kreski ukośnikowej lub backslashu węgla będzie szanować dowolną nazwę prawną i utworzy plik szeptu dla każdego metryka do st rudy swoich punktów danych Pliki szeptane są przechowywane w katalogu danych węglowych w hierarchii systemów plików, które odzwierciedlają hierarchię z podziałem na punkty w każdej metrycznej nazwie, tak że na przykład mapy. Kiedy aplikacja kliencka chce przesłać punkty danych do programu Graphite musi nawiązać połączenie z protokołem TCP na węglu zazwyczaj na porcie 2003 2 Klient robi, że cały węgiel mówiony nie wysyła niczego przez połączenie Klient wysyła punkty danych w prostym formacie tekstowym, podczas gdy połączenie może pozostać otwarte i ponownie używane jako potrzebny Format to jedna linia tekstu na punkt danych, gdzie każda linia zawiera kropkowaną nazwę metryki, wartość i znacznik czasowy epoki Unix oddzielone spacjami Na przykład klient może wysłać. W wysokim poziomie wszystkie dane węgla są wysłuchane dla danych w tym formacie i staraj się je przechowywać na dysku tak szybko, jak to możliwe przy użyciu szeptu Później będziemy omawiać szczegóły niektórych sztuczek stosowanych w celu zapewnienia skalowalności i uzyskania najlepszej wydajności możemy wyjąć z typowego dysku twardego.7 3 Fro nt End Graphs On-Demand. Graphite webapp umożliwia użytkownikom żądanie niestandardowych wykresów z prostymi parametrami API Graphing opartymi na adresie URL w zapytaniu-ciągiem żądania GET, a obraz PNG jest zwracany w odpowiedzi na przykład Na przykład adres URL żąda 500 300 wykresu dla metryki i ostatnich 24 godzin danych Prawdę mówiąc, tylko wymagany parametr jest wymagany wszystkie inne są opcjonalne i używają wartości domyślnych, jeśli pominięto. Grafit obsługuje wiele różnych opcji wyświetlania, a także manipulacji danymi funkcje, które podążają prostą funkcjonalną składnią Na przykład, możemy wyznaczyć 10-punktową średnią ruchliwą metryki w naszym poprzednim przykładzie, tak jak to. Funkcje mogą być zagnieżdżone, co pozwala na złożone wyrażenia i obliczenia. Oto inny przykład, który daje całkowitą pracę sprzedaży na dzień przy użyciu parametrów produktu na minutę. Funkcja sumSeries oblicza serię czasową, która jest sumą każdego metryki pasującego do wzorca Następnie całość oblicza bieżącą sumę niż liczyć na minutę Z tego miejsca nie jest zbyt trudno sobie wyobrazić, jak można zbudować interfejs WWW do przeglądania i manipulowania wykresami Graphite pochodzi z własnego interfejsu kompozytora, pokazanego na rysunku 7 3, używając do modyfikowania wykresu s Parametry adresu URL, gdy użytkownik kliknie przez menu dostępnych funkcji. figura 7 3 Grafit s Kompozytor Interface.7 4 Pulpity nawigacyjne. Podstawa Graphite została wykorzystana jako narzędzie do tworzenia pulpitów WWW opartych na sieci WWW Interfejs URL API sprawia, że ​​jest to przypadek użycia naturalnego Tworzenie panelu jest takie proste, jak tworzenie strony HTML zawierającej znaczniki takie jak to. Jednak nie każdy lubi craftować adresy URL ręcznie, a więc Graphite's Composer UI udostępnia metodę wskaż i kliknij, aby utworzyć wykres, z którego można po prostu skopiować i wklej adres URL W połączeniu z innym narzędziem, które pozwala na szybkie tworzenie stron internetowych, takich jak wiki, staje się to dość łatwe, że użytkownicy nietechnologiczni mogą łatwo tworzyć własne pulpity nawigacyjne. 7 Oczywiste wąskie gardło. Kiedy moi użytkownicy zaczęli budować dashboa rds, Graphite szybko zaczął mieć problemy z wydajnością Sprawdzałem logi serwera internetowego, aby zobaczyć, jakie żądania były bagatelizowane To było całkiem oczywiste, że problem polegał na samej ilości żądań graficznych Aplikacja webapp była związana z procesorem, stale renderując wykresy, było wiele identycznych próśb, a deski rozdzielcze były obwiniane. Wyobraź sobie, że masz deskę rozdzielczą z 10 wykresami, a strona odświeża raz na minutę. Każdorazowo użytkownik otwiera dashboard w swojej przeglądarce, Graphite musi obsłużyć 10 dodatkowych żądań na minutę To szybko staje się kosztowne. Proste rozwiązanie polega na renderowaniu każdego wykresu tylko raz, a następnie jego kopiowaniu do każdego użytkownika. Rama internetowa Django, na której jest zbudowany Graphite, zapewnia doskonały mechanizm buforowania, który może korzystać z różnych tylnych końców, np. memcached Memcached 3 jest zasadniczo tablicą mieszaną dostarczoną jako usługa sieciowa Aplikacje klienckie mogą pobierać i ustawiać pary klucz-wartość tak, jak zwykły tablicę mieszania Główną zaletą używania memcac hed jest taki, że wynik kosztownego żądania, np. renderowania wykresu, można szybko zapisać i pobrać później, aby obsługiwać kolejne żądania. Aby uniknąć powtarzania tych samych stale wykresów na zawsze, memcached może zostać skonfigurowany tak, aby wygasł w pamięci podręcznej wykresy po krótkim okresie. Nawet jeśli to to tylko kilka sekund, obciążenie, które sięga Graphite jest ogromne, ponieważ duplikaty żądań są tak powszechne. Innym popularnym przypadkiem, który tworzy mnóstwo żądań renderowania, jest to, gdy użytkownik dostosowuje opcje wyświetlania i używa funkcji w interfejsie kompozytorskim za każdym razem, gdy użytkownik coś zmienia się, grafit musi odświeżyć wykres Te same dane są zaangażowane w każde zlecenie, dlatego dobrze jest umieścić podstawowe dane w pamięci memcache, co sprawia, że ​​UI reaguje na użytkownika, ponieważ krok pobierania danych jest pomijany.7 6 Optymalizacja O. Wyobraź sobie, że masz 60 000 danych wysyłanych na serwer Graphite, a każda z tych danych ma jeden punkt danych na minutę Pamiętaj, że każda metryka ma własnego szeptu w systemie plików Oznacza to, że węgiel musi wykonać jedną operację zapisu do 60 000 różnych plików co minutę Tak długo, jak węgiel może pisać do jednego pliku co milisekundę, powinien być w stanie utrzymać się Nie jest to zbyt długo, ale powiedzmy masz co najmniej 600 000 danych aktualizujących każdą minutę lub dane są aktualizowane co sekundę, a może po prostu nie możesz sobie pozwolić na wystarczająco szybkie przechowywanie Niezależnie od przypadku, zakładaj, że liczba przychodzących punktów danych przekracza szybkość operacji zapisu, jeśli ta sytuacja zostanie przeprowadzona. Większość dysków twardych w tych dniach ma powolny czas poszukiwań 4, czyli opóźnienie między wykonywaniem operacji typu IO w dwóch różnych miejscach, w porównaniu do zapisu ciągłej sekwencji danych. Oznacza to, że im bardziej przylegające do siebie piśmie, tym większą przepustowość dostajemy Ale jeśli mamy tysiące plików, które muszą być zapisywane często, a każde pisanie jest bardzo małe jeden punkt danych szeptem jest tylko 12 bajtów to nasze dyski na pewno będą spędzić mo to jest jedynym sposobem zwiększenia naszej przepustowości danych poza tą stawką jest zapisanie wielu punktów danych w jednej operacji zapisu Jest to możliwe, ponieważ szept porządkuje kolejne punkty danych ciągle na dysku Więc dodałem funkcję updatemany do szeptu, która pobiera listę punktów danych dla pojedynczego metryki i kompaktuje ciągłe punkty danych w pojedynczą operację zapisu Pomimo tego, że każda praca była większa, różnica czasu potrzebuje aby zapisać dziesięć punktów danych 120 bajtów w porównaniu do jednego punktu danych 12 bajtów jest nieistotny Zajmuje jeszcze kilka punktów danych, zanim wielkość każdego zapisu zaczyna zauważalnie wpływać na latencję. Następna implementacja mechanizmu buforowania w węglu Każdy przychodzący punkt danych jest mapowany do kolejki opartej na jego metrycznej nazwie, a następnie do tej kolejki Kolejny wątek wielokrotnie iteruje przez wszystkie koleje i dla każdego go wyciąga wszystkie punkty danych i zapisuje je w odpowiednim szeptanym pliku z aktualizacją Powrót do naszego przykładu, jeśli 600 000 metryk aktualizuje się co minutę, a nasza pamięć może zapisać się tylko na 1 zapisie na milisekundę, kolejki kończą się utrzymując średnio około 10 punktów danych Jedynym zasobem nas kosztującym jest pamięć, która jest stosunkowo obfite, ponieważ każdy punkt danych jest tylko parę bajtów. Ta strategia dynamicznie buforuje tyle punktów danych, ile potrzeba, aby utrzymać tempo przychodzących punktów danych, które mogą przekroczyć szybkość operacji IO Twoja przechowywanie może nadążyć za przyjemną zaletą tego podejścia jest to, że dodaje pewien stopień odporności do obsługi tymczasowych spowolnień IO Jeśli system musi wykonać inne prace IO poza Graphite to jest prawdopodobne, że szybkość operacje zapisu zmniejszą się, w takim przypadku kolejki węglowe po prostu wzrastają Im większa kolejka, tym większa liczba zapisów Ponieważ całkowita przepustowość punktów danych jest równa prędkości w rytm razy średni przeciętny rozmiar każdego zapisu, węgiel może utrzymywać się tak długo, jak długo jest wystarczająco dużo pamięci dla kolejkowego mechanizmu kolejkowania węgla jest przedstawiony na rysunku 7 4.Faktura 7 4 Mechanizm kolejkowania węgla 7 7 Utrzymywanie prawdziwego - Time. Buffering punkty danych był dobrym sposobem na zoptymalizowanie emisji dwutlenku węgla, ale nie długo, aby użytkownicy zauważyli raczej niepokojący efekt uboczny Ponowne spojrzenie na nasz przykład, mamy 600 000 danych, które aktualizują się co minutę, a my przypuszczamy, że nasze przechowywanie danych może utrzymywać się na poziomie tylko 60 000 operacji zapisu na minutę Oznacza to, że w danym momencie będziemy mieć około 10 minut danych na kolejkach węglowych Dla użytkownika oznacza to, że wykresy, o które się zwrócą, pochodzą z programu Graphite webapp, ostatnie 10 minut danych Nie jest dobrym. Na szczęście rozwiązanie jest całkiem proste. Po prostu dodałem słuchawkę do węzła, który dostarcza interfejs zapytań do dostępu do buforowanych punktów danych, a następnie modyfikuje grafitę Weba pp do używania tego interfejsu za każdym razem, gdy wymaga pobierania danych Webapp łączy w sobie punkty danych pobranych z węgla z punktami danych pobranymi z dysku i voila, wykresy są w czasie rzeczywistym przyznane, w naszym przykładzie punkty danych są aktualizowane do chwili, a więc nie dokładnie w czasie rzeczywistym, ale fakt, że każdy punkt danych jest natychmiast dostępny na wykresie po otrzymaniu węgla jest w czasie rzeczywistym.7 8 jądra, pamięci podręczne i katastrofalne awarie. Jest to prawdopodobnie oczywiste teraz najważniejsza cecha charakterystyczna wydajności systemu Graphite zależy od tego, czy jest to opóźnienie IO Dotychczas zakładaliśmy, że nasz system ma stałą niską latencję IO wynoszącą średnio około 1 milisekundę na zapis, ale jest to duże założenie wymagające nieco głębszej analizy dyski twarde po prostu nie mogą trwać nawet z kilkudziesięcioma dyskami w macierzy RAID, prawdopodobnie z opóźnieniem o długości większej niż 1 milisekunda dla swobodnego dostępu Jeśli chcesz spróbować sprawdzić, jak szybko nawet stary laptop może napisać cały kilobajt na dysku, że system zapisu zwraca w znacznie mniej niż 1 milisekundę. Oprogramowanie Why. Whenever niespójne lub nieoczekiwane wydajność, zazwyczaj buforowanie lub buforowanie to obwinianie W tym przypadku mamy do czynienia z obiema write system call doesn t technicznie zapisuje dane na dysk, po prostu umieszcza go w buforze, który następnie jądro następnie zapisuje na dysku To dlatego wywołanie zapisu zwraca zwykle tak szybko Nawet po tym, jak bufor został zapisany na dysku, często pozostaje buforowany w celu późniejszego odczytu Oba te zachowania, buforowanie i buforowanie wymagają pamięci oczywiście. Programiści jądra, będąc inteligentnymi ludźmi, zdecydowali, że warto użyć dowolnej pamięci przestrzeni użytkownika, która jest obecnie wolna, zamiast przydzielać pamięć absolutnie To okazuje się być bardzo użytecznym boosterem wydajności i wyjaśnia, że ​​bez względu na to, ile pamięci do systemu dodasz, zwykle kończy się prawie zero fr ee pamięć po wykonaniu niewielkiej ilości IO Jeśli twoje aplikacje przestrzeni użytkownika przestaną używać tej pamięci, prawdopodobnie jest to prawdopodobnie jego wadą Minusem tego podejścia jest to, że ta wolna pamięć może zostać odebrana z jądra, gdy użytkownik decyduje się na przestrzeń to musi przydzielić więcej pamięci dla siebie Jądro nie ma wyboru, ale zrezygnować z niego, tracąc wszelkie bufory mogły być tam. So co to wszystko oznacza dla Graphite Właśnie podkreślił, że węgiel jest zależny od konsekwentnie niskiej IO latencji, a my także wiemy że wywołanie systemu zapisu zwraca tylko szybko, ponieważ dane są tylko skopiowane do bufora Co się stanie, gdy nie ma wystarczającej pamięci dla jądra, aby kontynuować buforowanie? Pisanie stało się synchroniczne, a więc strasznie spowalnia Powoduje dramatyczny spadek szybkości operacje zapisu węgla, które powodują, że kolejki węglowodorów rosną, co zużywa jeszcze więcej pamięci, co jeszcze bardziej umiera z powodu jądra W rezultacie, taka sytuacja zazwyczaj prowadzi do węgiel wyczerpany z pamięci lub zabity przez gniewnego administratora. Aby uniknąć tego rodzaju katastrofy, dodałem kilka elementów do węglowego, w tym konfigurowalne limity, jak wiele punktów danych może być w kolejce iw szybkościach, jak szybko można przeprowadzić różne operacje szepcze Funkcje te mogą chronić węgiel przed wymyślaniem się spod kontroli, a zamiast tego nakładać mniej surowe efekty, np. Upuszczenie niektórych punktów danych lub odmowę przyjęcia większej liczby punktów danych. Jednak właściwe wartości tych ustawień są specyficzne dla systemu i wymagają dużej liczby testów, aby dostroić się. użyteczne, ale nie zasadniczo rozwiązują problem W tym celu będziemy potrzebować więcej sprzętu.7 9 Klastering. Making wielu serwerów grafitowych wydają się być pojedynczym systemem z perspektywy użytkownika nie jest strasznie trudne, przynajmniej dla na ve implementacji Webapp interakcja użytkownika składa się głównie z dwóch operacji wyszukiwania wskaźników i pobierania punktów danych zwykle w formie wykresu Operacje wyszukiwania i pobierania sieci web pp są schowane w bibliotece, która zawiera streszczenia ich implementacji z pozostałej części bazy kodu i są one również narażone przez aplikatory żądań ułatwiające zdalne wywoływanie operacji. Operacja wyszukiwania wyszukuje w lokalnym systemie plików szeptane dane dotyczące elementów dopasowanych do określonego przez użytkownika wzoru, podobnie jak glob globu systemu plików, jak pasuje do plików z tym rozszerzeniem Jako strukturę drzewa, wynik zwrócony przez find jest zbiorem obiektów Węzłów, z których każda pochodzi z podkategorii Gałęzi lub Liści katalogów węzłów odpowiadających węzłom oddziału i szeptanym plikom do węzłów liści Ta warstwa abstrakcji ułatwia obsługę różnych rodzajów podstawowej pamięci masowej, w tym plików RRD 5 i plików gzipowanych szeptem. Interfejs Leaf definiuje metodę pobierania, której implementacja zależy od typu węzła liścia W przypadku szeptanych plików po prostu cienka owijka wokół funkcji szerszej biblioteki biblioteka własna Gdy dodano obsługę klastrowania, funkcja wyszukiwania została rozszerzona, aby móc ją ke zdalne odnajdywanie połączeń za pośrednictwem innych serwerów grafitowych określonych w konfiguracji protokołu webapp Siedziba danych zawartych w wynikach tych wywołań zostaje owinięta jako obiekty zdalnego, które są zgodne ze zwykłymi interfejsami węzła i gałęzi Oddziaływanie klastrów przezroczystych na resztę baza kodowa webapp s Metoda pobierania dla zdalnego węzła liściowego jest realizowana jako kolejne wywołanie umożliwiające pobieranie punktów danych z węzła s Serwer grafitowy. Wszystkie te połączenia są tworzone między aplikacjami sieci WWW w taki sam sposób, jak klient zadzwonił do nich, z wyjątkiem jednego dodatkowego parametr określający, że operacja powinna być wykonywana lokalnie i nie może być redystrybuowana w całym klastrze Gdy webapp zostanie poproszony o renderowanie wykresu, wykonuje operację find w celu zlokalizowania żądanych danych i wywołuje wywołania każdego z nich w celu pobrania ich punktów danych dane znajdują się na serwerze lokalnym, na odległych serwerach lub w obu przypadkach Jeśli serwer zanika, zdalne wywołanie limitu czasu jest dość szybkie, a serwer ma jest wyłączony z pracy przez krótki okres, podczas którego nie będą wykonywane żadne dalsze wezwania Z punktu widzenia użytkownika, niezależnie od danych na utraconym serwerze, na ich wykresach brakuje danych, chyba że dane są duplikowane na innym serwerze w klastrze. 7 9 1 Krótka analiza efektywności klastrowania. Najdroższa część żądania graficznego renderuje wykres. Każda rendering jest wykonywana przez pojedynczy serwer, dodając więcej serwerów skutecznie zwiększa wydajność renderowania wykresów. Jednak fakt, że wiele pytań kończy się rozsyłanie połączeń z wszystkimi innymi serwerami w klastrze oznacza, że ​​nasz system klastrowania dzieli wiele obciążenia front-end, a nie rozproszonego. To, co osiągnęliśmy w tym momencie, jest skutecznym sposobem na dystrybucję obciążenia zwrotnego, ponieważ każda instancja węglowa działa niezależnie Jest to dobry pierwszy krok, ponieważ większość czasu tylny koniec jest wąskim gardłem przed przednim końcem, ale wyraźnie przedni koniec nie będzie skalować poziomo Z tym podejściem. Aby skuteczniej zwiększyć skalę przedniego koła, należy zredukować liczbę odwołań oddzwanianych przez webapp. Ponownie, najprostszym rozwiązaniem jest buforowanie. Podobnie jak memcached jest już używany do buforowania punktów danych i renderowanych wykresów, może być także użyta do zapisania wyników wyszukiwania w poszukiwaniu żądań Ponieważ lokalizacja danych jest znacznie mniej prawdopodobna, aby często się zmieniać, zazwyczaj powinna być ona przechowywana dłużej Pamiętaj, że wyrównywanie limitu czasu pamięci podręcznej w celu znalezienia wyników jest zbyt długie że nowe dane dodane do hierarchii mogą nie być tak szybkie dla użytkownika.7 9 2 Dystrybucja danych w klastrze Graphite webapp jest dość jednorodny w całym klastrze, ponieważ wykonuje dokładnie to samo zadanie na każdym serwerze węglowym rola może się różnić w zależności od serwera do serwera w zależności od danych wybranych do wysyłania do każdego wystąpienia Często jest wielu różnych klientów wysyłających dane do węzła, więc byłoby dość irytujące, aby połączyć każdego klienta z konfi guru z układem klastra grafitowego Dane aplikacji mogą przejść do jednego serwera węglowego, podczas gdy metryki biznesowe mogą być wysyłane do wielu serwerów węglowych w celu nadmiarowości. Aby uprościć zarządzanie tymi scenariuszami, Graphite jest wyposażony w dodatkowe narzędzie zwane przekaźnikami węgla. Jego zadanie jest całkiem prosta, otrzymuje dane metryczne od klientów dokładnie tak, jak standardowy demon węgla, który jest faktycznie nazwany pamięcią węglową, a zamiast przechowywania danych, stosuje zestaw reguł do nazw metrycznych, aby ustalić, które serwery pamięci podręcznej do przekazywania danych do każdej reguły składa się wyrażenie regularne i lista serwerów docelowych Dla każdego otrzymanego punktu reguły są oceniane w kolejności, a pierwsza reguła, której wyrażenie regularne pasuje do nazwy metryki jest używane W ten sposób wszyscy klienci muszą zrobić, wysyłając swoje danych do przekaźnika węglowodorów i trafi na właściwe serwery. W pewnym sensie przekaźnik węglowy zapewnia funkcjonalność replikacji, chociaż bardziej dokładnie będzie nazywany wejściem d uplikowanie, ponieważ nie zajmuje się kwestiami synchronizacji Jeśli serwer tymczasowo opuści czas, brakuje punktów danych w okresie, w którym był nieobsadzony, ale w inny sposób funkcjonuje normalnie Istnieją skrypty administracyjne, które pozostawiają kontrolę nad procesem ponownej synchronizacji w rąk administratora systemu.7 10 Refleksje projektu. My doświadczenie w pracy nad grafitem potwierdziło moje przekonanie, że skalowalność ma niewiele wspólnego z wydajnością na niższym poziomie, ale jest to produkt o ogólnym wzornictwie, jaki napotkam w wielu wąskich gardłach po drodze, ale za każdym razem poszukuję ulepszeń w projekcie, a nie szybkości w wydajności Zapytałem mnie wiele razy, dlaczego napisałem Graphite w Pythonie, a nie Java czy C, a moja odpowiedź zawsze polega na tym, że jeszcze nie natknęłam się na Prawdziwa potrzeba, aby inny język mógł zaoferować W Knu74 Donald Knuth sławnie powiedział, że przedwczesna optymalizacja jest źródłem wszelkiego zła Tak długo, jak przypuszczamy, że nasz kod będziemy nadal ewoluować w sposób nietrywialny, a następnie wszelka optymalizacja 6 w pewnym sensie jest przedwczesna. Jednym z największych atutów Graphite i największych słabości jest fakt, że bardzo mało zostało zaprojektowane w tradycyjnym rozumieniu Wielki Graphite stopniowo rozwijał się, pokonując przeszkody, gdy pojawiają się problemy Wiele razy przeszkody były przewidywalne i różne rozwiązania zapobiegawcze wydawały się naturalne Jednak warto unikać rozwiązywania problemów, które jeszcze nie mają, nawet jeśli wydaje się prawdopodobne, że wkrótce będzie to powodem Powodem jest to, możesz dowiedzieć się więcej od dokładnego zbadania rzeczywistych awarii niż teoretyzowania na temat najlepszych strategii Rozwiązywanie problemów opiera się zarówno na danych empirycznych, jakie mamy pod ręką, jak i naszej własnej wiedzy i intuicji Znalazłem, że wątpenie, że twoja mądrość wystarczająco zmusi Cię do przyjrzenia się Dane empiryczne są bardziej dokładne. Na przykład gdy pierwszy raz napisałem szept, byłem przekonany, że trzeba będzie go napisać w języku C dla szybkości i że mój Python implementacja służyłaby tylko jako prototyp Jeśli nie byłem w stanie czasowym, bardzo dobrze mogłem pominąć implementację Pythona Całkowicie okazuje się, że IO jest wąskim gardłem tak dużo wcześniej niż CPU, że mniejsza wydajność Pythona w ogóle nie ma znaczenia w praktyce. Jak powiedziałem, podejście ewolucyjne jest również wielką słabością interfejsów grafitowych, okazuje się, że nie nadają się do stopniowej ewolucji Dobry interfejs jest spójny i stosuje konwencje, aby zmaksymalizować przewidywalność W tym przypadku Graphite s Interfejs API adresu URL jest obecnie moim interfejsem. Opcje i funkcje zostały z czasem powiązane z czasem, tworząc niewielkie wyspy spójności, ale ogólnie brakuje globalnego poczucia spójności Jedynym sposobem rozwiązania tego problemu jest poprzez wersjonowanie interfejsów , ale to też ma wady Gdy nowy interfejs jest zaprojektowany, stary trudno się pozbyć, przechodząc dookoła jako bagaż ewolucyjny, jak ludzki dodatek I t może wydawać się nieszkodliwe, dopóki pewnego dnia Twój kod nie dostanie się do wyrostka robaczkowego iea błąd związany ze starym interfejsem i zmuszony do pracy Jeśli wcześniej miałbym zmienić jedną z rzeczy na temat Graphite wcześnie, to byłoby o wiele większe podejście do projektowania zewnętrznego API, zastanawiając się nad tym, zamiast rozwijać je po kolei. Innym aspektem grafitu, który powoduje frustrację, jest ograniczona elastyczność hierarchicznego modelu nazewnictwa metrycznego. Choć jest to dość proste i bardzo wygodne dla większości przypadków użycia, sprawia, że ​​niektóre trudne zapytania są trudne , nawet niemożliwe do wyrażenia Kiedy po raz pierwszy pomyślałem o utworzeniu Graphite, wiedziałem od samego początku, że chciałem ludzkiego edytora URL API do tworzenia wykresów 7 Chociaż nadal jestem zadowolony, że Graphite zapewnia to dzisiaj, obawiam się, że ten wymóg obarczony API z nadmiernie prostą składnią, która sprawia, że ​​wyrażenia złożone są niewygodne Hierarchia sprawia, że ​​problem określania podstawowego klucza dla metryki jest dość prosty, ponieważ ścieżka jest zasadniczo klucz podstawowy dla węzła w drzewie Z wadą jest to, że wszystkie dane opisowe, tj. dane kolumn muszą być osadzone bezpośrednio w ścieżce Potencjalnym rozwiązaniem jest utrzymanie modelu hierarchicznego i dodanie osobnej bazy danych metadanych w celu umożliwienia bardziej zaawansowanego wyboru metryki o specjalnej składni.7 11 Stanie się otwartym źródłem. Napatrując się na ewolucji grafitu, wciąż jestem zaskoczony zarówno tym, jak daleko jest projekt i jak daleko zabrał mnie jako programista To zaczęło się jako zwierzak projekt, który był tylko kilkuset wierszami kodu Silnik renderujący rozpoczął się jako eksperyment, po prostu aby zobaczyć, czy mógłbym napisać jeden szept napisany w ciągu weekendu z rozpaczy, aby rozwiązać problem związany z show-stopperem przed krytycznym datą rozpoczęcia węgiel został przepisany więcej razy, niż dbam o to, aby pamiętać Gdy tylko w 2008 r. pozwolono mi zwolnić Graphite z licencji open source, nigdy nie spodziewałem się wiele odpowiedzi Po kilku miesiącach wspomniano o tym w CNET arti który został odebrany przez Slashdot i projekt nagle się rozpoczął i jest aktywny od dzisiaj Dzisiaj istnieje dziesiątki dużych i średnich firm korzystających z Graphite Społeczność jest całkiem aktywna i nadal rośnie Daleko od tego, że jest produktem gotowym, jest wiele ciekawych prac eksperymentalnych, które sprawiają, że zabawa jest w pracy i pełna potencjału. Jest inny port, w którym można wysyłać spakowane obiekty, co jest bardziej wydajne niż format zwykłego tekstu To jest potrzebne tylko w bardzo wysokich poziomy ruchu. Napędy typu państwowego zazwyczaj mają bardzo szybkie czasy wyszukiwania w porównaniu z konwencjonalnymi dyskami twardymi. Pliki RRD są w rzeczywistości węzłami branżowymi, ponieważ mogą zawierać wiele źródeł danych. Źródłem danych RRD jest węzeł w liściach. Knut w szczególności oznacza optymalizację kodu niskiego poziomu , a nie optymalizacji makroskopowej, takiej jak poprawa konstrukcji. Zmusza to sam wykres jako otwarte źródło Każdy może po prostu spojrzeć na adres URL grafu, aby go zrozumieć lub zmodyfikować.

No comments:

Post a Comment