MongoDB
MongoDB on useilla eri alustoilla toimiva MongoDB Inc:n kehittämä dokumentti-orientoitunut tietokantaohjelmisto. MongoDB kuuluu ns. NoSQL-tietokantajärjestelmiin perinteisten relaatiomallia käyttävien sijaan. MongoDB on saatavilla Server Side Public License (SSPL) lisenssin ehdoilla. Ohjelmiston käyttämä tiedostomuoto on JSON-muodon kaltainen.
MongoDB | |
---|---|
Kehittäjä | MongoDB Inc. |
Kehityshistoria | |
Ensijulkaisu | 11. helmikuuta 2009 [1] |
Vakaa versio | 7.0.5 / [2] |
Tiedot | |
Ohjelmistotyyppi | dokumenttipohjainen tietokanta |
Ohjelmointikielet | C++, JavaScript, Python |
Lisenssi | Server Side Public License |
Aiheesta muualla | |
Verkkosivusto |
Historia
muokkaaOhjelmistoyritys 10gen aloitti MongoDB:n kehittämisen vuonna 2007 osana laajempaa alustaprojektia. Vuonna 2009 yritys vaihtoi toimintamalliksi avoimen lähdekoodin kehittämisen ja tukipalveluiden tarjoamisen. Vuonna 2013 10gen vaihtoi nimensä MongoDB Inc:ksi.[3] Lokakuussa 2017 MongoDB Inc listautui NASDAQ-pörssiin. [4] Lokakuussa 2019 MongoDB liittoutui Alibaba Cloud –pilvipalvelun kanssa. MongoDB:ta tarjotaan palveluna Alibaban datakeskuksissa. [5]
Keskeiset piirteet
muokkaaKyselyt tilanteen mukaan ja sisällön indeksointi
muokkaaMongoDB:llä voi tehdä hakuja tietokenttien nimien ja sisällön arvoalueiden perusteella sekä käyttäen säännöllisiä lausekkeita (engl. regular expressions), joilla kuvataan etsityn merkkijonon muoto.[6] Tietokenttiä voidaan indeksoida sekä yksikäsitteisiin primaari-indekseihin että toissijaisiin indekseihin.
Replikointi eli tiedon paikalliset kopiot
muokkaaMongoDB:n tietokannoista on vaivatonta tuottaa paikallisia kopioita eli replikoita.[7]
Kukin replika koostuu yhdestä tai useammasta datan kopiosta. Replikan osana olevat kopiot voivat toimia ensi- tai toissijaisina kopioina. Oletusarvoisesti luetaan ja kirjoitetaan ensisijaista kopiota. Toissijainen kopio toimii varmistuksena. Jos ensisijaisen kopion käyttö tai päivitys epäonnistuu, kukin replika määrittää automaattisesti, mistä toissijaisesta kopiosta tulee uusi ensisijaisesti käytettävä kopio. Toissijaisia kopioita voidaan lukea, mutta niiden sisällön ei katsota välttämättä olevan ensisijaisen kopion kanssa yhteneviä.
Kuormituksen jakaminen
muokkaaMongoDB mukautuu suurempaan kuormitukseen sharding-periaatteella.[8]
Käyttäjä määrittää kriteerin (shard key), jonka mukaan tietokannan kuormitus hajautetaan. Hajautus voidaan tehdä myös satunnaisesti, jolloin kuormitus on tasainen, tietokannan sisältöön perustuvasta kriteeristä riippumaton. MongoDB voi käyttää useita palvelimia joko kuormituksen jakamiseen tai varmistamaan toiminnan jatkuminen laitevian tapahtuessa.
Tiedostojärjestelmä
muokkaaMongoDB:ta voidaan käyttää myös tiedostojärjestelmänä,josta käytetään nimeä GridFS. Sillä voidaan jakaa kuormitusta ja hallita tiedon paikallisia kopioita. GridFS toteutetaan MongoDB:n ajuriohjelmilla, kuten Nginx-pluginilla ja lighttpd:llä, jotka tarjoavat toimintoja tiedostojen käsittelyyn.[9]
GridFS jakaa tiedostot osiin ja tallentaa kunkin osan erilliseksi dokumentiksi, joka on MongoDB:ssä tallennuksen looginen perusyksikkö.[10]
Tietojen koostaminen ja ryhmittely
muokkaaMongoDB:ssä on kolme tapaa koostaa ja ryhmitellä dataa: putki, Map-reduce–funktio ja erikoistuneet koostamismenetelmät.[11] Putki (pipeline) toimii UNIX:in putken tapaan toteuttaen peräkkäin useita toimintoja. Map-reduce-funktio tutkii datan ominaisuuksia ja tiivistää sitä laskennallisesti.[12]
MongoDB:n tarjoamat datan koostamistoiminnot näkyvät käyttäjälle samaan tapaan kuin SQL:n GROUP BY
–lauseen tulokset. $lookup-operaattorilla voi yhdistää dokumentteja eri kokoelmista ja suorittaa niille tilastolaskentaa, kuten laskea normaalijakauman.
JavaScriptin käyttö palvelinpäässä
muokkaaJavaScriptiä voidaan käyttää kyselyihin ja datan koostamiseen. Sillä voidaan myös kirjoittaa koodia tietokannassa suoritettavaksi.
Kooltaan rajatut kokoelmat ja rengaspuskuri
muokkaaMongoDB tukee kooltaan rajattuja kokoelmia (capped collections). Kun kokoraja saavutetaan, MongoDB käsittelee kokoelmia rengaspuskurin periaatteella: tieto tallennetaan kiinteässä järjestyksessä ja tilan täyttyessä tiedon tallennuspaikka siirtyy takaisin rakenteen alkuun.
Väitteet ACID-transaktioihin kykenemisestä
muokkaaMongoDB:n on väitetty tukevan usean dokumentin keskeisiä ACID-transaktioita kesäkuussa 2018 julkaistusta versio 4.0:sta lähtien.[13] Väite ei pidä paikkaansa, koska MongoDB ei toteuta snapshot isolation –ominaisuutta.[14]
Versiot
muokkaaArkkitehtuuri
muokkaaEri ohjelmointikielten käyttömahdollisuudet: MongoDB:lle on saatavilla viralliset ajurit tärkeimpiin ohjelmointikieliin ja kehitysympäristöihin.[18] On myös epävirallisia, yhteisöllisesti ylläpidettyjä muiden ohjelmointikielten ja kehysten ajureita.[19]
Asiakasohjelmien toteutuskirjastoja on saatavilla JavaScriptille[20], iOS:lle [21] ja Androidille.[22]
Lisensointi
muokkaaMongoDB Community Server
muokkaaMongoDB lisensoitiin lokakuussa 2018 Server Side Public License –lisenssillä (SSPL), joka on projektin itsensä kehittämä. SSPL korvaa GNU Affero General Public License –lisenssin (AGPL) ja on lähes identtinen GNU General Public License version 3 –lisenssin kanssa, mutta edellyttää, että niiden, jotka tarjoavat ohjelmaa palvelun osana, täytyy julkaista palvelun lähdekoodi tällä lisenssillä.[23][24]
SSPL lähetettiin Open Source Initiativen sertifioitavaksi, mutta vedettiin pois tästä prosessista.[25] Kieliajurit ovat saatavilla Apachen lisenssillä. Lisäksi MongoDB Inc. tarjoaa ohjelmistoa erityisehtojen mukaisilla lisensseillä (proprietary licenses). Viimeisimmät AGPL version 3 –lisenssin mukaiset versiot ovat 4.0.3. (vakaa versio) ja 4.1.4.
Lisensoinnin muututtua MongoDB ei ole enää mukana Debian-, Fedora- ja Red Hat Enterprise Linux -jakeluissa. Fedora on päättänyt, että SSPL version 1 ei ole vapaa ohjelmisto, koska se on ”tietoisesti suunniteltu aggressiivisesti diskriminoivaksi” kaupallisia käyttäjiä kohtaan.[26][27]
Ongelmahavaintoja ja kritiikkiä
muokkaaTurvallisuus
muokkaaMongoDB:n turvallisuusasetusten oletusarvot sallivat kenelle tahansa täydet oikeudet tietokantaan. Tämä on saanut aikaan, että kymmeniä tuhansia MongoDB-asennuksia on kaapattu. Moniin MongoDB-palvelimiin on hyökätty kiristyshaittaohjelmilla.[28][29]
Tekniikan kritiikkiä
muokkaaEräissä virhetilanteissa, joissa sovellus käyttää kahta erillistä MongoDB-prosessia, mutta näillä prosesseilla ei ole pääsyä toistensa tietoihin, on mahdollista, että MongoDB tuo vanhentunutta tietokantasisältöä (engl. stale reads). Näissä tilanteissa on myös mahdollista, että MongoDB palauttaa tietokannan aiempaan tilaan (engl. roll back).[30]
Tämä ongelma havaittiin marraskuussa 2016 julkaistussa versiossa 3.4.0.[31] Ongelma korjattiin takautuvasti versioon 3.2.12 asti.[32]
Ennen versiota 2.2 lukitus toteutettiin serveriprosessikohtaisesti. Version 2.2 myötä lukitus alettiin toteuttaa tietokantatasolla.[33] Versiosta 3.0 lähtien otettiin käyttöön uudenlaiset tallentimet (pluggable storage engines). Kukin tallennin toteuttaa lukitukset erikseen.[34] MongoDB 3.0:ssa lukitus toteutetaan kokoelmien tasolla MMAPv1-tallentimella.[35] WiredTiger-tallennin käyttää optimistista yhtäaikaisuudenhallintaa, joka tuottaa dokumenttitason lukitukset.[36]
Ennen versiota 3.0 yksi tapa käsitellä yhtäaikaisuutta on sharding eli tietokannan hajauttaminen tietyn avaimen arvojen mukaan.[37] Joissakin tilanteissa luku- ja kirjoitusoperaatiot avaavat lukituksen. Mikäli MongoDB ennustaa, ettei sivu todennäköisesti ole muistissa, lukitus aukeaa kun sivuja ladataan. Lukituksen avaamista käytetään laajemmin versiossa 2.2.[33]
Joissakin tilanteissa luku- ja kirjoitusoperaatiot avaavat lukituksen. Mikäli MongoDB ennustaa, ettei sivu todennäköisesti ole muistissa, lukitus aukeaa kun sivuja ladataan. Lukituksen avaamista käytetään laajemmin versiossa 2.2.[33] Versioon 3.3.11 asti MongoDB ei kyennyt lajittelemaan Unicodea käyttäviä ei-englanninkielisiä aineistoja oikein käytössä olleella tavuttain vertailulla (memcmp). Ongelma korjattiin 23.8.2016. lähde?
Ennen versiota 4.0 indeksihaut eivät olleet atomisia. Tästä aiheutui, että hausta saattoi jäädä pois dokumentteja, joita päivitettiin haun ollessa meneillään.[38] Snapshot read –piirre versiossa 4.0 poisti tämän ongelman.[39]
Tunnettuja käyttäjiä
muokkaaMongoDB:n tunnettuja käyttäjiä ovat Barclays, Bosch, Cisco, Chicagon kaupunki, Codeacademy, Coinbase, eBay, Foursquare, HSBC, IBM, Orange S.A., Sega, The Gap Inc. ja Uber.[40]
MongoDB World -konferenssi
muokkaaVuodesta 2014 lähtien on järjestetty vuotuisia MongoDB World –kehittäjäkonferensseja.[41]
Lähteet
muokkaa- ↑ System Properties Comparison Couchbase vs. MongoDB DB-Engines. Arkistoitu 18.9.2017. Viitattu 7.10.2022. (englanniksi)
- ↑ Release Notes for MongoDB 7.0.5. Tieto on haettu Wikidatasta.
- ↑ Harris, Derrick: 10gen embraces what it created, becomes MongoDB Inc. 27.8.2013. Gigaom. Arkistoitu 16.11.2018. Viitattu 25.8.2020.
- ↑ Witkowski, Wallace: MongoDB shares rally 34% in first day of trading above elevated IPO price marketwatch.com. 21.10.2017. Viitattu 25.8.2020.
- ↑ Betz, Brandy: MongoDB teams with Alibaba Cloud 30.10.2019. SeekingAlpha.com. Viitattu 25.8.2020.
- ↑ Kerby, Davis: Why MongoDB is the Way to Go DZone. 14.10.2015. Viitattu 25.8.2020.
- ↑ Nguyen, Stephen: Ridiculously fast MongoDB replica recovery Part 1 of 2 ClusterHQ [Internet Archive]. 30.10.2017. Viitattu 25.8.2020.
- ↑ van Scheppingen, Art: Turning a MongoDB Replica Set into a Sharded Cluster severalnines.com. 11.5.2013. Viitattu 25.8.2020.
- ↑ Walker-Morgan, Dj: GridFS & MongoDB: Pros & Cons Compose. 5.6.2014. compose.com. Arkistoitu 10.9.2017. Viitattu 25.8.2020.
- ↑ Malick Md: MongoDB overview ExpertsTown [Internet Archive 5.3.2014]. s.a.. Viitattu 25.8.2020.
- ↑ Aggegation docs.mongodb.com. MongoDB, Inc. Viitattu 25.8.2020.
- ↑ Map-Reduce docs.mongodb.com. MongoDB, Inc. Viitattu 25.8.2020.
- ↑ Kobielus, James: MongoDB Drives NoSQL More Deeply into Enterprise Opportunities 27.6.2018. Wikibon Research. Viitattu 26.8.2020.
- ↑ Kingsbury, Kyle: MongoDB 4.2.6 jepsen.io. 15.5.2020. Viitattu 25.8.2020.
- ↑ MongoDB Atlas mongodb.com. Viitattu 26.8.2020.
- ↑ MongoDB Atlas mongodb.com. Viitattu 26.8.2020.
- ↑ Miller, Ron: MongoDB launches Global Clusters to put geographic data control within reach of anyone techcrunch.com. 27.6.2018. Viitattu 26.8.2020.
- ↑ mongodb/mongo github.com. Viitattu 26.8.2020.
- ↑ Rodrigues, Matheus: Getting Started With MongoDB Using ASP.NET Core Web API 5.3.2018. M. Rodrigues. Viitattu 26.8.2020.
- ↑ mongodb/stitch-js-sdk GitHub. Viitattu 26.8.2020.
- ↑ mongodb / stitch-ios-sdk GitHub. Viitattu 26.8.2020.
- ↑ mongodb / stitch-android-sdk GitHub. Viitattu 26.8.2020.
- ↑ Baer, Tony: It's MongoDB's turn to change its open source license zdnet.com. 16.10.2018. Viitattu 26.8.2020.
- ↑ Lardinois, Frederic: MongoDB switches up its open-source license techcrunch.com. 16.10.2018. Viitattu 26.8.2020.
- ↑ Staff, Ars: In 2019, multiple open source companies changed course—is it the right move? Ars Technica. 16.10.2019. Viitattu 26.8.2020.
- ↑ Vaughan-Nichols, Steven J.: MongoDB "open-source" Server Side Public License rejected zdnet.com. 16.1.2019. Viitattu 26.8.2020.
- ↑ Krazit, Tom: MongoDB’s licensing changes led Red Hat to drop the database from the latest version of its server OS GeekWire. 16.1.2019. Viitattu 26.8.2020.
- ↑ Krebs, Brian: Extortionists Wipe Thousands of Databases, Victims Who Pay Up Get Stiffed krebsonsecurity.com. 17.1.2017. Viitattu 26.8.2020.
- ↑ Constantin, Lucian: Ransomware groups have deleted over 10,000 MongoDB databases Computerworld. 6.1.2017. Viitattu 26.8.2020.
- ↑ Kingsbury, Kyle: Call me maybe: MongoDB stale reads aphyr.com. 20.4.2015. Viitattu 26.8.2020.
- ↑ Release Notes for MongoDB 3.4 docs.mongodb.com. 14.8.2018. Arkistoitu 20.6.2021. Viitattu 26.8.2020.
- ↑ Kingsbury, Kyle: MongoDB 3.4.0-rc3 jepsen.io. 7.2.2017. Viitattu 26.8.2020.
- ↑ a b c Atomicity, isolation & concurrency in MongoDB scalegrid.io. 12.9.2013. Viitattu 26.8.2020.
- ↑ Woodle, Alex: MongoDB Goes Pluggable with Storage Engines datanami.com. 3.2.2015. Viitattu 26.8.2020.
- ↑ MongoDB, MMAPv1, WiredTiger, Locking, and Queues [Internet Archive] Arborian.com. 19.6.2017. Arborian Consulting. Arkistoitu 19.6.2017. Viitattu 26.8.2020.
- ↑ Gorman, Kenny: MongoDB with WiredTiger 1.10.2015. ObjectRocket.com. Viitattu 26.8.2020.
- ↑ Manko, Mikita: MongoDB performance bottlenecks, optimization Strategies for MongoDB www.mikitamanko.com. 6.12.2013. Viitattu 26.8.2020.
- ↑ Glasser, David: MongoDB queries don't always return all matching documents! Meteor Blog. 7.7.2016. Viitattu 14:25 26.8.2020.
- ↑ Read Concern "snapshot" docs.mongodb.com. Viitattu 26.8.2020.
- ↑ Aloto, Esayas: Who's Using MongoDB and Why? datavail.com. 4.11.2015. Datavail. Viitattu 26.8.2020.
- ↑ Chang, Chris: Reporting Back from MongoDB World 2014, NYC, Planet JSON DZone. 2.7.2014. Viitattu 26.8.2020.