How to Run Multiple Isolated MongoDB Instances on a Single Linux Server


2 views

As developers, we often need to run isolated MongoDB instances on a single machine for testing, multi-project environments, or CI/CD pipelines. While MongoDB officially recommends separate servers for production, running multiple instances on a single Linux server is perfectly valid for development and testing scenarios.

To properly isolate MongoDB instances, we need to configure:

  • Unique data directories (--dbpath)
  • Distinct TCP ports (--port)
  • Separate log files (--logpath)
  • Different PID files (--pidfilepath)
  • Optional: Unique configuration files

Here's how to set up two MongoDB instances (27017 and 27018) on Ubuntu:


# Create directories for first instance
sudo mkdir -p /data/db1
sudo chown -R mongodb:mongodb /data/db1

# Create directories for second instance  
sudo mkdir -p /data/db2
sudo chown -R mongodb:mongodb /data/db2

# Start first instance (default port 27017)
mongod --dbpath /data/db1 --logpath /var/log/mongodb/db1.log --fork

# Start second instance (port 27018)  
mongod --port 27018 --dbpath /data/db2 --logpath /var/log/mongodb/db2.log --fork

For better management, create separate config files:


# /etc/mongod1.conf
storage:
  dbPath: /data/db1
systemLog:
  destination: file
  path: /var/log/mongodb/db1.log
  logAppend: true
net:
  port: 27017
  bindIp: 127.0.0.1
processManagement:
  fork: true
  pidFilePath: /var/run/mongodb/mongod1.pid

# /etc/mongod2.conf
storage:
  dbPath: /data/db2  
systemLog:
  destination: file
  path: /var/log/mongodb/db2.log
  logAppend: true
net:
  port: 27018
  bindIp: 127.0.0.1  
processManagement:
  fork: true
  pidFilePath: /var/run/mongodb/mongod2.pid

For production-like environments, create separate systemd services:


# /etc/systemd/system/mongod1.service
[Unit]
Description=MongoDB Database Server (Instance 1)
After=network.target

[Service]
User=mongodb
Group=mongodb
ExecStart=/usr/bin/mongod --config /etc/mongod1.conf
PIDFile=/var/run/mongodb/mongod1.pid

[Install]
WantedBy=multi-user.target

When working with multiple instances, specify the port when connecting:


// Node.js connection example
const mongoose = require('mongoose');

// Connect to first instance
mongoose.connect('mongodb://localhost:27017/project1');

// Connect to second instance  
const conn2 = mongoose.createConnection('mongodb://localhost:27018/project2');

When running multiple instances:

  • Monitor memory usage (each mongod reserves RAM)
  • Consider using --smallfiles for testing instances
  • Set appropriate wiredTigerCacheSizeGB values
  • Use cgroups for resource limiting if needed

For better isolation, consider Docker containers:


# Run first MongoDB container
docker run --name mongo1 -p 27017:27017 -v /data/db1:/data/db -d mongo

# Run second MongoDB container  
docker run --name mongo2 -p 27018:27017 -v /data/db2:/data/db -d mongo

When working in development or testing environments, you might need to run multiple MongoDB instances on a single machine. Common scenarios include:

  • Testing different MongoDB versions side-by-side
  • Isolating projects for different teams
  • Creating replica sets for local development
  • Running microservices with dedicated databases

The key to running multiple MongoDB instances is proper configuration isolation. Each instance needs:


# Example configuration for second instance
port = 27018
dbpath = /data/db2
logpath = /var/log/mongodb/mongod2.log
pidfilepath = /var/run/mongodb/mongod2.pid

Here's how to set up an additional MongoDB instance:


# Create data directory
sudo mkdir -p /data/db2
sudo chown mongodb:mongodb /data/db2

# Create custom config file
sudo nano /etc/mongod2.conf

# Sample content for mongod2.conf:
storage:
  dbPath: /data/db2
systemLog:
  destination: file
  path: /var/log/mongodb/mongod2.log
  logAppend: true
net:
  port: 27018
processManagement:
  pidFilePath: /var/run/mongodb/mongod2.pid

Use these commands to control your instances:


# Start second instance
mongod --config /etc/mongod2.conf --fork

# Connect to second instance
mongo --port 27018

# Stop specific instance (using PID)
kill -2 cat /var/run/mongodb/mongod2.pid

While this works well for testing, consider these factors for production-like environments:

  • Resource allocation (CPU, RAM limits)
  • Security configurations for each instance
  • Proper service management (systemd units)
  • Monitoring each instance separately

Watch out for these potential problems:


# Check for port conflicts
netstat -tulnp | grep mongo

# Verify file permissions
ls -la /data/db2/

# Check logs for errors
tail -f /var/log/mongodb/mongod2.log