60
Chief Evangelist, 10gen Steve Francia #MongoSeoul Sharding

Sharding - Seoul 2012

  • Upload
    mongodb

  • View
    754

  • Download
    0

Embed Size (px)

DESCRIPTION

 

Citation preview

Page 1: Sharding - Seoul 2012

Chief Evangelist, 10gen

Steve Francia

#MongoSeoul

Sharding

Page 2: Sharding - Seoul 2012

Agenda

• Short history of scaling data

• Why shard

• MongoDB's approach

• Architecture

• Configuration

• Mechanics

• Solutions

Page 3: Sharding - Seoul 2012

The story of scaling data

Page 4: Sharding - Seoul 2012

Visual representation of vertical scaling

1970 - 2000: Vertical Scalability (scale up)

Page 5: Sharding - Seoul 2012

Visual representation of horizontal scaling

Google, ~2000: Horizontal Scalability (scale out)

Page 6: Sharding - Seoul 2012

Data Store Scalability in 2005

• Custom Hardware– Oracle

• Custom Software– Facebook + MySQL

Page 7: Sharding - Seoul 2012

Data Store Scalability Today

• MongoDB auto-sharding available in 2009

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

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

Page 8: Sharding - Seoul 2012

Why shard?

Page 9: Sharding - Seoul 2012

Working Set Exceeds Physical Memory

Page 10: Sharding - Seoul 2012

Read/Write Throughput Exceeds I/O

Page 11: Sharding - Seoul 2012

MongoDB's approach to sharding

Page 12: Sharding - Seoul 2012

Partition data based on ranges

• 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: Sharding - Seoul 2012

Distribute data in chunks across nodes

• Initially 1 chunk

• Default max chunk size: 64mb

• MongoDB automatically splits & migrates chunks when max reached

Page 14: Sharding - Seoul 2012

MongoDB manages data

• Queries routed to specific shards

• MongoDB balances cluster

• MongoDB migrates data to new nodes

Page 15: Sharding - Seoul 2012

MongoDB Auto-Sharding

• Minimal effort required– Same interface as single mongod

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

Page 16: Sharding - Seoul 2012

Architecture

Page 17: Sharding - Seoul 2012

Data stored in shard

• Shard is a node of the cluster

• Shard can be a single mongod or a replica set

Page 18: Sharding - Seoul 2012

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

3)– Two phase commit (not a replica set)

Config server stores meta data

Page 19: Sharding - Seoul 2012

MongoS manages the data

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

Page 20: Sharding - Seoul 2012

Sharding infrastructure

Page 21: Sharding - Seoul 2012

Configuration

Page 22: Sharding - Seoul 2012

Example cluster setup

• 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: Sharding - Seoul 2012

Start the config server

• “mongod --configsvr”• Starts a config server on the default port (27019)

Page 24: Sharding - Seoul 2012

Start the mongos router

• “mongos --configdb <hostname>:27019”• For 3 config 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: Sharding - Seoul 2012

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: Sharding - Seoul 2012

Add the shard

• On mongos: “sh.addShard(‘<host>:27018’)”• Adding a replica set:

“sh.addShard(‘<rsname>/<seedlist>’)• In 2.2 and later can use

sh.addShard(‘<host>:<port>’)

Page 27: Sharding - Seoul 2012

Verify that the shard was added

• db.runCommand({ listshards:1 })• { "shards" :

[ { "_id”: "shard0000”, "host”: ”<hostname>:27018” } ],

"ok" : 1 }

Page 28: Sharding - Seoul 2012

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: Sharding - Seoul 2012

Mechanics

Page 30: Sharding - Seoul 2012

Partitioning

• Remember it's based on ranges

Page 31: Sharding - Seoul 2012

Chunk is a section of the entire range

Page 32: Sharding - Seoul 2012

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)• If split creates too large of a discrepancy of chunk

count across cluster a balancing round starts

Page 33: Sharding - Seoul 2012

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 34: Sharding - Seoul 2012

Acquiring the Balancer Lock

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

- use config- db.locks.find({ _id: “balancer” })

Page 35: Sharding - Seoul 2012

Moving the chunk

• The mongos sends a “moveChunk” command to source shard

• The source shard then notifies destination shard• The destination claims the chunk shard-key range• Destination shard starts pulling documents from

source shard

Page 36: Sharding - Seoul 2012

Committing Migration

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

Page 37: Sharding - Seoul 2012

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

• Mongos releases the balancer lock after old chunks are deleted

Page 38: Sharding - Seoul 2012

Routing Requests

Page 39: Sharding - Seoul 2012

Cluster Request Routing

• Targeted Queries

• Scatter Gather Queries

• Scatter Gather Queries with Sort

Page 40: Sharding - Seoul 2012

Cluster Request Routing: Targeted Query

Page 41: Sharding - Seoul 2012

Routable request received

Page 42: Sharding - Seoul 2012

Request routed to appropriate shard

Page 43: Sharding - Seoul 2012

Shard returns results

Page 44: Sharding - Seoul 2012

Mongos returns results to client

Page 45: Sharding - Seoul 2012

Cluster Request Routing: Non-Targeted Query

Page 46: Sharding - Seoul 2012

Non-Targeted Request Received

Page 47: Sharding - Seoul 2012

Request sent to all shards

Page 48: Sharding - Seoul 2012

Shards return results to mongos

Page 49: Sharding - Seoul 2012

Mongos returns results to client

Page 50: Sharding - Seoul 2012

Cluster Request Routing: Non-Targeted Query with Sort

Page 51: Sharding - Seoul 2012

Non-Targeted request with sort received

Page 52: Sharding - Seoul 2012

Request sent to all shards

Page 53: Sharding - Seoul 2012

Query and sort performed locally

Page 54: Sharding - Seoul 2012

Shards return results to mongos

Page 55: Sharding - Seoul 2012

Mongos merges sorted results

Page 56: Sharding - Seoul 2012

Mongos returns results to client

Page 57: Sharding - Seoul 2012

Shard Key

Page 58: Sharding - Seoul 2012

Shard Key

• Choose a field common used in queries

• Shard key is immutable

• Shard key values are immutable

• Shard key requires index on fields contained in key

• Uniqueness of `_id` field is only guaranteed within individual shard

• Shard key limited to 512 bytes in size

Page 59: Sharding - Seoul 2012

Shard Key Considerations

• Cardinality

• Write distribution

• Query isolation

• Data Distribution

Page 60: Sharding - Seoul 2012

Chief Evangelist, 10gen

Steve Francia

#MongoSeoul

Thank You