Upgrade to Pro — share decks privately, control downloads, hide ads and more …

A Year of MongoDB

A Year of MongoDB

(a ranty) presentation at PyGrunn 2013 about a year of MongoDB.

Armin Ronacher

May 10, 2013
Tweet

More Decks by Armin Ronacher

Other Decks in Programming

Transcript

  1. That's me. I do Computers. Currently at Fireteam / Splash

    Damage. We do Internet for Pointy Shooty Games.
  2. this is not a rant it's our experience in a

    nutshell we find corner cases draw your own conclusions
  3. “MongoDB is like a nuclear reactor: ensure proper working conditions

    and it's perfectly safe and powerful.” myself on 13th of October 2012
  4. ?

  5. worker: mongos, give me data mongos: mongod, give me data

    … mongos: worker, here is your data worker: finally! mongos, now give me more data context
  6. NO!

  7. Expectation • mongos fans out and proxies • if mongos

    loses connection worker is good • voluntary primary election is transparent for worker
  8. Actual Result • mongos fans out • if mongos loses

    connection it terminates both sides • voluntary primary election kills all connections well;
  9. Replica Set Annoyances 1. Add Hidden Secondary 2. Witness it

    synchronizing 3. Take an existing secondary out 4. Actually unregister the secondary 5. Watch the whole cluster re-elect the same primary and kill all active connections
  10. Breaking your Cluster 101 • add new primary • remove

    old primary • don't shutdown old primary • network partitions and one of them overrides the config of the other in the mongoc
  11. we built an ADT based type system anyways from fireline.schema

    import types username = types.String() profile = types.Dynamic() x = username.convert('mitsuhiko') y = profile.convert({'__binary': 'deadbeaf'})
  12. performance fun import os from pymongo import Connection safe =

    os.environ.get('MONGO_SAFE') == '1' con = Connection() db = con['wtfmongo'] coll = db['test'] coll.remove() for x in xrange(50000): coll.insert({'foo': 'bar'}, safe=safe)
  13. Disappointing $ MONGO_SAFE=0 time python test.py 1.92 real 1.37 user

    0.27 sys $ MONGO_SAFE=1 time python test.py 5.57 real 2.50 user 0.62 sys
  14. Disappointing $ MONGO_SAFE=0 time python test.py 1.92 real 1.37 user

    0.27 sys $ MONGO_SAFE=1 time python test.py 5.57 real 2.50 user 0.62 sys And
  15. that would not be a problem if safe mode was

    fast. As it stands currently safe mode is slower than Postgres
  16. They will happen 1. Before we had joins, we did

    not have joins 2. not having joins is not a feature 3. I see people joining in their code by hand. Inefficient
  17. RethinkDB has Distributed Joins :-) r \ .table('marvel') \ .inner_join(r.table('dc'),

    lambda m, dc: m['strength'] < dc['strength']) \ .run(conn)
  18. Oh got why!? db.bios.find({ "awards": {"$elemMatch": { "award": "Turing Award",

    "year": { "$gt": 1980 } }} }) db.users.find({"username": "mitsuhiko"})
  19. Aggregation Framework comes with SQL Injection db.zipcodes.aggregate({ "$group": {"_id": "$state",

    "total_pop": {"$sum": "$pop"}} }, { "$match": {"total_pop": {"$gte": 10 * 1000 * 1000}} })
  20. Aggregation Framework comes with SQL Injection db.zipcodes.aggregate({ "$group": {"_id": "$state",

    "total_pop": {"$sum": "$pop"}} }, { "$match": {"total_pop": {"$gte": 10 * 1000 * 1000}} }) spot
  21. They are important! 1. You will need them or you

    have inconsistent data 2. Everybody builds a two-phase commit system 3. You need a process to clean up stale transactions
  22. Shitty Index Selection 1. MongoDB picks secondary indexes automatically 2.

    It will also start using sparse indexes 3. It might not give you results back 4. Sometimes forcing ordering makes MongoDB use a compound index
  23. Limited Indexes 1. Given a compound index on [a, b]

    2. {a: 1, b: 2} and {$and: [{a: 1}, {b: 2}]} are equivalent 3. Only the former picks up the compound index 4. Negations never use indexes 5. {$or: […]} is implemented as two parallel queries, both clauses might need separate indexes.
  24. We

  25. Making Mongo not Suck (as much) on OS X $

    mongod --noprealloc --smallfiles --nojournal run what
  26. Keys are huge. In our case ⅓ of the Data.

    Shorten them. (if only MongoDB had something like a … schema?)
  27. A MongoDB Cluster needs to boot in a certain Order

    (Great fun if you have a suspended test infrastructure on Amazon)
  28. MongoDB is a pretty good data dump thing it's not

    a SQL database but you probably want a SQL database
  29. MongoDB is a pretty good data dump thing it's not

    a SQL database but you probably want a SQL database at least until RethinkDB is ready
  30. That's it. Now ask questions. And add me on twitter:

    @mitsuhiko Slides at lucumr.pocoo.org/talks ?
  31. Legal Shenanigans Creative Common Sources for Images: CPU by EssjazNZ:

    http:/ /www.flickr.com/photos/essjay/4972875711/ Locks by katiejean97: http:/ /www.flickr.com/photos/katiejean97/7036715845/ Money Money Money by Images_of_Money: http:/ /www.flickr.com/photos/59937401@N07/5474168441/ Through any Window by Josep Ma. Rosell: http:/ /www.flickr.com/photos/batega/1354354592/in/photostream/ RAD Soldiers is a Trademark of WarChest Limited. RAD Soldiers Artwork and Logo Copyright © 2013 by WarChest Limited. All Rights Reserved.