Mongo can be used in many ways. In our group so far we have been using mongo as a standalone server. This page will describe some of the results we have had with setting up and using a mongo cluster. The two methods to setup clusters (that can be combined) are replication clusters as well as sharded clusters.
Replicated Clusters
A replicated cluster is where a set of mongo servers have replicated data. This will allow for fault tolerance. Any time a node of the cluster disappears another node can take over being the primary node. This can also improve the read performance (since reads can be done on multiple nodes). For more information see https://docs.mongodb.com/manual/replication/.
To get this to work in clowder, add the following to your custom.conf file:
A replicated system should have a minimum of 3 nodes. If you have only two nodes in the cluster and one disappears, the second node will NOT be selected the new primary node, and your cluster will not be reachable One of these nodes can be an Aribiter (an arbiter is a regular mongo instance, but does not store any data). Once one of the nodes disappears the left over nodes will vote on who will become the next primary. Normally each node will have the same priority, but this can be changed during the setup.
To create the cluster the following changes had to be made to /etc/mongod.conf
- Ubuntu will bind mongo to localhost interface only. To undo this make sure to remove the "bindIp" element
- You will need to add the replication name, this is done in the replication: section by setting replSet
- To have all databases go into separate directories add directoryPerDB: true to the storage: section
Following is the mongod.conf that is used:
# mongod.conf # for documentation of all options, see: # http://docs.mongodb.org/manual/reference/configuration-options/ # Where and how to store data. storage: dbPath: /var/lib/mongodb journal: enabled: true directoryPerDB: true # where to write logging data. systemLog: destination: file logAppend: true path: /var/log/mongodb/mongod.log # network interfaces net: port: 27017 # replication options replication: replSetName: ISDA
Following are the commands used to create the cluster.
# To initialize the cluster (can be done on any node), after # this command you will have a cluster with 2 nodes. rs.initiate({ _id: "ISDA", version: 1, members: [ { _id: 0, host : "mongo-1.os.ncsa.edu:27017" }, { _id: 1, host : "mongo-2.os.ncsa.edu:27017" } ] }) # To add a new node to the cluster, this will start a copy. You # can copy the mongod folder from one of the nodes before you # add the new node to the cluster rs.add("mongo-3.os.ncsa.edu:27017") # To remove a node from the cluster rs.remove("mongo-3.os.ncsa.edu:27017") # To add an arbiter to the cluster rs.addArb("mongo-3.os.ncsa.edu:27017")
Sharded Cluster