66
Software Engineer, 10gen @brandonmblack Brandon Black #MongoDBDays Introduction to Sharding

Software Engineer, 10gen @brandonmblack #MongoDBDays

Embed Size (px)

Citation preview

Page 1: Software Engineer, 10gen @brandonmblack #MongoDBDays

Software Engineer, 10gen

@brandonmblack

Brandon Black

#MongoDBDays

Introduction to Sharding

Page 2: Software Engineer, 10gen @brandonmblack #MongoDBDays

Agenda

• Scaling Data

• MongoDB's Approach

• Architecture

• Configuration

• Mechanics

Page 3: Software Engineer, 10gen @brandonmblack #MongoDBDays

Scaling Data

Page 4: Software Engineer, 10gen @brandonmblack #MongoDBDays

Examining Growth

• User Growth– 1995: 0.4% of the world’s population– Today: 30% of the world is online (~2.2B)– Emerging Markets & Mobile

• Data Set Growth– Facebook’s data set is around 100 petabytes– 4 billion photos taken in the last year (4x a decade

ago)

Page 5: Software Engineer, 10gen @brandonmblack #MongoDBDays

Read/Write Throughput Exceeds I/O

Page 6: Software Engineer, 10gen @brandonmblack #MongoDBDays

Working Set Exceeds Physical Memory

Page 7: Software Engineer, 10gen @brandonmblack #MongoDBDays

Vertical Scalability (Scale Up)

Page 8: Software Engineer, 10gen @brandonmblack #MongoDBDays

Horizontal Scalability (Scale Out)

Page 9: Software Engineer, 10gen @brandonmblack #MongoDBDays

Data Store Scalability

• Custom Hardware– Oracle

• Custom Software– Facebook + MySQL– Google

Page 10: Software Engineer, 10gen @brandonmblack #MongoDBDays

Data Store Scalability Today

• MongoDB Auto-Sharding

• A data store that is– 100% Free– Publicly available– Open-source

(https://github.com/mongodb/mongo)– Horizontally scalable– Application independent

Page 11: Software Engineer, 10gen @brandonmblack #MongoDBDays

MongoDB's Approach to Sharding

Page 12: Software Engineer, 10gen @brandonmblack #MongoDBDays

Partitioning

• User defines shard key

• Shard key defines range of data

• Key space is like points on a line

• Range is a segment of that line

Page 13: Software Engineer, 10gen @brandonmblack #MongoDBDays

Data Distribution

• Initially 1 chunk

• Default max chunk size: 64mb

• MongoDB automatically splits & migrates chunks when max reached

Page 14: Software Engineer, 10gen @brandonmblack #MongoDBDays

Routing and Balancing

• Queries routed to specific shards

• MongoDB balances cluster

• MongoDB migrates data to new nodes

Page 15: Software Engineer, 10gen @brandonmblack #MongoDBDays

MongoDB Auto-Sharding

• Minimal effort required– Same interface as single mongod

• Two steps– Enable Sharding for a database– Shard collection within database

Page 16: Software Engineer, 10gen @brandonmblack #MongoDBDays

Architecture

Page 17: Software Engineer, 10gen @brandonmblack #MongoDBDays

What is a Shard?

• Shard is a node of the cluster

• Shard can be a single mongod or a replica set

Page 18: Software Engineer, 10gen @brandonmblack #MongoDBDays

• Config Server– Stores cluster chunk ranges and locations– Can have only 1 or 3 (production must have

3)– Not a replica set

Meta Data Storage

Page 19: Software Engineer, 10gen @brandonmblack #MongoDBDays

Routing and Managing Data

• Mongos– Acts as a router / balancer– No local data (persists to config database)– Can have 1 or many

Page 20: Software Engineer, 10gen @brandonmblack #MongoDBDays

Sharding infrastructure

Page 21: Software Engineer, 10gen @brandonmblack #MongoDBDays

Configuration

Page 22: Software Engineer, 10gen @brandonmblack #MongoDBDays

Example Cluster

• Don’t use this setup in production!- Only one Config server (No Fault Tolerance)- Shard not in a replica set (Low Availability)- Only one mongos and shard (No Performance Improvement)- Useful for development or demonstrating configuration

mechanics

Page 23: Software Engineer, 10gen @brandonmblack #MongoDBDays

Starting the Configuration Server

• mongod --configsvr• Starts a configuration server on the default port

(27019)

Page 24: Software Engineer, 10gen @brandonmblack #MongoDBDays

Start the mongos Router

• mongos --configdb <hostname>:27019• For 3 configuration servers:

mongos --configdb <host1>:<port1>,<host2>:<port2>,<host3>:<port3>

• This is always how to start a new mongos, even if the cluster is already running

Page 25: Software Engineer, 10gen @brandonmblack #MongoDBDays

Start the shard database

• mongod --shardsvr• Starts a mongod with the default shard port (27018)• Shard is not yet connected to the rest of the cluster• Shard may have already been running in production

Page 26: Software Engineer, 10gen @brandonmblack #MongoDBDays

Add the Shard

• On mongos: - sh.addShard(‘<host>:27018’)

• Adding a replica set: - sh.addShard(‘<rsname>/<seedlist>’)

Page 27: Software Engineer, 10gen @brandonmblack #MongoDBDays

Verify that the shard was added

• db.runCommand({ listshards:1 }) { "shards" : [{"_id”: "shard0000”,"host”: ”<hostname>:27018” } ],

"ok" : 1 }

Page 28: Software Engineer, 10gen @brandonmblack #MongoDBDays

Enabling Sharding

• Enable sharding on a database

sh.enableSharding(“<dbname>”)

• Shard a collection with the given key

sh.shardCollection(“<dbname>.people”,{“country”:1})

• Use a compound shard key to prevent duplicates

sh.shardCollection(“<dbname>.cars”,{“year”:1, ”uniqueid”:1})

Page 29: Software Engineer, 10gen @brandonmblack #MongoDBDays

Tag Aware Sharding

• Tag aware sharding allows you to control the distribution of your data

• Tag a range of shard keys

sh.addTagRange(<collection>,<min>,<max>,<tag>)

• Tag a shard

sh.addShardTag(<shard>,<tag>)

Page 30: Software Engineer, 10gen @brandonmblack #MongoDBDays

Mechanics

Page 31: Software Engineer, 10gen @brandonmblack #MongoDBDays

Partitioning

• Remember it's based on ranges

Page 32: Software Engineer, 10gen @brandonmblack #MongoDBDays

Chunk is a section of the entire range

Page 33: Software Engineer, 10gen @brandonmblack #MongoDBDays

Chunk splitting

• A chunk is split once it exceeds the maximum size• There is no split point if all documents have the same

shard key• Chunk split is a logical operation (no data is moved)

Page 34: Software Engineer, 10gen @brandonmblack #MongoDBDays

Balancing

• Balancer is running on mongos• Once the difference in chunks between the most

dense shard and the least dense shard is above the migration threshold, a balancing round starts

Page 35: Software Engineer, 10gen @brandonmblack #MongoDBDays

Acquiring the Balancer Lock

• The balancer on mongos takes out a “balancer lock”• To see the status of these locks:

use configdb.locks.find({ _id: “balancer” })

Page 36: Software Engineer, 10gen @brandonmblack #MongoDBDays

Moving the chunk

• The mongos sends a moveChunk command to source shard

• The source shard then notifies destination shard• Destination shard starts pulling documents from

source shard

Page 37: Software Engineer, 10gen @brandonmblack #MongoDBDays

Committing Migration

• When complete, destination shard updates config server- Provides new locations of the chunks

Page 38: Software Engineer, 10gen @brandonmblack #MongoDBDays

Cleanup

• Source shard deletes moved data- Must wait for open cursors to either close or time out- NoTimeout cursors may prevent the release of the lock

• The mongos releases the balancer lock after old chunks are deleted

Page 39: Software Engineer, 10gen @brandonmblack #MongoDBDays

Routing Requests

Page 40: Software Engineer, 10gen @brandonmblack #MongoDBDays

Cluster Request Routing

• Targeted Queries

• Scatter Gather Queries

• Scatter Gather Queries with Sort

Page 41: Software Engineer, 10gen @brandonmblack #MongoDBDays

Cluster Request Routing: Targeted Query

Page 42: Software Engineer, 10gen @brandonmblack #MongoDBDays

Routable request received

Page 43: Software Engineer, 10gen @brandonmblack #MongoDBDays

Request routed to appropriate shard

Page 44: Software Engineer, 10gen @brandonmblack #MongoDBDays

Shard returns results

Page 45: Software Engineer, 10gen @brandonmblack #MongoDBDays

Mongos returns results to client

Page 46: Software Engineer, 10gen @brandonmblack #MongoDBDays

Cluster Request Routing: Non-Targeted Query

Page 47: Software Engineer, 10gen @brandonmblack #MongoDBDays

Non-Targeted Request Received

Page 48: Software Engineer, 10gen @brandonmblack #MongoDBDays

Request sent to all shards

Page 49: Software Engineer, 10gen @brandonmblack #MongoDBDays

Shards return results to mongos

Page 50: Software Engineer, 10gen @brandonmblack #MongoDBDays

Mongos returns results to client

Page 51: Software Engineer, 10gen @brandonmblack #MongoDBDays

Cluster Request Routing: Non-Targeted Query with Sort

Page 52: Software Engineer, 10gen @brandonmblack #MongoDBDays

Non-Targeted request with sort received

Page 53: Software Engineer, 10gen @brandonmblack #MongoDBDays

Request sent to all shards

Page 54: Software Engineer, 10gen @brandonmblack #MongoDBDays

Query and sort performed locally

Page 55: Software Engineer, 10gen @brandonmblack #MongoDBDays

Shards return results to mongos

Page 56: Software Engineer, 10gen @brandonmblack #MongoDBDays

Mongos merges sorted results

Page 57: Software Engineer, 10gen @brandonmblack #MongoDBDays

Mongos returns results to client

Page 58: Software Engineer, 10gen @brandonmblack #MongoDBDays

Shard Key

Page 59: Software Engineer, 10gen @brandonmblack #MongoDBDays

Shard Key

• Shard key is immutable

• Shard key values are immutable

• Shard key must be indexed

• Shard key limited to 512 bytes in size

• Shard key used to route queries– Choose a field commonly used in queries

• Only shard key can be unique across shards– `_id` field is only unique within individual shard

Page 60: Software Engineer, 10gen @brandonmblack #MongoDBDays

Shard Key Considerations

• Cardinality

• Write Distribution

• Query Isolation

• Reliability

• Index Locality

Page 61: Software Engineer, 10gen @brandonmblack #MongoDBDays

Conclusion

Page 62: Software Engineer, 10gen @brandonmblack #MongoDBDays

Read/Write Throughput Exceeds I/O

Page 63: Software Engineer, 10gen @brandonmblack #MongoDBDays

Working Set Exceeds Physical Memory

Page 64: Software Engineer, 10gen @brandonmblack #MongoDBDays

Sharding Enables Scale

• MongoDB’s Auto-Sharding– Easy to Configure– Consistent Interface– Free and Open-Source

Page 65: Software Engineer, 10gen @brandonmblack #MongoDBDays

• What’s next?– Hash-Based Sharding in MongoDB 2.4 (2:50pm)– Webinar: Indexing and Query Optimization (May

22nd)– Online Education Program– MongoDB User Group

• Resourceshttps://education.10gen.com/http://www.10gen.com/presentationshttp://www.10gen.com/eventshttp://github.com/brandonblack/presentations

Page 66: Software Engineer, 10gen @brandonmblack #MongoDBDays

Software Engineer, 10gen

@brandonmblack

Brandon Black

#MongoDBDays

Thank You