Deploy a Replica Set for Testing and Development
This procedure describes deploying a replica set in a development ortest environment. For a production deployment, refer to theDeploy a Replica Set tutorial.
This tutorial describes how to create a three-member replicaset from three existing mongod
instances running withaccess control disabled.
To deploy a replica set with enabled access control, seeDeploy Replica Set With Keyfile Authentication. If you wish to deploy areplica set from a single MongoDB instance, seeConvert a Standalone to a Replica Set. For moreinformation on replica set deployments, see the Replication andReplica Set Deployment Architectures documentation.
Overview
Three member replica sets provide enoughredundancy to survive most network partitions and other systemfailures. These sets also have sufficient capacity for many distributedread operations. Replica sets should always have an odd number ofmembers. This ensures that elections will proceed smoothly. For more aboutdesigning replica sets, see the Replication overview.
Requirements
For test and development systems, you can run your mongod
instances on a local system, or within a virtual instance.
Before you can deploy a replica set, you must install MongoDB oneach system that will be part of your replica set.If you have not already installed MongoDB, see the installation tutorials.
Each member must be able to connect to every other member. Forinstructions on how to check your connection, seeTest Connections Between all Members.
Considerations
Tip
When possible, use a logical DNS hostname instead of an ip address,particularly when configuring replica set members or sharded clustermembers. The use of logical DNS hostnames avoids configurationchanges due to ip address changes.
IP Binding
Starting in MongoDB 3.6, MongoDB binaries, mongod
andmongos
, bind to localhost by default. If thenet.ipv6
configuration file setting or the —ipv6
command line option is set for the binary, the binary additionally bindsto the localhost IPv6 address.
Previously, starting from MongoDB 2.6, only the binaries from theofficial MongoDB RPM (Red Hat, CentOS, Fedora Linux, and derivatives)and DEB (Debian, Ubuntu, and derivatives) packages bind to localhost bydefault.
When bound only to the localhost, these MongoDB 3.6 binaries can onlyaccept connections from clients (including the mongo
shell,other members in your deployment for replica sets and sharded clusters)that are running on the same machine. Remote clients cannot connect tothe binaries bound only to localhost.
To override and bind to other ip addresses, you can use thenet.bindIp
configuration file setting or the—bind_ip
command-line option to specify a list of hostnames or ipaddresses.
Warning
Before binding to a non-localhost (e.g. publicly accessible)IP address, ensure you have secured your cluster from unauthorizedaccess. For a complete list of security recommendations, seeSecurity Checklist. At minimum, considerenabling authentication andhardening network infrastructure.
For example, the following mongod
instance binds to boththe localhost and the hostname My-Example-Associated-Hostname
, which isassociated with the ip address 198.51.100.1
:
- mongod --bind_ip localhost,My-Example-Associated-Hostname
In order to connect to this instance, remote clients must specifythe hostname or its associated ip address 198.51.100.1
:
- mongo --host My-Example-Associated-Hostname
- mongo --host 198.51.100.1
In this test deployment, the three members run on the same machine.
Replica Set Naming
Important
These instructions should only be used for test ordevelopment deployments.
The examples in this procedure create a new replica set named rs0
.
If your application connects to more than one replica set, each setshould have a distinct name. Some drivers group replica setconnections by replica set name.
Procedure
Tip
When possible, use a logical DNS hostname instead of an ip address,particularly when configuring replica set members or sharded clustermembers. The use of logical DNS hostnames avoids configurationchanges due to ip address changes.
- Create the necessary data directories for each member by issuing acommand similar to the following:
- mkdir -p /srv/mongodb/rs0-0 /srv/mongodb/rs0-1 /srv/mongodb/rs0-2
This will create directories called “rs0-0”, “rs0-1”, and “rs0-2”, whichwill contain the instances’ database files.
- Start your
mongod
instances in their own shell windows by issuing the followingcommands:
Warning
Before binding to a non-localhost (e.g. publicly accessible)IP address, ensure you have secured your cluster from unauthorizedaccess. For a complete list of security recommendations, seeSecurity Checklist. At minimum, considerenabling authentication andhardening network infrastructure.
First member:
- mongod --replSet rs0 --port 27017 --bind_ip localhost,<hostname(s)|ip address(es)> --dbpath /srv/mongodb/rs0-0 --oplogSize 128
Second member:
- mongod --replSet rs0 --port 27018 --bind_ip localhost,<hostname(s)|ip address(es)> --dbpath /srv/mongodb/rs0-1 --oplogSize 128
Third member:
- mongod --replSet rs0 --port 27019 --bind_ip localhost,<hostname(s)|ip address(es)> --dbpath /srv/mongodb/rs0-2 --oplogSize 128
This starts each instance as a member of a replica set namedrs0
, each running on a distinct port, and specifies the path toyour data directory with the —dbpath
setting.If you are already using the suggested ports, select different ports.
The instances bind to both the localhost and the ip addressof the host.
The —oplogSize
setting reduces thedisk space that each mongod
instance uses. [1]This is ideal for testing and development deployments as it preventsoverloading your machine. For more information on this and otherconfiguration options, see Configuration File Options.
- Connect to one of your
mongod
instances through themongo
shell. You will need to indicate which instance byspecifying its port number. For the sake of simplicity and clarity,you may want to choose the first one, as in the following command;
- mongo --port 27017
- In the
mongo
shell, users.initiate()
toinitiate the replica set. You can create a replica setconfiguration object in themongo
shell environment, asin the following example:
- rsconf = {
- _id: "rs0",
- members: [
- {
- _id: 0,
- host: "<hostname>:27017"
- },
- {
- _id: 1,
- host: "<hostname>:27018"
- },
- {
- _id: 2,
- host: "<hostname>:27019"
- }
- ]
- }
replacing <hostname>
with your system’s hostname,and then pass the rsconf
file to rs.initiate()
asfollows:
- rs.initiate( rsconf )
- Display the current replica configurationby issuing the following command:
- rs.conf()
The replica set configuration object resembles the following:
- {
- "_id" : "rs0",
- "version" : 1,
- "protocolVersion" : NumberLong(1),
- "members" : [
- {
- "_id" : 0,
- "host" : "<hostname>:27017",
- "arbiterOnly" : false,
- "buildIndexes" : true,
- "hidden" : false,
- "priority" : 1,
- "tags" : {
- },
- "slaveDelay" : NumberLong(0),
- "votes" : 1
- },
- {
- "_id" : 1,
- "host" : "<hostname>:27018",
- "arbiterOnly" : false,
- "buildIndexes" : true,
- "hidden" : false,
- "priority" : 1,
- "tags" : {
- },
- "slaveDelay" : NumberLong(0),
- "votes" : 1
- },
- {
- "_id" : 2,
- "host" : "<hostname>:27019",
- "arbiterOnly" : false,
- "buildIndexes" : true,
- "hidden" : false,
- "priority" : 1,
- "tags" : {
- },
- "slaveDelay" : NumberLong(0),
- "votes" : 1
- }
- ],
- "settings" : {
- "chainingAllowed" : true,
- "heartbeatIntervalMillis" : 2000,
- "heartbeatTimeoutSecs" : 10,
- "electionTimeoutMillis" : 10000,
- "catchUpTimeoutMillis" : -1,
- "getLastErrorModes" : {
- },
- "getLastErrorDefaults" : {
- "w" : 1,
- "wtimeout" : 0
- },
- "replicaSetId" : ObjectId("598f630adc9053c6ee6d5f38")
- }
- }
Check the status of your replica set at any time with thers.status()
operation.
See also
The documentation of the following shell functions formore information:
You may also consider the simple setup scriptas an example of a basic automatically-configured replica set.
Refer to Replica Set Read and Write Semanticsfor a detailed explanation of read and write semantics in MongoDB.
[1] | Starting in MongoDB 4.0, the oplog can grow past its configured sizelimit to avoid deleting the majority commit point . |