Monday, September 24, 2012

Mongodb replica set error: "errmsg" : "can't currently get local.system.replset config from self or any seed (EMPTYUNREACHABLE)"

There is an error in the mongodb replica set URL for localhost, replace with locahost.localdomain

When following the replica set instructions for a single machine at: okbook.mongodb.org/operations/convert-replica-set-to-replicated-shard-cluster/

You may find an error when trying to setup the replica set.

"errmsg" : "can't currently get local.system.replset config from self or any seed (EMPTYUNREACHABLE)"

The problem here is they changed the code to disallow mixing of localhost and ip addresses. You have to change localhost to localhost.localdomain.

There are many ways to configure and initialize the replica set. The master for the replica set is first one you start. Using the commands as listed on the mongo page sets up 3 replica sets with the localhost:10001 as the master since this is the first mongod command to be invoked.


bin/mongod --dbpath /data/example/firstset1 --port 10001 --replSet firstset --oplogSize 700 --rest


bin/mongod --dbpath /data/example/firstset2 --port 10002 --replSet firstset --oplogSize 700 --rest


$ bin/mongod --dbpath /data/example/firstset3 --port 10003 --replSet firstset --oplogSize 700 --rest

After the above 3 commands we still dont have a replica set. We have to connect to localhost:10001 and initiate the replica set. There are equivalent commands all of which can be run from the mongo client connected to localhost:10001/admin:


> db.runCommand({"replSetInitiate" : {"_id" : "firstset", "members" : [{"_id" : 1, "host" : "localhost:10001"}, {"_id" : 2, "host" : "localhost:10002"}, {"_id" : 3, "host" : "localhost:10003"}]}})


The problem is the above command doesn't work.

When you go to url: localhost:11002 (NOTE PORT increased by 1000) you see:


05:50:47 [rsStart] couldn't connect to dc-pc:10003: couldn't connect to server dc-pc:10003

and you get error messages like: 

"info" : "try querying local.system.replset to see current configuration",


TO fix: run the command db.reconfig(config) where config is set as: 

config = {_id: 'firstset', members: [
{_id: 0, host: 'localhost:10001'},{_id: 1, host: 'localhost.localdomain:10002'},
{_id:2,host:'localhost.localdomain:10003'}]
}


After running this command(my replica set was called rs0 instead of firstset):

rs0:PRIMARY> config = {_id: 'rs0', members: [ {_id: 0, host: 'localhost.localdomain:10001'},{_id: 1, host: 'localhost.localdomain:10002'}, {_id:2,host:'localhost.localdomain:10003'}] }

rs0:PRIMARY> rs.reconfig(config)
{ "ok" : 1 }


Then do an rs.status() and verify the master can see/ping all 3 replica set members: 

rs0:PRIMARY> rs.status()
{
"set" : "rs0",
"date" : ISODate("2012-09-24T12:50:50Z"),
"myState" : 1,
"members" : [
{
"_id" : 0,
"name" : "localhost.localdomain:10001",
"health" : 1,
"state" : 1,
"stateStr" : "PRIMARY",
"uptime" : 35048,
"optime" : Timestamp(1348491046000, 1),
"optimeDate" : ISODate("2012-09-24T12:50:46Z"),
"self" : true
},
{
"_id" : 1,
"name" : "localhost.localdomain:10002",
"health" : 1,
"state" : 5,
"stateStr" : "STARTUP2",
"uptime" : 4,
"optime" : Timestamp(0, 0),
"optimeDate" : ISODate("1970-01-01T00:00:00Z"),
"lastHeartbeat" : ISODate("2012-09-24T12:50:50Z"),
"pingMs" : 0,
"errmsg" : "initial sync need a member to be primary or secondary to do our initial sync"
},
{
"_id" : 2,
"name" : "localhost.localdomain:10003",
"health" : 1,
"state" : 5,
"stateStr" : "STARTUP2",
"uptime" : 4,
"optime" : Timestamp(0, 0),
"optimeDate" : ISODate("1970-01-01T00:00:00Z"),
"lastHeartbeat" : ISODate("2012-09-24T12:50:50Z"),
"pingMs" : 0,
"errmsg" : "initial sync need a member to be primary or secondary to do our initial sync"
}
],
"ok" : 1
}


Then go back to the REST interface for the slaves and verify: 

   05:50:48 [rsStart] trying to contact localhost.localdomain:10001
           05:50:48 [rsStart] replSet I am localhost.localdomain:10003
           05:50:48 [rsStart] replSet got config version 2 from a remote, saving locally
           05:50:48 [rsStart] replSet info saving a newer config version to local.system.replset
           05:50:48 [rsStart] replSet saveConfigLocally done
           05:50:48 [rsStart] replSet STARTUP2
           05:50:48 [rsSync] replSet initial sync pending
           05:50:48 [rsSync] replSet initial sync need a member to be primary or secondary to do our initial sync
           05:50:50 [rsHealthPoll] replSet member localhost.localdomain:10001 is up
           05:50:50 [rsHealthPoll] replSet member localhost.localdomain:10001 is now in state PRIMARY
           05:50:50 [rsHealthPoll] replSet member localhost.localdomain:10002 is up
           05:50:50 [rsHealthPoll] replSet member localhost.localdomain:10002 is now in state STARTUP2
           05:51:04 [rsSync] replSet initial sync pending
           05:51:04 [rsSync] replSet syncing to: localhost.localdomain:10001
           05:51:04 [rsSync] replSet initial sync drop all databases
           05:51:04 [rsSync] replSet initial sync clone all databases
           05:51:04 [rsSync] replSet initial sync cloning db: config
           05:51:04 [rsSync] replSet initial sync cloning db: admin
           05:51:17 [rsSync] replSet initial sync cloning db: system
           05:51:17 [rsSync] replSet initial sync data copy, starting syncup
           05:51:17 [rsSync] replSet initial sync building indexes
           05:51:17 [rsSync] replSet initial sync cloning indexes for : config
           05:51:17 [rsSync] replSet initial sync cloning indexes for : admin
           05:51:17 [rsSync] replSet initial sync cloning indexes for : system
           05:51:17 [rsSync] replSet initial sync query minValid
           05:51:17 [rsSync] replSet initial sync finishing up
           05:51:17 [rsSync] replSet set minValid=50605726:1
           05:51:17 [rsSync] replSet RECOVERING
           05:51:17 [rsSync] replSet initial sync done
           05:51:18 [rsHealthPoll] replSet member localhost.localdomain:10002 is now in state RECOVERING
           05:51:18 [rsBackgroundSync] replSet syncing to: localhost.localdomain:10001
           05:51:18 [rsSyncNotifier] replset setting oplog notifier to localhost.localdomain:10001
           05:51:19 [rsSync] replSet SECONDARY
           05:51:20 [rsHealthPoll] replSet member localhost.localdomain:10002 is now in state SECONDARY









No comments:

Post a Comment