MongoDB

Վիքիպեդիայից՝ ազատ հանրագիտարանից

MongoDB-ն (առաջացած "humongous" բառից) բաց ելքային կոդով, բարձր արտադրողականությամբ, սխեմաից զուրկ, դոկումենտ-կողմնորոշված տվյալների հենք է` գրված C++ լեզվով: [1] Տվյալների հենքը դոկումենտ-կողմնորոշված է և ըստ այդմ այն ղեկավարում է JSON-անման փաստաթղթեր (դոկումենտներ): Շատ ծրագրեր կարող են ներկայացնել տվյալները ավելի բնական ձևով, քանի որ տվյալները կարող են ներդրված լինել բարդ հիերարխիաներում և միաժամանակ լինել հարցվող և ինդեքսավորվող:

MongoDB-ի մշակումը սկսվեց 2007 թվականի հոկտեմբերին 10gen-ի կողմից: Առաջին հանրային թողարկումը փետրվարի 2009-ին է եղել:[2]

Առանձնահատկություններ[խմբագրել]

Առանձնահատկություններից են

  • Հետևողական UTF-8 կոդավորումը: Ոչ-UTF-8 տվյալները կարող են պահվել, հարցվել կամ ստացվել հատուկ բինար տվյալների տիպով:
  • Տարբեր պլատֆորմների հնատավորություն. բինար փաթեթները հասանելի են Windows, Linux, OS X և Solaris օպերացիոն համակարգերի համար: MongoDB-ն կարող է կոմպիլացվել գրեթե ցանկացած համակարգի համար:
  • Տիպային հարստություն. ունի date (ամսաթիվ), regular expressions (ռեգուլյար արտահայտություններ), code (կոդ), binary data (բինար տվյալներ) և այլն (բոլոր BSON տիպերը)
  • Կուրսորներ հարցման արդյունքների համար

Այլ առանձնահատկություններ.

Ad hoc հարցումներ[խմբագրել]

MongoDB-ում ցանկացած դաշտ կարող է հարցվել ցանկացած ժամանակ: MongoDB-ն օժանդակում է միջակայքերով հարցումներ, ռեգուլյար արտահայտություններով որոնում և այլ հատուկ տիպի հարցումներ` բացարձակ համընկնումով դաշտերին կից: Հարցումները կարող են նաև ներառել օգտագործողի կողմից հայտարարված JavaScript ֆունկցիաներ (եթե ֆունկցիան վերադարձնում է true` դոկումենտը համընկնում է):

Հարցումները կարող են վերադարփնել դոկումենտների սպեցիֆիկ դաշտեր (ամբողջական դոկումենտի փոխարեն), ինչպես նաև վերադասավորություն, անցումներ և հարցման արդյունքների սահմանափակում (լիմիտավորում):

Ներդրված դաշտերի հարցումներ[խմբագրել]

Հարցումները կարող են հասցվել ներդրված օբյեկտներով և զանգվածներով: Եթե հետևյալ JSON օբյեկտը մուտքագրվի users հավաքածուի մեջ.

   {
       "username" : "bob",
       "address" : {
           "street" : "123 Main Street",
           "city" : "Springfield",
           "state" : "NY"
       }
   }

Մենք կկարողանանք հարցում անել այս դոկումենտին հետևյալ կերպ և ստանալ բոլոր դոկումենտները, որոնք ունեն "New York" հասցեն.

> db.users.find({"address.state" : "NY"})

Զանգվածի էլեմենտները նույնպես կարող են հարցված լինել.

> db.food.insert({"fruit" : ["peach", "plum", "pear"]})
> db.food.find({"fruit" : "pear"})

Ինդեքսավորում[խմբագրել]

Այս փաթեթն օժանդակում է երկրորդական ինդեքսներ` ներառյալ մեկ բանալիանոց (single-key), խառը (compound), ունիկալ (unique), ոչ-ունիկալ (non-unique) և աշխարհագրատարածական (geospatial[3]) ինդեքսներ: Ներդրված դաշտերը (ինչպես վերը բացատրված է "Ad Hoc հարցումներ" բաժնում) նույնպես կարող են ինդեքսավորվել, և զանգված տիպի ինդեքսավորումը կբերի դրա յուրաքանչյուր էլեմենտի ինդեքսավորման:

MongoDB-ի հարցումների օպտիմիզատորը (query optimizer) կփորձի բազում տարբեր հարցման պլաններ` հարցման կատարման ժամանակահատվածում, և կընտրի դրանցից առավել արագը` պարբերաբար վերադիսկրետավորելով: Երևակիչնեչը կարող են տեսնել, որ ինդեքսը օգտագործվում է 'explain' ֆունկցիաի հետ և ընտրեն այլ ինդեքս 'hint' ֆունկցիայով:

Ինդեքսները կարող են ստեղծվել և ջնջվել ցանկացած ժամանակ:

Ագրեգացիա[խմբագրել]

"Ad Hoc" հարցումների հետ համատեղ, տվյալների հենքը օժանդակում է զույգ գործիքներ ագրեգացիայի համար` ներառյալ MapReduce[4]-ը և group (խմբավորման) ֆունկցիան, որը նման է SQL-i GROUP BY արտահայտությանը:

Ֆայլային պահոց[խմբագրել]

Այս ծրագիրը ներածում է պրոտոկոլ, որը կոչվում է GridFS[5], որը օգտագործվում է տվյալների հենքից ֆայլեր ստանալու և դրա մեջ պահելու համար: Այս ֆայլային պահոցի մեխանիզմը օգտագործվել է plugin-ների մեջ NGINX[6]-ի և lighttpd.[7]-ի համար:

JavaScript-ի կատարումը սերվերի կողմում[խմբագրել]

JavaScript-ը MongoDB-ի lingua franca-ն է և կարող է օգտագործվել հարցումների, ագրեգացիայի ֆունկցիաների (այնպիսիք, ինչպիսին է MapReduce-ը) մեջ և ուղարկվել տվյալների հենքին` կատարվելու համար:

JavaScript-ի օչինակ հարցման մեջ.

> db.foo.find({$where : function() { return this.x == this.y; }})

Տվյալների հենքին` ի կատար ածվելու համար ուղարկված կոդի օրինակ.

> db.eval(function(name) { return "Hello, "+name; }, ["Joe"])

Վերը նշվածը կվերադարձնի "Hello, Joe":

JavaScript փոփոխականները կարող են նաև պահվել տվյալներւ հենքում և օգտագործվել ցանկացած այլ JavaScript-ի կողմից` որպես գլոբալ փոփոխական: Ցանկացած լեգալ JavaScript-տիպ` ներառյալ ֆունկցիաները և օբյեկտները, կարող են պահվել MongoDB-ում այնպես, որ JavaScript-ը կարողանա օգտագործվի "պահված պրոցեդուրաներ" (stored procedures) գրելու համար:

Պատած հավաքածուներ[խմբագրել]

MongoDB-ն օժանդակում է ֆիքսված չափսով հավաքածուներ, որոնք կոչվում են "պատած հավաքածուներ" (capped collections[8]). Պատած հավաքածուն ստեղծվում է խմբի չափսով և, օպցիոնալ, էլեմենտների քանակով: Պատած հավաքածուները հավաքածուների միակ տիպն են, որը պահպանում է մուտքագրման կարգը. հատկացված չափսին հասնելուն պես պատած հավաքածուն գործում է ինչպես կրկնվող հերթ (circular queue):

Կուրսորի հատուկ տիպ, որը կոչվում է հետևվող կուրսոր (tailable cursor[9]), կարող է օգտագործվել պատած հավաքածուների հետ: Այս կուրսորը կոչվել է ի պատիվ `tail -f` հրամանի և չի փակվում, երբ այն վերջացնում է վերադարձնել արդյունքները, այլ շարունակում է սպասել ևս մեկի վերադարձմանը, վերադարձնելով նոր արդյունքներ` պատած հավաքածուի մեջ դրանց ավելանալուն պես:

Տեղադրում (Deployment)[խմբագրել]

MongoDB-ն կարող է ստեղծվել և տեղադրվել ելքային կոդից (source code), բայց հիմնականում տեղադրվում է բինար փաթեթից: Բազում Linux-ի փաթեթների կառավարման համակարգերի պահեստներ այժմ ներառում են MongoDB-ի փաթեթը` ներառյալ CentOS և Fedora,[10] Debian և Ubuntu,[11] Gentoo[12] և Arch Linux:[13] Այն նաև կարելի է ներբեռնել պաշտոնական կայքից:[14]

MongoDB-ն օգտագործում է հիշողությանը հատկացված ֆայլեր` սահմանափակելով տվյալների չափսը 2GB-ով 32 բիթանոց մեքենաների վրա (64 բիթային համակարգերն ունեն բավականին ավելի մեծ տվյալների չափ).[15] MongoDB սերվերը կարող է օգտագործվել միայն "little-endian" համակարգերի հետ, չնայած դրայվերների մեծամասնությունը գործում է թե little-endian, և թե big-endian համակարգերի վրա:

Լեզուների օժանդակում[խմբագրել]

MongoDB-ն ունի պաշտոնական դրայվերներ հետևյալ լեզուների համար.

Գոյություն ունեն նաև բազմաթիվ ոչ պաշտոնական սարքավարներ (դրայվերներ)` C#-ի և .NET-ի,[18] ColdFusion-ի,[27] Delphi-ի,[28] Erlang-ի,[29][30] Factor-ի,[31] Fantom-ի,[32] Go-ի,[33] JVM լեզուների (Clojure, Groovy [34], Scala, և այլն),[35] Lua-ի,[36] node.js-ի,[37] HTTP REST,[38] Ruby-ի,[39] Racket-ի,[40] և Smalltalk-ի համար:[41]

Սինխրոնիզացիա[խմբագրել]

MongoDB-ն երբեք ցանկալի չէ, որ տեղադրվի ավելի քիչ, քան 2 սերվերների վրա` master-ի և slave-ի: Master-ը կարող է կատարել գրելու/կարդալու ֆունկցիաները: Slave-ը պատճենում է տվյալները master-ից և կարող է միայն օգտագործվել կարդալու կամ backup-ների համար (և ոչ գրելու):

MongoDB-ն թույլ է տալիս երևակիչներին երաշխավորել, որ գործողությունը սինխրոնիզացվել է ամենաքիչը _N_ սերվերների հետ` մեկ գործողության ընթացքում:

Master-slave[խմբագրել]

Master-ի վրա գործողությունների կատարմանը պես slave-ը կնույնացնի ցանկացած փոփոխություն տվյալների նկատմամբ:

Օրինակ` master/slave զույգի աշխատանքի սկսելը լոկալ կերպով`

$ mkdir -p ~/dbs/master ~/dbs/slave
$ ./mongod --master --port 10000 --dbpath ~/dbs/master
$ ./mongod --slave --port 10001 --dbpath ~/dbs/slave --source localhost:10000

Replica sets[խմբագրել]

Replica set-երը նման են master-slave-ին, բայց դրանք համագործակցում են slave-ի` նոր master ընտրելու հնարավորությանը, եթե այս պահին աշխատող master-ը անջատվում է:

Հատվածավորում (Sharding)[խմբագրել]

MongoDB-ն ընդարձակվում է հորիզոնտալ ուղղությամբ, օգտագործելով մի համակարգ, որը կոչվում է հատվածավորում (sharding[42]), որը շատ նման է BigTable և PNUTS ընդարձակման մոդելին: Երևակիչը ընտրում է հատվածի բանալի (shard key), որը որոշում է, թե ինչպես են տվյալները ներկայացվելու: Տվյալները կիսվում են հատվածների (հատվածի բանալիի հիման վրա) և բաժանվում են բազմաթիվ հատվածների մեջ: (հատվածը մեկ կամ ավել slave-եր ունեցող master է):

Երևակիչի ծրագիրը պետք է իմանա, որ այն խոսում է հատվածավորված կլաստերի (cluster) հետ` որոշակի գործողությունների կատարման ժամանակ: Օրինակ, "findAndModify" հարցումը պետք է պարունակի հատվածի բանալի, եթե հարցված հավաքածուն հատվածավորված է[43]: Ծրագիրը հաղորդակցվում է հատուկ երթուղային (routing) պրոցեսի` "mongos"-ի հետ, որը նույնն է, ինչ միայնակ MongoDB սերվերը: Այս "mongos" պրոցեսը գիտի, թո ինչ տվյալներ կան յուրաքանչյուր հատվածում և ուղորդում է կլիենտի հարցումները` համապատասխանաբար: Բոլոր հարցումները հոսում են այս պրոցեսի միջով. այն ոչ միայն ուղորդում է հարցումները և պատասխանները, այլն նաև կատարում է վերջնական տվյալների անհրաժեշտ միացումները և սորտավորումները: "Mongos" պրոցեսների ցանկացած քանակ կարող է աշխատել. սովորաբար մեկ ծրագրի համար խորհուրդ է տրվում մեկը:

Կառավարում և գրաֆիկական front-end[խմբագրել]

Պաշտոնական գործիքներ[խմբագրել]

Ամենաուժեղ և օգտակար կառավարման գործիքը տվյալների հենքի shell-ն է` mongo-ն: Shell-ը թույլ է տալիս երևակիչներին դիտել տվյալները, մուտքագրել դրանք, ջնջել կամ թարմեցնել իրենց տվյալների հենքում, ինչպես նաև ստանալ սինխրոնիզացված ինֆորմացիան, կարգավորել հատվածավորումը, անջատել սերվերները, կատարել JavaScript կոդ և ավելին: mongo-ն հիմնված է SpiderMonkey-ի վրա և, ըստ այդմ, այն լիարժեք JavaScript shell է, որը թույլ է տալիս միանալ MongoDB սերվերներին:

Ադմինիստրատիվ ինֆորմացիան կարող է հասանելի դառնալ ադմին-ինտերֆեյսի միջոցով` հասարակ մի HTML էջի, որը մատակարարում է ինֆորմացիա ներկայիս սերվերի կարգավիճակի մասին: Լռելյայն, այս ինտերֆեյսը 1000 պորտով ավելի բարձր է տվյալների հենքի պորտից (http://localhost:28017) և կարող է անջատված լինել --norest պարամետրի միջոցով:

mongostat-ը հրամանային տերմինալի գործիք է, որը ցույց է տալիս կարգավիճակի պարզ ցուցակ վերջին վայրկյանի մասին` քանի մուտքագրումներ, թարմեցումներ, ջնջումներ, հարցումներ և հրամաններ են կատարվել, ինչպես նաև տվյալների հենքի փակ լինելու (locked) և դրա կողմից օգտագործվող հիշողության քանակի տոկոսային հարաբերությունները:

mongosniff-ը բռնում է (sniff է անում) ցանցի տրաֆիկը, որը գնում և գալիս է դեպի MongoDB:

Մոնիթորինգ[խմբագրել]

Կան նաև մոնիթորինգի plugin-ներ MongoDB-ի համար.

Օգտագործողի Գրաֆիկական Ինտերֆեյսներ (GUI)[խմբագրել]

Կան մի քանի օգտագործողի գրաֆիկական ինտերֆեյսներ, որոնք ստեղծվել են երևակիչներին օգնելու` վիզուալիզացնել իրենց տվյալները: Հայտնիների շարքում են.

Լիցենզիա և աջակցություն[խմբագրել]

MongoDB-ն հասանելի է անվճար տարբերակով` GNU Affero General Public License լիցենզիայի տակ: Լեզուների դրայվերները հասանելի են Apache License լիցենզիայի տակ:[55] Կոմմերցիոն լիցենզիաները հասանելի են 10gen-ով: 10gen-ը նաև առաջարկում է արտադրանքի հետ կապված աջակցություն, թրեյնինգներ ը մասնագիտական ծառայություններ MongoDB-ի համար:

Նշանավոր օգտագործողներ[խմբագրել]

Տեսեք նաև[խմբագրել]

Հղումներ[խմբագրել]

  1. MongoDB website
  2. MongoDB Blog - March 2010
  3. Geospatial indexes
  4. MapReduce
  5. GridFS
  6. NGINX
  7. lighttpd
  8. capped collections
  9. [1]
  10. CentOS and Fedora
  11. Debian and Ubuntu,
  12. Gentoo
  13. Arch Linux
  14. official website
  15. [2]
  16. C driver
  17. C++ driver
  18. 18,0 18,1 C# driver
  19. Haskell driver
  20. Java driver
  21. JavaScript driver
  22. Perl driver
  23. PHP driver
  24. Python driver
  25. Ruby driver
  26. Casbah, the officially supported Scala Driver for MongoDB
  27. ColdFusion driver
  28. Delphi
  29. Emongo Erlang driver
  30. Erlmongo Erlang driver
  31. Factor driver
  32. Fantom driver
  33. gomongo Go driver
  34. GMongo
  35. JVM language center
  36. LuaMongo
  37. node.js driver
  38. REST interface
  39. rmongo
  40. [3]
  41. Smalltalk driver
  42. sharding
  43. [4]
  44. Munin plugin
  45. Ganglia plugin
  46. Scout slow-query plugin
  47. Cacti plugin
  48. Fang of Mongo
  49. Futon4Mongo
  50. Mongo3
  51. MongoHub
  52. RockMongo
  53. Opricot
  54. PHPMoAdmin
  55. The AGPL - MongoDB Blog: May 5, 2009
  56. «12 Months with MongoDB»։ 2010-10-25։ http://blog.wordnik.com/12-months-with-mongodb։ Վերցված է 2011-05-24։ 
  57. «MongoDB - diasporatest.com»։ 2010-12-23։ http://www.diasporatest.com/index.php/MongoDB։ Վերցված է 2010-12-23։ 
  58. «Implementing MongoDB at Shutterfly - Presentation at MongoSF»։ 2010-04-30։ http://www.10gen.com/event_mongosf_10apr30#shutterfly։ Վերցված է 2010-06-28։ 
  59. «MongoDB at foursquare - Presentation at MongoNYC»։ 2010-05-21։ http://blip.tv/file/3704098։ Վերցված է 2010-06-28։ 
  60. «Carbon Calculated - We use MongoDB and so should you»։ 2010-06-16։ http://blog.carboncalculated.com/we-use-mongodb-and-so-should-you։ Վերցված է 2010-08-27։ 
  61. «bit.ly user history, auto-sharded - Presentation at MongoNYC»։ 2010-05-21։ http://blip.tv/file/3704043։ Վերցված է 2010-06-28։ 
  62. Maher, Jacqueline (2010-05-25). «Building a Better Submission Form». NYTimes Open Blog. http://open.blogs.nytimes.com/2010/05/25/building-a-better-submission-form/։ Վերցված է 2010-06-28. 
  63. «How Python, TurboGears, and MongoDB are Transforming SourceForge.net»։ PyCon 2010։ 2010-02-20։ http://us.pycon.org/2010/conference/schedule/event/110/։ Վերցված է 2010-06-28։ 
  64. «How This Web Site Uses MongoDB»։ Business Insider։ 2010-11-06։ http://www.businessinsider.com/how-we-use-mongodb-2009-11։ Վերցված է 2010-06-28։ 
  65. 65,0 65,1 «MongoDB at Etsy»։ Code as Craft: Etsy Developer Blog։ 2010-05-19։ http://codeascraft.etsy.com/2010/05/19/mongodb-at-etsy/։ Վերցված է 2010-06-28։  (չաշխատող հղում)
  66. «Holy Large Hadron Collider, Batman!»։ The MongoDB NoSQL Database Blog։ 2010-06-03։ http://blog.mongodb.org/post/660037122/holy-large-hadron-collider-batman։ Վերցված է 2010-08-03։ 
  67. «A minor update for GameVars»։ Playtomic Blog։ 2010-10-07։ http://playtomic.com/blog/post/40-a-minor-update-for-gamevars։ Վերցված է 2010-10-07։ 
  68. «Building Our Own Tracking Engine With MongoDB»։ Thumbtack Blog։ 2011-05-03։ http://engineering.thumbtack.com/2011/05/03/building-our-own-tracking-engine-with-mongodb/։ Վերցված է 2011-05-15։ 

Գրականության ցանկ[խմբագրել]

Արտաքին հղումներ[խմբագրել]