function printPrimary { count=`mongo --quiet --port 3001 mongo/functions.js| wc -l` while [ $count -lt 1 ] do echo "No primary yet: $count" sleep 2 count=`mongo --quiet --port 3001 mongo/functions.js| wc -l` done port=`mongo --quiet --port 3001 mongo/functions.js | cut -d ':' -f2 ` echo "port is on $port" } # If restarting, kill the mogo processes and then do rm -rf mongo/d1 mongo/d2 mongo/d3 mongo/logs # Setup 3 directories: mkdir -p mongo/d1 mongo/d2 mongo/d3 mongo/logs # If not AWS, ignore. sudo -s -- bash -c ' echo "127.0.0.1 localhost ">> /etc/hosts ' # Start once mongo instance mongod --dbpath mongo/d1 --port 3001 --oplogSize 100 --wiredTigerCacheSizeGB 0.25 --replSet r --bind_ip 127.0.0.1 > mongo/logs/1.log 2>&1 & sleep 2 # In the mongo shell mongo --port 3001 --eval "rs.initiate( { _id: 'r', version: 1, members: [ {_id :0, host: 'localhost:3001' } ] } )" # Start and add two other replica sets mongod --dbpath mongo/d2 --port 3002 --oplogSize 100 --wiredTigerCacheSizeGB 0.25 --replSet r --bind_ip 127.0.0.1 > mongo/logs/2.log 2>&1 & mongod --dbpath mongo/d3 --port 3003 --oplogSize 100 --wiredTigerCacheSizeGB 0.25 --replSet r --bind_ip 127.0.0.1 > mongo/logs/3.log 2>&1 & sleep 2 mongo --port 3001 --eval "rs.add('localhost:3002')" sleep 2 mongo --port 3001 --eval "rs.add('localhost:3003')" sleep 2 # Look at the status mongo --port 3001 --eval "rs.status()" echo "Let us sleep a really long time, 30 seconds" sleep 30 /home/mark/temp# mongo --port 3001 --eval "rs.status()" | grep -i state # Lets setup the functions. echo " cfg = rs.conf(); cfg.members[0].priority = 3; cfg.members[1].priority = 2; cfg.members[2].priority = 1; rs.reconfig(cfg); " >> mongo/reconfig.js echo ' function pcheck() { s = rs.status() s.members.forEach( function(myDoc) { if (myDoc.stateStr=="PRIMARY") { print( myDoc.stateStr + " " + myDoc.name ) } } ); } pcheck() ' > mongo/functions.js # Lets print out the hosts in the replica set mongo --port 3001 --eval "rs.status()" | grep name # Remove a host mongo --port 3001 --eval "rs.remove('localhost:3003')" sleep 1 mongo --port 3001 --eval "rs.status()" | grep name # Add host back in mongo --port 3001 --eval "rs.add('localhost:3003')" sleep 2 # Add print out who is primary and secondary mongo --port 3001 --eval "rs.status()" | egrep 'name|stateStr' # Redo the prorities, but in practice its no promise for stepdowns. cat mongo/reconfig.js | mongo --port 3001 mongo --port 3001 --eval "rs.conf()" | egrep 'host|priority' mongo --port 3001 --eval "rs.stepDown({secondaryCatchUpPeriodSecs: 10 })" sleep 5 printPrimary mongo --port 3001 --eval "rs.status()" | egrep 'name|stateStr' # Not let's force it back to the first one --- this is bad in production. mongo --quiet --port 3001 --eval "rs.remove('localhost:3003')" sleep 5 printPrimary mongo --quiet --port 3001 --eval "rs.remove('localhost:3002')" sleep 5 printPrimary mongo --quiet --port 3001 --eval "rs.status()" | egrep 'name|stateStr' # Now add them back in mongo --quiet --port 3001 --eval "rs.add('localhost:3002')" sleep 2 mongo --quiet --port 3001 --eval "rs.add('localhost:3003')" sleep 2 # Look at the status mongo --quiet --port 3001 --eval "rs.status()" | egrep 'name|stateStr' echo " cfg = rs.conf(); cfg.members[0].priority = 3; cfg.members[1].priority = 2; cfg.members[2].priority = 1; rs.reconfig(cfg); " > mongo/reconfig.js cat mongo/reconfig.js | mongo --port 3001 --quiet cat mongo/reconfig.js | mongo --port 3002 --quiet cat mongo/reconfig.js | mongo --port 3003 --quiet
We will also make a capped collection.
#Make sure you have Replication_set.txt done a nd 3 mongos are running. # We are going to make a 6 cluster, with a non failover slave, arbiter, and hidden. # We will also make a capped collection. # for i in ${PIPESTATUS[@]}; do echo $i; done margs=" --oplogSize 100 --wiredTigerCacheSizeGB 0.25 --replSet r " function resetRep { echo "Trying reset replication configuration." check=0 cat mongo/reconfig.js | mongo --port 3001 for i in ${PIPESTATUS[@]}; do if [ $i -gt 0 ]; then let check=$check+1; fi done count=1 while [ $check -gt 0 ]; do echo "Reconfig failed, sleeping 10 seconds, and retrying, count $count" check=0 cat mongo/reconfig.js | mongo --port 3001 for i in ${PIPESTATUS[@]}; do if [ $i -gt 0 ]; then let check=$check+1; fi done let count = $count+1 done if [ $check -gt 0 ]; then echo "Could not reconfigure replication, add more sleep time." exit fi } function checkCommand { error=$? if [ $error -gt 0 ]; then echo "Command did not work, aborting" exit fi } #------------------------- killall mongod sleep 2 killall -9 mongod sleep 5 c=`ps auxw | grep mongod | grep -v grep | wc -l` if [ $c -gt 0 ] ; then echo "not all mongod processes killed, aborting script" fi; rm -rf mongo/logs for i in 1 2 3 4 5 6; do rm -rf mongo/d$i done # Setup directories: mkdir -p mongo/d1 mongo/d2 mongo/d3 mongo/logs mongo/d4 mongo/d5 mongo/d6 echo "Starting 3 servers, need 1 minute" mongod $margs --dbpath mongo/d1 --port 3001 > mongo/logs/1.log 2>&1 & mongod $margs --dbpath mongo/d2 --port 3002 > mongo/logs/2.log 2>&1 & mongod $margs --dbpath mongo/d3 --port 3003 > mongo/logs/3.log 2>&1 & sleep 15 mongo --port 3001 --eval "rs.initiate( { _id: 'r', version: 1, members: [ {_id :0, host: 'localhost:3001' } ] } )" checkCommand sleep 5 mongo --port 3001 --eval "rs.add('localhost:3002')" checkCommand sleep 5 mongo --port 3001 --eval "rs.add('localhost:3003')" checkCommand sleep 30 mongo --port 3001 --eval "rs.status()" | egrep 'name|stateStr' checkCommand sleep 5 # Lets setup the functions. echo " cfg = rs.conf(); cfg.members[0].priority = 3; cfg.members[1].priority = 2; cfg.members[2].priority = 1; rs.reconfig(cfg); " > mongo/reconfig.js resetRep echo "Adding server 4" mongod $margs --dbpath mongo/d4 --port 3004 > mongo/logs/4.log 2>&1 & sleep 5 mongo --port 3001 --eval "rs.add({ host: 'localhost:3004', priority: 0})" echo "Adding server 5" mongod $margs --dbpath mongo/d5 --port 3005 > mongo/logs/5.log 2>&1 & sleep 5 mongo --port 3001 --eval "rs.addArb('localhost:3005')" echo "Adding server 6" mongod $margs --dbpath mongo/d6 --port 3006 > mongo/logs/6.log 2>&1 & sleep 5 mongo --port 3001 --eval "rs.add({ host: 'localhost:3006', hidden: 0, priority: 0 })" echo "Sleeping 20 seconds to let everything catch up" #sleep 20 mongo --port 3001 --eval "rs.status()" | egrep 'name|stateStr' sleep 1 # Lets setup the functions. echo " cfg = rs.conf(); cfg.members[0].priority = 3; cfg.members[1].priority = 2; cfg.members[2].priority = 1; cfg.members[3].priority = 1; cfg.members[4].priority = 1; cfg.members[5].priority = 0; cfg.members[5].hidden = true; cfg.members[5].secondaryDelaySecs = 10; rs.reconfig(cfg); " > mongo/reconfig.js resetRep sleep 10 echo "Working with collections" # Lets add some data. mongo --port 3001 --eval "db.Tcapped.drop();" test mongo --port 3001 --eval "db.createCollection( 'Tcapped', { capped: true, size: 10 } )" test echo " function fillData() { db = db.getSiblingDB('test') db.no.insert({value: 1}); db.no.drop(); for( var i = 0; i < 10; i++ ) { db.no.insert( {value: i } ); } } fillData() " > mongo/fill.js mongo --port 3001 test mongo/fill.js # Should be 1000 entries mongo --quiet --port 3001 --eval "db.no.count()" test # Make it so we can connect to the secondaries for reads. # We won't affect 2, will will make it so 3,4 and 6 are readable # 2 should not be readable. # We will issue the same command to the arbiter for fun to see what happens. # In theory the command will work on the arbiter, but means nothing # This should fail mongo --quiet --port 3002 --eval "db.no.count()" test # This should work mongo --quiet --port 3003 --eval "rs.secondaryOk(); db.no.count()" test # This should work mongo --quiet --port 3004 --eval "rs.secondaryOk(); db.no.count()" test # This should fail mongo --quiet --port 3005 --eval "rs.secondaryOk(); db.no.count()" test # Refill the data. mongo --quiet --port 3001 --eval "rs.secondaryOk(); db.dropDatabase()" test sleep 10 mongo --quiet --port 3001 mongo/fill.js # What there's no data? for i in 1 2 3 4 6 7 8 9 10 11 12; do sleep 1 echo "count $i" mongo --quiet --port 3006 --eval "rs.secondaryOk(); db.no.count()" test done #Verify the collection in capped # and list the first and last entry in the collection. mongo --port 3001 --eval "db.Tcapped.drop();" test mongo --port 3001 --eval "db.createCollection( 'Tcapped', { capped: true, size: 10 } )" test mongo --port 3001 --eval "for( var i = 0; i < 20; i++ ) { db.Tcapped.insert( {value: i } ); } " mongo --port 3001 --eval " db.Tcapped.createIndex({ "value": 1 }, { sparse: true, expireAfterSeconds: 360000 }) " mongo --quiet --port 3001 --eval "rs.secondaryOk(); db.capped.isCapped()" test echo "first entry" mongo --quiet --port 3001 --eval "db.Tcapped.find().sort({_id:1}).limit(1);" test echo "last entry" mongo --quiet --port 3001 --eval "db.Tcapped.find().sort({_id:-1}).limit(1);" test