Katalog produktów w MongoDB na przykładzie Nokaut.pl

Post on 26-Jan-2017

89 views 1 download

Transcript of Katalog produktów w MongoDB na przykładzie Nokaut.pl

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?

piotr.duda@nokaut.pl