Sapientia - Erdélyi Magyar TudományEgyetem (EMTE)
ABR 2( Adatbázisrendszerek 2) 9. Előadás: teljesítménynövelés
1
Tárolási motrok Beilleszthető tárolási motrok Mi egy beilleszthető tárolási motor (storage engine)? Egy interfész a merevlemez és az adatbázis között.
MongoDB szerver
Storage engine
Merevlemez Python, pymongo
Memória
2
QUIZ – Tárolási motrok A tárolási motrok közvetlenül meghatározzák a következők közül melyiket (melyikeket)? Az index formátumát A drájverek sodrony protokollját A klaszterek architektúráját Az adat fájl-formátumát
3
MMAPv1 Az eredeti tároló motor a MongoDB-ben. Allocate memory or map files or devices in memory LIBRARY Standard C Library (libc, -lc) SYNOPSYS #include<sys/mman.h>
100 GB Virtual Memory
100 GB
4
MMAPv1 1. Kollekció szintű zárolás 2. Síkbeli módosítás (in plane updates). Ha van hely módosításra, akkor marad helyben a dokumentum, másképp az egészet elköltöztetjük. 3. Kettes kitevő használata (power of two sizes). 3 byte→4 byte, 7 byte→8 byte, 19 byte→32 byte
A 3-as hozzásegít a 2-es kézbetartásához. Ha a módosítás kevéssel növeli meg a dokumentumot, akkor helyben kifér a módosítás. 5
MMAPv1 -QUIZ Mely megállapítások érvényesek az MMAPV1 tárolási motornál? MMAP dokumentum szintű zárolást biztosít MMAP automatikusan a 2-es hatványának megfelelő helyet biztosít, mikor dokumentumokat szúrunk be MMAP a mmap rendszer felső szintjén van, amelyik megfelelteti a fájlokat a memóriába MMAP menedzseli a használt memóriáját minden megfeleletetett fájlnak, eldöntve, hogy mely részek legyenek a memóriában a lemezről 6
Wired Tiger 1. Documentum szintű konkurrencia (különböző dokumentumokra érvényes) 2. Tömörítést alkalmaz mint a dokumentumokra mint az indexekre. A lemezre való írás előtt tömörít, mert a memóriában való tömörítés fölösleges. 3. Nincs helybeni módosítás. Használata: - storageEngine wiredTiger
7
Indexek {name:”Zoe”,hair_color:”brown”,DOB:”2001-03-23”} A kollekció összevissza van a lemezen. Ha nincs index és Zoe-t szeretnénk megkeresni, az egész kollekciót végig kell vizsgálni. Az index tartalmaz egy pointert, ahol megtalálható a rekord.
Andrew
Barry
Zoe
B-fákkal van megoldva. (name,hair_color) lehet összetett index is. Andrew Blonde
Andrew Red
Barry
Black
Ha csak a hajszínre szeretnénk keresni, akkor bajban vagyunk.
8
Indexek (a,b,c) indexelve van, akkor használható a
igen
a,b
igen
a,b,c
igen
b
nem
b,c
nem
c
nem
a,c
részlegesen
Írás – lassúbb lesz. Olvasás nagyon gyors lehet. Mikor nagyon sok elemű kollekciót másolunk valahova, érdemes egyszer átmásolni, majd utána indexelni.
9
Quiz – indexek Melyik optimizációnak van a legnagyobb hatása az adatbázis teljesítményére o Megnövelni a RAM-ot, hogy az állomány, amit feldolgozunk elférjen benne. o Gyorsabb lemezegységet adunk hozzá, s így azon műveletek, amelyek lemezelérést ígényelnek sokkal gyorsabbak o Kicserélni a Processzort (pl. 2x gyorsabbra) o Olyan indexeket adunk a kollekcióhoz, amelyik a lekérdezések kis százalékában vizsgálja végig a kollekciót 10
Index hozzáadása use school; db.students.findOne() db.students.find({student_id:5}) db.students.explain().find({student_id:5}) Winning plan: COLLSCAN – collection scan, vagyis a kollekció összes dokumentumát megvizsgálja. db.students.createIndex ({student_id:1}); db.students.explain(true).find({student_id:5}) - execution stage db.students.createIndex({student_id:1,class_id:-1}) 11
QUIZ – indexek készítése Kérünk egy Mongo shell utasítást, amelyik a students kollekcióhoz hozzaad egy olyan indexet, amelyiknek a kulcsa class, student_name. Egyik se megy a -1 irányba.
12
Indexek megtalálása (és törlése) > db.students.getIndexes() [ { "v" : 1, "key" : {"_id" : 1}, "name" : "_id_", "ns" : "school.students" },{ "v" : 1, "key" : {"student_id" : 1}, "name" : "student_id_1", "ns" : "school.students" } ] db.students.dropIndex ({student_id:1}); 13
QUIZ - Indexek megtalálása (és törlése) Melyik érvényes utasítás egy kollekciónak (collection) az indexeinek felfedésére? o o o o o
db.collection.findIndexes() db.getIndexes() db.collection.find("indexes") show indexes db.collection.getIndexes()
14
Többkulcsú indexek (multikey indexes) Listákon (arrays) készül ez az index.
{nev: “Laszlo”, tagek: [”asztalitenisz”,”minifoci”,”bridge”], szin: “kek”, helyseg:[“Csikszereda”,”Hargita”] } (tagek) (tagek, szin) Nem lehet 2 array tipus, pl. (tagek,helyseg) nem jó Létező adatbázison nem készíti el az indexet, ha 2 array típus van. Ha létezik az index, nem engedi bevinni a nem megfelelő dokumentumot. 15
QUIZ – többkulcsu indexek A foo kollekción a következő indexet készítettük: db.foo.createIndex( { a:1, b:1 } )
Mely bevitelek érvényesek erre a kollekcióra? db.foo.insert( { a : ["apples", "oranges" ], b : "grapes" } ) db.foo.insert( { a : "grapes", b : "oranges" } ) db.foo.insert( { a : "grapes", b : [ 8, 9, 10 ] } ) db.foo.insert( { a : [ 1, 2, 3 ], b : [ 5, 6, 7 ] } ) 16
Dot notation (pont jelölés és többkulcs) db.students.createIndex({“scores.score”:-1}) db.students.explain().find({'scores':{$elemMatch:{typ e:'exam',score:{$gt:99.8}}}}) db.students.find({$and:[{'scores.type':'exam'}, {'scores.score':{'$gt':99.8}}]})
17
Dot notation (pont jelölés és többkulcs) QUIZ People kollekció így néz ki: { "_id" : ObjectId("551458821b87e1799edbebc4"), "name" : "Eliot Horowitz", "work_history" : [ { "company" : "DoubleClick", "position" : "Software Engineer" }, { "company" : "ShopWiki", "position" : "Founder & CTO" }, { "company" : "MongoDB", "position" : "Founder & CTO" }]} Készítsünk indexet a company-ra, csökkenő sorrendben.
18
Index készítési opció, Unique Az eddig elkészített indexek nem voltak egyediek. Egyediek voltak csak az _id indexek, amelyet a rendszer készített el. db.stuff.drop() db.stuff.insert({'thing':'apple'}) db.stuff.insert({'thing':'pear'}) db.stuff.insert({'thing':'apple'}) db.stuff.createIndex({thing:1}); db.stuff.dropIndex({thing:1}); db.stuff.createIndex({thing:1},{unique:true}); db.stuff.remove({thing:'apple'},{justOne:true}); db.stuff.getIndexes() 19
QUIZ – egyedi (unique) indexek Kérjük megadni a mongo shell parancsot, amelyik egy egyedi indexet készít a student_id, class_id-re, növekő sorrendben a students kollekcióra.
20
Gyér (sparse) indexek Adott az alábbi 4 dokumentum. {a:1, b:2, c:5} {a:10, b:5, c:10} {a:13, b:17} {a:7, b:23} Egyedi (Unique) indexet a c-re nem tudok csinálni. Sparse: ne vedd be az indexbe azon dokumentumokat, ahol hiányzik a kulcs. db.collection.createIndex({c:1},{unique:true}) – nem működik db.collection.createIndex({c:1},{unique:true, sparse:true}) Sort esetében nem hasznos, az egész kollekciót végigpásztázza. 21
QUIZ – gyér (sparse) indexek Melyek a gyér indexek előnyei. Válaszd ki mindeniket, amelyik talál: Az indexek csak akkor lehetnek többkulcsuak, ha gyérek Az index minden esetben sokkal gyorsabban végzi a sorbaállítást. Nagyobb felxibilitást érünk el a Unique index készítésével Az index kevesebb helyet foglal el, mintha nem lenne gyér 22
Indexek készítése a háttérben Tulajdonság Alapértelmezett Sebesség DB blokk WRITE DB blokk READ
Előtérben Igen Gyors Igen Igen
Háttérben Nem Lassú Nem Nem
db.students.createIndex({‘scores.score’:1},{background:true})
23
QUIZ – indexek készítése a háttérben Mely állítások igazak a MongoDB háttérben elkészített indexeiről: Egy mongod szerver egyszerre csak egyetlen indexet tud a háttérben elkészíteni minden adatbázisra. Bár az adatbázis-szerver fogadja a kéréseket, a háttérben levő index készítése blokkolja azt a mongo shellt, amelyikben az index készítési parancsot kiadtuk. A háttérben való index készítése hoszabb időt igényel, mint az előtérben készített index Mongo 2.2 –ben és azután az indexek a háttérben készülnek alapértelmezés szerint 24
Az explain() használata Megadja, hogy az adatbázis mit csinál a lekérdezéssel. Hogyan hajtja végre, milyen indexeket használ, hány dokumentumot vizsgál meg. Megadja, mit fog csinálni az adatbázis. db.foo.find().explain() – volt használatban db.foo.explain().find() db.foo.explain().update() db.foo.explain().remove() db.foo.explain().aggregate() db.foo.explain().help() insert()-re nem használható
25
QUIZ – explain() használata Melyek érvényes utak megkeresni, hogy milyen indexeket használ egy sajátos lekérdezés? curs = db.example.find( { a : 1, b : 2 } ); curs.explain() db.example.find( { a : 1, b : 2 } ).explain() db.example.explain().remove( { a : 1, b : 2 } ) db.example.remove( { a : 1, b : 2 } ).explain() db.example.explain().find( { a : 1, b : 2 } ) var exp = db.example.explain(); exp.find( { a : 1, b : 2 } )
26
Explain Query planner – lekérdezés tervező executionStats – végrehajtási statisztikák allPlansExecution – minden végrehajtási terv var = db.example.explain("executionStats"); var = db.example.explain(“allPlansExecution");
27
QUIZ Az explain által megadott kimenetet láthatjuk. Mi írja le legjobban a történteket? o A lekérdezés 10000 dokmentumot fésült át és 520 miliszekundumot tartott o A lekérdezés terv-magyarázata egy kurzor által keletkezik o A lekérdezés használ egy BasicCursor nevű indexet és az eredményt 619 miliszekundum alatt szolgáltatja o A lekérdezés 999999 dokumentumot fésült át, eredményül 10000 dokumentumot kapott 619 miliszekundum alatt
28
Covered queries (Lefedett lekérdezések) Egy index által teljesen megvalósítható. Nem szükséges semmilyen más keresés. Sokkal gyorsabb minden más lekérdezésnél. var = db.numbers.explain(“executionStats”); exp.find({i:45, j:23}); executionStats – 100 returned docs (nReturned) “totalDocsExamined “: 100 “totalKeysExamined”: 100 _id:0, i:1, j:1, k:1 (totalDocsExamined: 0) Ha kihagyjuk a kéket, nem működik 29
Lefedett lekérdezés (covered query) - quiz Egy lefedett lekérdezést szeretnél készíteni az example kollekción. A következő indexeid vannak: { name : 1, dob : 1 } { _id : 1 } { hair : 1, name : 1 } db.example.find( { name : { $in : ["Alfred", "Bruce" ] } }, { name : 1, hair : 1 } ) db.example.find( { _id : 1117008 }, { _id : 0, name : 1, dob : 1}) db.example.find( { name : { $in : [ "Bart", "Homer" ] } }, {_id : 0, hair : 1, name : 1} ) db.example.find( { name : { $in : [ "Bart", "Homer" ] } }, {_id : 0, dob : 1, name : 1} )
30
Mikor használjuk az indexet? b, c, c, b, d, e, e, f, a, b, c Lekérdezési terv, amelyik 3 kandidáns indexet használ
31
QUIZ – mikor, melyik indexet használjuk Adott a foo kollekció a következő indexxel: db.foo.createIndex( { a : 1, b : 1, c : 1 } )
Mely lekérdezések fogják használni ezt az indexet? db.foo.find({c:1}).sort({a:-1, b:1}) db.foo.find( { c : 1 } ).sort( { a : 1, b : 1 } ) db.foo.find( { a : 3 } ) db.foo.find( { b : 3, c : 4 } ) 32
Milyen nagy az index állományunk? Lényeg, hogy az index beférjen a memóriába. db.students.stats() “totalIndexSize”: 668003728 db.students.totalIndexSize()
33
Index kardinalitás normál gyér többkulcsú 1:1 <=dokumentumok >dokumenutmok Feltételezzük, hogy módosítunk egy dokumentumot, amelynek egy kulcsa a tag és a módosítás miatt a merevlemezre kell írnunk. Ha a dokumentum 100 taget tartalmaz és azok többkulcsos (lista) indexként vannak nyilvántartva, hány helyen kell módosítani az index pointert?
34
Földrajzi indexek (geospatial indexes)-2D y
Ember x
‘location’:[x,y] ensureIndex({‘location’:’2d’,type:1}) find({location:{$near:[x,y]}}).limit(20) increasing distance (növekvő távolságra) 35
Geospatial index – Quiz Suppose you have a 2D geospatial index defined on the key location in the collection places. Write a query that will find the closest three places (the closest three documents) to the location 74, 140. 1 db.places.find({"location":{$near:[74,140]}}).limit(3) Correct
36
Igazi földgömb index Földrajzi hosszúság és szélesség. Szélesség: -90 től +90 fokig 2dsphere – 2 dimenziós gömb. geoJSON.org MongoDB o Pontok o Poligonok {nev:’Dok kafe’,varos:’Csikszereda’, ‘location’:{‘type’:’Point’, ‘coordinates’:[25.8096112,46.3550264]},type:’kavezo’} db.places.ensureIndex({‘location’:’2dsphere’}) 37
db.places.find({ location:{ $near:{ $geometry:{ type:’Point’, coordinates: [25.8096112,46.3550264], $maxdistance: 2000 } } } }) 38
Szöveges indexek Teljes szögeben való keresés? {_id:1,”szavak”:“A kutya keresi a labdat”} db.mondatok.find({“szavak”:”kutya”}) – semmit db.mondatok.ensureIndex({“szavak”:’text’}) db.mondatok.find({$text:{$search:’kutya’}}) db.mondatok.find({$text:{$search:’keresi kutya’}}) Mennyire jó a találat? db.mondatok.find({$text:{$search:’kutya keresi’}},{score:{$meta:’textScore’}}).sort({score: {$meta:’textScore’}}) 39
QUIZ – text keresés Egy text indexet készítettünk a "title„ mezőre a movies kollekcióban, majd elvégezzük a következő szöveg keresést: > db.movies.find( { $text : { $search : "Big Lebowski" } } ) Mely dokumentumokat fogja visszaadni, ha ezek mind a movies kollekcióban vannak? Jelöljük be mindeniket:
{ "title" : "The Big Lebowski" , star: "Jeff Bridges" } { "title" : "Big" , star : "Tom Hanks" } { "title" : "Big Fish" , star: "Ewan McGregor" } 40
Az index teljesítménye Cél: jól teljesítő READ/WRITE operációk. (ír/olvas) Szelektivitás: minimalizálni a bejárt rekordokat Más opciók: hogyan kezeljük a sort utasítást? db.students.find({student_id:{$gt:500000}, class_id:54}).sort({student_id:1}).hint({class_id:1} ).explain("executionstats") totalKeysExamined nReturned – result set winningPlan rejectedPlan SORT – minél kevesebbet használjunk 41
QUIZ – index teljesítmények Általánosságba véve, mely szabályokat kell betartani, amikor összetett indexeket készítünk? A definíciókat használjuk: equality field: mező, amelyen egyenlőségi tesztet futtatunk sort field: mező, amelyre a lekérdezés sort műveletet ad range field: mező, amelyen a lekérdezés tartományhoz való tartozást tesztel le Sort field az equality field előtt Equality field a range field előtt Sor field a range field előtt Equality field a sort field előtt Range field az equality field előtt 42
Lassú lekérdezések - profilozó >100 ms – log fájlba kiírja Profiler – system.profiler Szint 0
1
2
kikapcsolva Minden lassú lekérdezést MINDEN lekérdezést loggoljon loggoljon
mongod –dbpath /usr/local/var/mongodb –profile 1 –slowms 2 db.system.profile.find().sort({ts:1}).pretty() db.getProfilingStatus() db.setProfilingLevel(1,4)
43
QUIZ Write the query to look in the system profile collection for all queries that took longer than one second, ordered by timestamp descending. db.system.profile.find({millis:{$gt:1000}}).sort({ts:-1})
44
Mongotop 1. Indexek kritikusak a teljesítmény szempontjából 2. Explain 3. Hint 4. Profiling Magasabb szint a Mongotop. Hol tölti el az idejét a mongo. >mongotop 3 (3 sec)
45
Mongostat 1 sec – beír, lekérdez, módosít, töröl Párhúzamosan futtatni a WiredTiger-en és az mm
46
Sharding – szétszórt adatbázis
47