DEV Community

Cover image for Plan of Action: MongoDB 8.0 - 3 Node Replica Set on Air-Gapped RHEL 8.9
kaustubh yerkade
kaustubh yerkade

Posted on

Plan of Action: MongoDB 8.0 - 3 Node Replica Set on Air-Gapped RHEL 8.9

🧾 Plan of Action: MongoDB 8.0 - 3 Node Replica Set on Air-Gapped RHEL 8.9

πŸ“˜ Overview

  • Goal: Setup a MongoDB 8.0 replica set with 3 RHEL 8.9 air-gapped servers
  • Nodes: 3 (Primary, Secondary, Secondary/Arbiter)
  • No Internet access on servers
  • RPMs and config provided from an internet-enabled Windows machine

🧱 Architecture

Node Hostname Role
1 mongo-node1 Primary
2 mongo-node2 Secondary
3 mongo-node3 Secondary

πŸ”Ή 1. Prerequisites on All RHEL Servers

  • RHEL 8.9 installed
  • Static IP or /etc/hosts updated for inter-node resolution
  • Ports open: 27017/tcp
  • SELinux set to permissive or configured
  • Firewall open:
  sudo firewall-cmd --add-port=27017/tcp --permanent
  sudo firewall-cmd --reload
Enter fullscreen mode Exit fullscreen mode

πŸ”Ή 2. On Windows Machine (with Internet)

A. Download Required RPMs for MongoDB 8.0

  1. Visit: https://repo.mongodb.org/yum/redhat/8/mongodb-org/8.0/x86_64/RPMS/
  2. Download:

    • mongodb-org-8.0.0-1.el8.x86_64.rpm
    • mongodb-org-server-8.0.0-1.el8.x86_64.rpm
    • mongodb-org-shell-8.0.0-1.el8.x86_64.rpm
    • mongodb-org-mongos-8.0.0-1.el8.x86_64.rpm
    • mongodb-org-tools-8.0.0-1.el8.x86_64.rpm
  3. Place RPMs in a folder: mongodb8-rpms/

  4. Zip the folder: mongodb8-rpms.zip


πŸ”Ή 3. Transfer to All 3 RHEL Servers

  • Use winSCP to move mongodb8-rpms.zip to each server.
  • On each node:
  unzip mongodb8-rpms.zip -d mongodb8-rpms
  cd mongodb8-rpms
  sudo dnf install *.rpm
Enter fullscreen mode Exit fullscreen mode

πŸ”Ή 4. Configure MongoDB on Each Node

Edit /etc/mongod.conf:

net:
  bindIp: 0.0.0.0
  port: 27017

replication:
  replSetName: rs0
Enter fullscreen mode Exit fullscreen mode

Update /etc/hosts:

<IP1> mongo-node1
<IP2> mongo-node2
<IP3> mongo-node3
Enter fullscreen mode Exit fullscreen mode

πŸ”Ή 5. Start MongoDB on Each Node

sudo systemctl enable mongod
sudo systemctl start mongod
sudo systemctl status mongod
Enter fullscreen mode Exit fullscreen mode

πŸ”Ή 6. Initiate Replica Set (on Primary Node)

mongosh
Enter fullscreen mode Exit fullscreen mode
rs.initiate({
  _id: "rs0",
  members: [
    { _id: 0, host: "mongo-node1:27017" },
    { _id: 1, host: "mongo-node2:27017" },
    { _id: 2, host: "mongo-node3:27017" }
  ]
})
rs.status()
Enter fullscreen mode Exit fullscreen mode

πŸ”Ή 7. (Optional) Enable Authentication

On primary node:

use admin
db.createUser({
  user: "admin",
  pwd: "securePassword",
  roles: [ { role: "root", db: "admin" } ]
})
Enter fullscreen mode Exit fullscreen mode

Edit /etc/mongod.conf:

security:
  authorization: enabled
Enter fullscreen mode Exit fullscreen mode

Restart MongoDB:

sudo systemctl restart mongod
Enter fullscreen mode Exit fullscreen mode

πŸ” Optional: Local Yum Repo

sudo dnf install createrepo -y
createrepo /tmp/mongodb8-rpms
sudo tee /etc/yum.repos.d/mongodb-local.repo <<EOF
[mongodb-local]
name=MongoDB 8 Local Repo
baseurl=file:///tmp/mongodb8-rpms
enabled=1
gpgcheck=0
EOF
Enter fullscreen mode Exit fullscreen mode

βœ… Final Checklist

Task Check
Mongo running systemctl status mongod
Replica configured rs.status()
Authentication works db.auth('admin', 'securePassword')
Network open telnet mongo-nodeX 27017

πŸ“„ MongoDB Cluster Cheat Sheet (Replica Set)

πŸ”§ Basic Cluster Setup Commands

▢️ Initialize Replica Set (run on primary)

rs.initiate({
_id: "rs0",
members: [
{ _id: 0, host: "mongo-node1:27017" },
{ _id: 1, host: "mongo-node2:27017" },
{ _id: 2, host: "mongo-node3:27017" }
]
})

βž• Add Node

rs.add("mongo-node4:27017")
Enter fullscreen mode Exit fullscreen mode

❌ Remove Node

rs.remove("mongo-node3:27017")
Enter fullscreen mode Exit fullscreen mode

⛑️ Step Down Primary

rs.stepDown()
Enter fullscreen mode Exit fullscreen mode

πŸ“Š Monitoring & Config

🧠 Show Config

rs.conf()
Enter fullscreen mode Exit fullscreen mode

πŸ“ˆ Status of Replica Set

rs.status()
Enter fullscreen mode Exit fullscreen mode

⏱️ Replication Lag Info (Secondary)

rs.printSlaveReplicationInfo()
Enter fullscreen mode Exit fullscreen mode

πŸ” Authentication

πŸ‘€ Create Admin User

use admin
db.createUser({
  user: "admin",
  pwd: "securePassword",
  roles: [ { role: "root", db: "admin" } ]
})
Enter fullscreen mode Exit fullscreen mode

πŸ”’ Enable Authentication in mongod.conf

security:
  authorization: enabled
Enter fullscreen mode Exit fullscreen mode

πŸ’‘ CRUD Commands (Data Ops)

πŸ“₯ Insert

use mydb
db.users.insertOne({ name: "Ragu", role: "admin" })
Enter fullscreen mode Exit fullscreen mode

πŸ“€ Read

db.users.find()
db.users.findOne({ name: "Ragu" })
Enter fullscreen mode Exit fullscreen mode

πŸ” Update

db.users.updateOne({ name: "Ragu" }, { $set: { role: "engineer" } })
Enter fullscreen mode Exit fullscreen mode

πŸ—‘οΈ Delete

db.users.deleteOne({ name: "Ragu" })
Enter fullscreen mode Exit fullscreen mode

βš™οΈ Connection Commands

▢️ Local Shell

mongosh
Enter fullscreen mode Exit fullscreen mode

▢️ Remote Shell (no auth)

mongosh --host mongo-node1:27017
Enter fullscreen mode Exit fullscreen mode

▢️ Remote Shell (with auth)

mongosh "mongodb://admin:securePassword@mongo-node1:27017/?authSource=admin&replicaSet=rs0"
Enter fullscreen mode Exit fullscreen mode

πŸ“ File Paths

File Location
Config /etc/mongod.conf
Logs /var/log/mongodb/mongod.log
Data /var/lib/mongo

πŸ§ͺ Testing Tips

  • Shut down primary: sudo systemctl stop mongod
  • Watch failover with: rs.status()
  • Restart with: sudo systemctl start mongod

Top comments (0)