Navigation

Deploy a Replica Set for Testing and Development

This procedure describes deploying a replica set in a development or test environment. For a production deployment, refer to the Deploy a Replica Set tutorial.

This tutorial describes how to create a three-member replica set from three existing mongod instances running with access control disabled.

To deploy a replica set with enabled access control, see Deploy New Replica Set With Keyfile Access Control. If you wish to deploy a replica set from a single MongoDB instance, see Convert a Standalone to a Replica Set. For more information on replica set deployments, see the Replication and Replica Set Deployment Architectures documentation.

Overview

Three member replica sets provide enough redundancy to survive most network partitions and other system failures. These sets also have sufficient capacity for many distributed read operations. Replica sets should always have an odd number of members. This ensures that elections will proceed smoothly. For more about designing 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 on each 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. For instructions on how to check your connection, see Test Connections Between all Members.

Considerations

IP Binding

Starting in MongoDB 3.6, MongoDB binaries, mongod and mongos, bind to localhost (127.0.0.1) by default. If the net.ipv6 configuration file setting or the --ipv6 command line option is set for the binary, the binary additionally binds to the IPv6 address ::1.

Previously, starting from MongoDB 2.6, only the binaries from the official MongoDB RPM (Red Hat, CentOS, Fedora Linux, and derivatives) and DEB (Debian, Ubuntu, and derivatives) packages bind to localhost by default.

When bound only to the localhost, these MongoDB 3.6 binaries can only accept 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 to the binaries bound only to localhost.

To override and bind to other ip addresses, you can use the net.bindIp configuration file setting or the --bind_ip command-line option to specify a list of ip addresses.

Warning

Before you bind to other ip addresses, consider enabling access control and other security measures listed in Security Checklist to prevent unauthorized access.

For example, the following mongod instance binds to both the localhost and the sample ip address 198.51.100.1:

mongod --bind_ip localhost,198.51.100.1

In order to connect to this instance, remote clients must specify the ip address 198.51.100.1 or the hostname associated with the ip address:

mongo --host 198.51.100.1

mongo --host My-Example-Associated-Hostname

In this test deployment, the three members run on the same machine.

Replica Set Naming

Important

These instructions should only be used for test or development deployments.

The examples in this procedure create a new replica set named rs0.

If your application connects to more than one replica set, each set should have a distinct name. Some drivers group replica set connections by replica set name.

Procedure

  1. Create the necessary data directories for each member by issuing a command 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”, which will contain the instances’ database files.

  2. Start your mongod instances in their own shell windows by issuing the following commands:

    Warning

    Before you bind to other ip addresses, consider enabling access control and other security measures listed in Security Checklist to prevent unauthorized access.

    First member:

    mongod --replSet rs0 --port 27017 --bind_ip localhost,<ip address of mongod host> --dbpath /srv/mongodb/rs0-0 --smallfiles --oplogSize 128
    

    Second member:

    mongod --replSet rs0 --port 27018 --bind_ip localhost,<ip address of mongod host> --dbpath /srv/mongodb/rs0-1 --smallfiles --oplogSize 128
    

    Third member:

    mongod --replSet rs0 --port 27019 --bind_ip localhost,<ip address of mongod host> --dbpath /srv/mongodb/rs0-2 --replSet rs0 --smallfiles --oplogSize 128
    

    This starts each instance as a member of a replica set named rs0, each running on a distinct port, and specifies the path to your 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 address of the host.

    The --smallfiles and --oplogSize settings reduce the disk space that each mongod instance uses. This is ideal for testing and development deployments as it prevents overloading your machine. For more information on these and other configuration options, see Configuration File Options.

  3. Connect to one of your mongod instances through the mongo shell. You will need to indicate which instance by specifying 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
    
  4. In the mongo shell, use rs.initiate() to initiate the replica set. You can create a replica set configuration object in the mongo shell environment, as in 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() as follows:

    rs.initiate( rsconf )
    
  5. Display the current replica configuration by 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 the rs.status() operation.

See also

The documentation of the following shell functions for more information:

You may also consider the simple setup script as an example of a basic automatically-configured replica set.

Refer to Replica Set Read and Write Semantics for a detailed explanation of read and write semantics in MongoDB.