mongodb database replication

Post on 28-Jul-2015

501 Views

Category:

Engineering

2 Downloads

Preview:

Click to see full reader

TRANSCRIPT

Database Replication

valikhani@sirangweb.com@mehdivk

Mehdi Valikhani

Replication

Process of keeping IDENTICAL COPY of your data on different servers.

Replication offersMinimum Downtimein case of hardware failure, software failure or maintenance

Replication is highly recommended for all databases in production from the very first day.

Replica SetMongoDB’s Terminology for Replication

A replica set is a group of servers with one primary, the server taking client requests, and multiple secondaries, servers that keep copies of the primary’s data.

Give A Go To MongoDB’s Replica SetIn60 Seconds!

#ToBeTriedOnlyAtHome

Step 1: Setup Replica Set

$: mongo --nodb

$: myReplica = new ReplSetTest({nodes: 3});

$: myReplica.startSet();

$: myReplica.initiate();

Congratulations!3 member of replica set running on ports 31000, 31001 and 31002

Step 2: Connect To Primary

$: mongo --port 31000

testReplSet:PRIMARY> use surryhills_db

testReplSet:PRIMARY> db.offices.insert({name: ‘MongoDB’});

testReplSet:PRIMARY> show dbs

testReplSet:PRIMARY> show collections

testReplSet:PRIMARY> db.offices.find().pretty()

Pro Tip :] Auto Format Query Response

Add DBQuery.prototype._prettyShell = true;to your ~/.mongorc.js

Step 3: Connect To A Secondary

$: mongo --port 31001

testReplSet:SECONDARY> db.slaveOk()

testReplSet:SECONDARY> show dbs

testReplSet:SECONDARY> use surryhills_db

testReplSet:SECONDARY> show collections

testReplSet:SECONDARY> db.offices.find()

Step 4: Shutdown Replica Set

$: myReplica.stopSet()

Setup Your Replica SetPart 1: Run replica members

$: mongod --port 31000 --fork --logpath ./path/to/log --dbpath /path/to/srv1 --replSet myReplica

$: mongod --port 31001 --fork --logpath ./path/to/log --dbpath /path/to/srv2 --replSet myReplica

$: mongod --port 31002 --fork --logpath ./path/to/log --dbpath /path/to/srv3 --replSet myReplica

Setup Your Replica SetPart 2: Configure the set

$: mongo --port 31000

$: rs.initiate();

$: rs.add(‘my-host:31001’);

$: rs.add(‘my-host:31002’);

Setup Your Replica SetPart 2: Example Configuration$: rs.config();{ "_id" : "myReplica",

"version": 3, "members" : [ { "_id" : 0, "host" : "my-host:31000" }, { "_id" : 1, "host" : "my-host:31001" }, { "_id" : 2, "host" : "my-host:31002" } ]}

Auto Connect To Current Primary

$: mongo --host myReplica/my-host:31000,my-host:31001,my-host:31002

Replica Set Good To Knows

1. Always start your instance with `replSet`

2. You can’t initiate a replica set with more than one member with existing data on it.

3. If one of set members has data, you must run rs.initiate() against that member

4. `system.replset` collection on `local` database of all members contains set configuration.

5. Replica sets can have up to 50 members, 7 voting

6. By default, MongoDB reads from primary

Replica Set ReconfigurationAdd new member

$: mongo --port 31000 # current primary

$: rs.add(‘my-host:31003’) # accepts object as well.

Replica Set ReconfigurationRemove existing member

$: mongo --port 31000 # current primary

$: rs.remove(‘my-host:31003’)

Replica Set ReconfigurationUpdate existing member

$: mongo --port 31000 # current primary

$: config = rs.config()

$: config.members[2].priority = 0;

$: rs.reconfig(config);

How Replication WorksMongoDB keeps a log of every write operations that primary does in database

Logs are saved in “oplog.rs” collection of “local” db

Secondaries apply changes by reading from oplog.rs and applieing to their data

Secondaries maintain their own “oplog.rs” as well.

“oplog.rs” Facts“oplog.rs” is a capped collection which means it can save limited amount of operation logs.

Bulk operations fill “oplog” quickly. A bulk removal of 1K documents adds 1K documents to “oplog”

It’s important to have a “oplog.rs” to keep logs for atleast last 24 hrs.

“Stale” Secondary :(Secondary misses a copy of last operation it applied in syncing source.

Secondary queries other members to find another source to continue syncing.

Secondary missed some operations permanently. Admin must resyncs from scratch.

HeartbeatMembers PING each other every 2 seconds.

Members should reply within 10 seconds otherwise they’re counted as unreachable.

Change in replica set configuration

Current primary steps down

Replica Set ElectionWhen It Happens?

Current primary is unreachable

MajorityThe Single Most Important Fact About Replica Set

More than half of All Voting Members in the set must be reachable.

You need a majority of voting members to elect a primary.

A primary can only stay primary so long as it can reach a majority of voting members.

Majority

Replica Set with two members.

Three Common Replica Set Design Mistakes :(

Even number of members in two data center.

A set with more than one arbiter

Keep a majority of members in preferred data center and rest in the other one.

Two Common Replica Set Design Patterns :)

Keep even number of members in two data center and a tie breaker in third one.

Meet Arbiter Budget Friendly Member Of Replica Set

Does not hold data

It’s a lightweight process

Can vote on elections

Start An Arbiter Process

$: mongod --port 31005 --replSet myReplica --nojournal --smallfiles

Arbiter does not save data, no need for journaling

Don’t waste disk space and use --smallfiles

Add An Arbiter To Replica Set

$: rs.addArb(‘arbiter-host-name:port’);

ArbiterGood To Know

You can’t change an arbiter to non-arbiter member

If possible, use normal members instead of arbiters

At most you need one arbiter in your set

Do not add an arbiter to a set with odd members

Replica SetUseful Commands

$: rs.config()

$: rs.reconfig()

$: rs.isMaster()

$: rs.status()

$: rs.stepDown()

Rollback :(Primary does a write and goes down before at least one secondary has a chance to replicate the write.

RollbackMain Reasons

Network Partitions

Different write rates between primary and secondary

Rollback Process

1. Former primary reverts write operations

2. Saves affected documents into /rollback directory

3. Admin browses documents using mongorestore

4. Admin applies changes to the current primary

DurabilityWrite Concerns And Replica Set

1. Unacknowledged

2. Acknowledged

3. Journaled

4. Replica Acknowledged

5. Custom Writer Concern

Improve Durabilitydb.runCommand({getLastError:1}) options

Returns the error status of the preceding write operation on the current connection.

j: boolean

w: number | majority | custom role

wtimeout: number (milliseconds)

fsync: boolean

“wtimeout” GOOD TO KNOW

MongoDB does not “rollback” or ”undo modifications” made before the “wtimeout” interval expired.

Custom Write ConcernsStep 1: Tags

$: config = rs.config()

$: config.members[0].tags = {dc: ‘dc-1’};

$: config.members[3].tags = {dc: ‘dc-2’};

$: rs.reconfig(config);

Custom Write ConcernsStep 2: Custom Last Error Mode

$: config = rs.config()

$: config.settings.lastErrorModes = [{

“each-dc”: {dc: 2}

}];

$: rs.reconfig(config);

Custom Write ConcernsStep 3: Use it!

$: db.runCommand({getLastError:1, w: ‘each-dc’})

Replica Set & Mixed Storage Engines

You can have both WiredTiger & MMAPv1

● Due to migration● Due to different use cases

Keen To Go Further?

Register for M102: MONGODB FOR DBAS course!

Starts tomorrow!It’s awesome!

https://university.mongodb.com/courses/M102/about

Keen To Go Further?docs.mongodb.org/manual/replication

MongoDBThe Definite Guide

Stay In Touch● Follow me on Twitter

@mehdivk

● Add me to your Linkedin network https://au.linkedin.com/in/valikhani

● Subscribe to my blogblog.mehdivk.net

● Send me an emailvalikhani@sirangweb.com

Thank You!

top related