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