how to replicate mongodb multiple instance on same host - mongodb

I am running 3 MongoDB instance on local machine and also trying to create its replica set.
mongod.exe --port 2021 --dbpath C:\mongodb\data --replSet rs0
mongod.exe --port 2022 --dbpath D:\mongodb\data --replSet rs0
mongod.exe --port 2023 --dbpath E:\mongodb\data --replSet rs0
after this i am running the mongo command for port 2021 like
mongo.exe --port 2021
then i am using these command like
rs.initiate()
rs.add("127.0.0.1:2022");
But it is not adding these instance for replica set and returns me the error
errmsg" : "exception: can't use localhost in repl set member names except when using it for all members",
I just want to know can i not add mongodb instance on 127.0.0.1 with different port for the replica.
I am new to mongodb and stuck in solving these issues.

I've had this happen before and agree with thelok's suggestion. After you've read the other answer he linked to, check your rs after immediately you execute the rs.initiate() and before you try to add the second member. How is the primary member referred to? Is it by the host name, the FQDN, or another ip address other than local (127.0.0.1)?
Use that same name when executing rs.add(:).
That's how it worked for me.

Related

How the lock file is shared among the various mongods

I am trying to setup a shard and replica set.
My assumption procedure be like this :
Start a replica set (let it be only one, just for testing)
mongo then initiate replica
Start a config server (again let it be one, just for testing)
Start a shard server (again let that be just one)
Add the shard and enable sharding via mongo
What i did :
mongod --replSet rs0 --dbpath data/rs0-0 --unixSocketPrefix data/rs0-0
mongo then rs.initiate()
mongod --configsvr --dbpath data/rs0-0 --unixSocketPrefix data/rs0-0
-- now stucked at step 3.
Error i find is
2017-05-22T20:00:13.857+0530 [initandlisten] exception in initAndListen: 10310 Unable to lock file: data/rs0-0/mongod.lock. Is a mongod instance already running?, terminating
What i have tried :
i have tried with different directories for --unixSocketPrefix options, but each time it hits data/rs0-0/mongod.lock the same file. So it did not worked
It seems simple issue but unable to figure out how the lock file is shared among the various mongods (whether it be config server, or replica set, or shard server)
I am on mongodb 2.6.12
You need to start mongod and config server with different dbpath options.
You can follow the following steps:
mongod --replSet rs0 --dbpath data/rs0-0 --unixSocketPrefix data/rs0-0
or
mongod --replSet rs0 --dbpath data/rs0-0
mongo then rs.initiate()
mkdir -p /data/configdb (grant required permission recursively)
mongod --configsvr --dbpath /data/configdb --port 27019

How to get user list from replicaset instance?

I have setup a replica set which includes three members. Below is the three instances launch command:
501 36057 1 0 4:22pm ?? 0:05.02 mongod --replSet replset --dbpath /Users/joey/tmp/replica/replset/rs1/db --logpath /Users/joey/tmp/replica/replset/rs1/mongod.log --port 28017 --logappend --fork
501 36060 1 0 4:22pm ?? 0:04.82 mongod --replSet replset --dbpath /Users/joey/tmp/replica/replset/rs2/db --logpath /Users/joey/tmp/replica/replset/rs2/mongod.log --port 28018 --logappend --fork
501 36063 1 0 4:22pm ?? 0:04.86 mongod --replSet replset --dbpath /Users/joey/tmp/replica/replset/rs3/db --logpath /Users/joey/tmp/replica/replset/rs3/mongod.log --port 28019 --logappend --fork
When I connect to one of this member and run db.getUsers(), I will get an empty array as below:
$ mongo --port 28017
MongoDB shell version v3.4.0
connecting to: mongodb://127.0.0.1:28017/
MongoDB server version: 3.4.0
replset:PRIMARY> db.getUsers()
[ ]
I wander how to get user list in replicaset.
When I connect to one of this member and run db.getUsers(), I will get an empty array
This indicates you haven't set up any users yet. See Enable Authentication in the MongoDB manual.
Below is the three instances launch command
Your launch commands don't include the --keyfile parameter required to enable access control with a replica set. See Enforce Keyfile Access Control in a Replica Set.
For a full reference of recommended security measures (and links to relevant tutorials), see: MongoDB Security Checklist.

Error adding new shard from mongos shell

I'm learning setting up sharding in mongoDB, I plan to have 1 configsvr, 1 shardsvr and 1 mongos
I started the mongods using
mongod --configsvr --replSet foo --dbpath e:\mongodb\configsvr --port 27019
mongod --shardsvr --replSet foo --dbpath e:\mongodb\shardsvr --port 27018
I also connected to each mongods using mongo --port 27019 and mongo --port 27018 and performed rs.initiate() on each
I so started the mongos using
mongos --configdb foo/MY-PC:27019
I finally connected to the mongos using mongo I got an error after using sh.addShard('foo/MY-PC:27018')
Error
{
"ok" : 0,
"errmsg" : "Cannot add foo/MY-PC:27018 as a shard since it is part of a config server replica set",
"code" : 96
}
Please help to solve this error
Thanks all
You set foo/MY-PC as a replica to another mongo server! it's data gonna be copy of that server!
Replication is copying a server's data in an other server so if something happen to it, you wouldn't loose your data! while Sharding is breaking your data into portions so you can speed up your data access speed by accessing different servers at the same time.
So if you shard your data in two portion Data-A and Data-B and your Primary replica server keeps Data-A, then foo/MY-PC would hold the same portion(Data-A) only!

How start Mongo Instance in sharded cluster

I want to deploy a sharded cluster for this i using MongoDB manual.
first i created 3 config servers.
mongod --configsvr --dbpath /data/configdb1 --port 27019 ,
mongod --configsvr --dbpath /data/configdb2 --port 27019 ,
mongod --configsvr --dbpath /data/configdb3 --port 27019
But in second step to Start the mongos Instances i find a command like
mongos --configdb cfg0.example.net:27019,cfg1.example.net:27019,cfg2.example.net:27019
but i can't understand the meaning of
cfg0.example.net
cfg1.example.net
cfg2.example.net
So Please explain meaning of above command and how can i use this according my hostname?
Please check "Deploy a Sharded Cluster", cfg[0-3].example.net means hostnames of 3 config servers, each of mongos server should be started with all config servers configured.
This should solve your issue
[ne#server1~]$mongos configdb"repl/localhost:57040,localhost:57041,localhost:57042" --fork --logpath log.mongos0 --port 27200
about to fork child process, waiting until server is ready for connections.
forked process: 2467
Hope it helps!!!
These are are the config servers connected to the the mongos server

why can't I use IP address of locally running mongod server to add it to mongodb replication set

I am having 3 mongod servers running locally on different ports as with below command
mongod.exe --port 27017 --replSet rs0 --dbpath C:\data\db1 --smallfiles --oplogSize 128
mongod.exe --port 27018 --replSet rs0 --dbpath C:\data\db2 --smallfiles --oplogSize 128
mongod.exe --port 27019 --replSet rs0 --dbpath C:\data\db3 --smallfiles --oplogSize 128
this will start three mongoDB server locally.
Now to to configure the replication set I used the following commands
rsconf = { _id : rs0,
members: [
{_id:1, host:"localhost:27017"}
]
}
then to start
rs.initiate(rsconfig)
now to add other members
rs.add({_id:2, host: "localhost:27018"})
works fine however the following
rs.add({_id:2, host: "10.212.71.116"})
throws an exception -
{
"errmsg" : "exception: can't use localhost in repl set member names exce
pt when using it for all members",
"code" : 13393,
"ok" : 0
}
I am newbie to mongoDB hence it seems more proper for me to use IP address(for localhost) than localhost. Why is this so in mongoDB?
while going through documentation for mongodb sharding I found following statement
Because all components of a sharded cluster must communicate with each other over the network, there are special restrictions regarding the use of localhost addresses:
If you use either “localhost” or “127.0.0.1” as the host identifier, then you must use “localhost” or “127.0.0.1” for all host settings for any MongoDB instances in the cluster. This applies to both the host argument to addShard and the value to the mongos --configdb run time option. If you mix localhost addresses with remote host address, MongoDB will produce errors.
on page "http://docs.mongodb.org/manual/core/sharded-cluster-architectures/#sharding-requirements-infrastructure"
This implies that when you are in test environment and do not want to add hosts other than localhost then you can go with the approach of using localhost, otherwise prefer using IP address
I had the same problem. After rs.initiate() look at the me field in printed result of this command. It's the name of your computer. For me it was Apollo-17:27001 . Having this information add other 2 servers: >rs.add("Apollo-17:27002") etc. Ensure that everything is ok: in console you will see { "ok" : 1 } . That's all.