Upload
piotr-duda
View
89
Download
1
Embed Size (px)
Citation preview
Katalog produktów w MongoDB na przykładzie Nokaut.pl
Piotr DudaSenior Software Developer & Team Leader
Co to jest Nokaut.pl?
Katalog produktów
Oferta a produkt
Produkt “X” (od 30 do 50 zł)
Oferta “X” sklepu 1 30 złOferta “X” sklepu 2 32 złOferta “X” sklepu 3 38 złOferta “X” sklepu 4 47 złOferta “X” sklepu 5 50 zł
Proces przetwarzania danych
Katalog produktów
Oferty Pobieranie danych API
Nokaut.pl
Partner 1
Partner 2
Partner 3
Partner 4
Grupowanie
Katalog produktów w liczbach● ilość kategorii ostatniego poziomu: 3 tys.,● ilość ofert: 17 mln,● ilość produktów: 12 mln,● ilość URL’i produktów 19 mln,● ilość zdjęć 105 mln,● wyrażenia regularne przekształcające dane: 330 tys.,● wyrażenia regularne do przenoszenia ofert w strukturze: 30 tys.,● liczba możliwych importów sklepu na dobę: 15 (co godzinę, między 7:00 a 21:00)
Dlaczego MongoDB?
Nokaut.pl w 2011● jeden import danych ze sklepów w ciągu dnia,● jeden sposób grupowania ofert w produkty,● przechowywanie tylko aktywnych produktów,● katalog w bazie danych MySQL (Master - Slave) problemy wydajnościowe:
○ Entity–attribute–value model,○ przy aktualizacji danych ,○ przy wykonywaniu DDL’i (ALTER TABLE ...)
Nowy import danych - wymagania biznesowe● wiele importów w ciągu dnia,● przechowywanie historycznych produktów i ich adresów URL,● możliwość grupowania ofert różnymi algorytmami,● porządkowanie danych RegExp’ami,● udostępnienie danych przez API
Alternatywy w 2011● Sharding w MySQL
○ brak wbudowanego rozwiązania - zewnętrzni dostawcy
● NoSQL○ CouchDB (1.0)
■ dostęp do danych REST’em po HTTP (JSON)○ Elastic (0.18)
■ wczesna faza rozwoju projektu, ■ słaba dokumentacja i wsparcie
○ MongoDB (2.0)■ dobre opinie o skalowalności,■ BSON,■ indeksy,■ obsługa RegExp’ów w zapytaniach,■ dokumentacja, społeczność
MongoDB w Nokaut
KlastryGłówny klaster z sharding’em (Main):
● 5 shard’ów (set’ów)○ Primary (priority 10, votes 1),○ Secondary (priority 5, votes 1),○ Hidden Secondary (priority 0, votes 1),○ 2 x Arbiter (votes 1)
● 3 x Config Servers● 3 x Mongos (query router)
● Primary - WiredTiger (kompresja snappy), ● Secondary - MMAP,● Hidden Secondary - WiredTiger (kompresja zlib)
Klaster zdjęć (photorb):
● Primary (priority 1, votes 1),● Secondary (priority 0.5, votes 1),● Arbiter (votes 1)
WiredTiger (kompresja zlib)
MMAP vs WiredTiger, photorb DB Storage
2014-05 2016-12
MMAP vs WiredTiger, photorb Memory
2016-122014-05
MMAP vs WiredTiger, Main DB Storage
2016-122012-05
MMAP vs WiredTiger, Main Memory
2016-122012-05
Dlaczego różne silniki w shard’zie?● Primary (WiredTiger, indeksy LSM) - obsługuje odczyty i zapisy systemów
przetwarzających dane, ● Secondary (MMAP, indeksy BTree) - obsługuje odczyty (głównie API)● Hidden Secondary (WiredTiger) - “gorący backup”
Monitoring - Mongo Cloud Manager 1
Monitoring - Mongo Cloud Manager 2
Monitoring - Mongo Cloud Manager 3
Alerty - Mongo Cloud Manager 1
Alerty - Mongo Cloud Manager 2
Alerty - Mongo Cloud Manager 3
Backup● własny skrypt oparty o mongodump,● kompresja gzip,● 5 x 5G = 25G
Backup Mongo Cloud Manager
24G * $2.5 * 4,2 = 252 zł (miesięcznie)
GUI● Robomongo (Windows, Mac, Linux),● Mongo Compass (Windows, Mac) - wersja na Linux’a zapowiadana na
styczeń 2017
Szukanie wolnych zapytań● włączone logowanie zapytań o czasie wykonania dłuższym niż 2 ms,● w poniedziałki na zebranych logach ze wszystkich serwerów startuje Dex,● UWAGA: Rekomendacje dedykowane dla MMAP’a
Jak to działa? Ile z tego można wycisnąć?
mongostat - spokojna praca
mongostat - rusza slot importowy
mongostat - slot importowy cd.
Wydajność - uwagi
1. Wybór silnika● MMAP (indeksy BTree)● WiredTiger (kompresja, indeksy LSM),● RocksDB (indeksy LSM),● TokuMXse (indeksy Fractal Tree)
2.1. Sterownik (create) http://www.slideshare.net/mongodb/mongodb-europe-2016-star-in-a-reasonably-priced-car-which-driver-is-best/34
2.2. Sterownik (read) http://www.slideshare.net/mongodb/mongodb-europe-2016-star-in-a-reasonably-priced-car-which-driver-is-best/35
3. Sharding
● Dobry dobór klucza:○ sami tworzymy klucz + pre-splitting,○ integer, ObjectID -> Hashed indexes,
● “gorący shard”,● nie wszystkie funkcjonalności dostępne dla kolekcji z sharding’iem :(
4. Indeksy● na starcie jeden indeks na klucz główny _id,● indeksy typu sparse i partial,● hint,● indexStats,● błąd "Btree::insert: key too large to index, failing"
Ile to kosztuje?
Mongo Atlas
Mongo Atlas, koszty miesięczne (15 * 24 * 30 * 4.2) ● MMAP
○ M50 (32 GB / 160 GB) ~33 tys zł,○ M40 (16 GB / 80 GB) ~17 tys zł
● WiredTiger○ M30 (8 GB / 40 GB) ~9 tys zł,○ M20 (4 GB / 20 GB) ~3,2 tys zł
Mongo Atlas Sharding :(
Mongo Atlas M50 (~53 tys zł)
Jakie są dobre i złe strony MongoDB● Storage Engines,● wydajna replikacja i sharding,● dostępne wiele typów indeksów,● dużo funkcjonalności,● szybki rozwój (popularność w USA),● dobra dokumentacja,● narzędzia
● MMAP - zużycie pamięci i dysku, konieczność odzyskiwania miejsca,
● skomplikowana architektura shardingu (nody z danymi, arbiter, config, mongos),
● ograniczona funkcjonalność kolekcji shardowanych,
● sortowanie z uwzględnieniem polskich znaków poprawione po 6 latach (SERVER-1920),
Pytania?