Transparent Huge Pages Configuration
Linux Transparent Huge Pages (THP) can degrade database performance due to non-contiguous memory access patterns. MongoDB requires disabling THP for optimal operation:
# Permanent system configuration
if test -f /sys/kernel/mm/transparent_hugepage/enabled; then
echo never > /sys/kernel/mm/transparent_hugepage/enabled
fi
if test -f /sys/kernel/mm/transparent_hugepage/defrag; then
echo never > /sys/kernel/mm/transparent_hugepage/defrag
fi
Apply temporary settings without reboot:
echo never | sudo tee /sys/kernel/mm/transparent_hugepage/enabled
echo never | sudo tee /sys/kernel/mm/transparent_hugepage/defrag
Service Installation Procedure
Create dedicated service account:
sudo useradd -r mdbuser
sudo passwd mdbuser
Establish directory structure:
sudo mkdir -p /var/mongodb/{conf,logs,primary/db}
sudo chown -R mdbuser:mdbuser /var/mongodb
Deploy MongoDB binaries:
tar xzf mongodb-linux-x86_64-6.0.10.tgz
sudo cp -a mongodb-linux-x86_64-6.0.10/bin/ /var/mongodb/bin
Configure environment for service account:
su - mdbuser
echo 'export PATH=/var/mongodb/bin:$PATH' >> ~/.bashrc
source ~/.bashrc
YAML Configuration Implementation
Sample configuration file (/var/mongodb/conf/mongod.yaml):
systemLog:
destination: file
path: /var/mongodb/logs/server.log
logAppend: true
storage:
dbPath: /var/mongodb/primary/db
journal:
enabled: true
processManagement:
fork: true
net:
port: 27000
bindIp: 0.0.0.0
security:
authorization: enabled
Start service using configuration:
mongod -f /var/mongodb/conf/mongod.yaml
Systemd service unit (/etc/systemd/system/mongodb.service):
[Unit]
Description=MongoDB Database Server
After=network.target
[Service]
User=mdbuser
ExecStart=/var/mongodb/bin/mongod -f /var/mongodb/conf/mongod.yaml
Restart=always
[Install]
WantedBy=multi-user.target
Access Control Configuration
Create administrative user:
use admin
db.createUser({
user: "admin_user",
pwd: "secure_password_123",
roles: [{ role: "root", db: "admin" }]
})
Enable authentication in configuration:
security:
authorization: enabled
Connect with authentication:
mongo -u admin_user -p secure_password_123 --authenticationDatabase admin
Create application-specific user with limited privileges:
use application_db
db.createUser({
user: "app_writer",
pwd: "writer_password",
roles: [{ role: "readWrite", db: "application_db" }]
})
Replica Set Deployment
Configure multi-instance environment (ports 27001-27003):
replication:
replSetName: "mdb_cluster"
oplogSizeMB: 4096
Initialize replica set:
rs.initiate({
_id: "mdb_cluster",
members: [
{ _id: 0, host: "localhost:27001" },
{ _id: 1, host: "localhost:27002" },
{ _id: 2, host: "localhost:27003", arbiterOnly: true }
]
})
Configure delayed secondary node:
cfg = rs.conf()
cfg.members[2].priority = 0
cfg.members[2].hidden = true
cfg.members[2].slaveDelay = 3600
rs.reconfig(cfg)
Sharded Cluster Architecture
Three-tier deployment structure:
- Config servers (3-node replica set)
- Shard servers (2 replica sets)
- Query routers (mongos instances)
Config server configuration:
sharding:
clusterRole: configsvr
replication:
replSetName: "config_cluster"
Mongos configuration:
sharding:
configDB: config_cluster/localhost:27011,localhost:27012,localhost:27013
Add shards to cluster:
sh.addShard("shard1/localhost:27021,localhost:27022,localhost:27023")
sh.addShard("shard2/localhost:27024,localhost:27025,localhost:27026")
Data Partitioning Strategies
Range-based sharding:
sh.enableSharding("application_db")
db.collection.createIndex({ shard_key: 1 })
sh.shardCollection("application_db.collection", { shard_key: 1 })
Hash-based sharding:
db.collection.createIndex({ hash_key: "hashed" })
sh.shardCollection("application_db.collection", { hash_key: "hashed" })
Backup and Recovery Operations
Logical export using mongoexport:
mongoexport --uri="mongodb://admin_user:password@localhost:27000/application_db" \
--collection=logs --out=logs.json
Point-in-time recovery with oplog:
mongodump --port 27001 --oplog -o /backup/snapshot
mongorestore --port 27002 --oplogReplay /backup/snapshot
Restoring to specific operation point:
mongorestore --port 27002 --oplogReplay \
--oplogLimit "1689245000:1" /backup/snapshot