MongoDB 作為主流文件型 NoSQL 資料庫,以高效能、無結構、易擴展著稱。本文記錄在 RHEL/CentOS 6.x 上部署 MongoDB 2.6.3 的完整流程,含目錄規劃、配置檔、System V 啟動腳本優化與 NUMA 調優。
# 建議掛載獨立磁碟/LVM於 /data/db, /var/log/mongodb
mkdir -p /usr/local/mongodb /data/db /var/log/mongodb
chown -R mongod:mongod /data/db /var/log/mongodb # 建議建立專用用戶
cd /usr/local/src
wget https://fastdl.mongodb.org/linux/mongodb-linux-x86_64-2.6.3.tgz
tar -xzf mongodb-linux-x86_64-2.6.3.tgz -C /usr/local/mongodb --strip-components=1
/etc/mongod.conf
# 基礎網路
port = 27017
bind_ip = 0.0.0.0 # 生產環境請限制具體 IP
# 儲存與日誌
dbpath = /data/db
logpath = /var/log/mongodb/mongod.log
logappend = true
# 效能與儲存引擎 (2.6 預設 MMAPv1, 3.0+ 支援 WiredTiger)
journal = true
# storageEngine = wiredTiger # 3.0+ 才支援
# 複寫集 (生產必備)
# replSet = rs0
# 安全
# auth = true
# keyFile = /etc/mongodb.key
echo 'export PATH=$PATH:/usr/local/mongodb/bin' > /etc/profile.d/mongodb.sh
source /etc/profile.d/mongodb.sh
/etc/init.d/mongod
#!/bin/bash
# MongoDB 服務管理腳本 - 支援 NUMA、狀態檢查、安全停止
# chkconfig: 345 85 15
# description: MongoDB Database Server
. /etc/rc.d/init.d/functions
MONGOD="/usr/local/mongodb/bin/mongod"
CONFIG="/etc/mongod.conf"
PIDFILE="/var/run/mongodb/mongod.pid"
LOCKFILE="/var/lock/subsys/mongod"
USER="mongod"
# NUMA 交錯記憶體分配優化 (需安裝 numactl)
NUMACTL="numactl --interleave=all"
if ! which numactl >/dev/null 2>&1; then
NUMACTL=""
fi
start() {
echo -n "Starting MongoDB: "
daemon --user $USER --pidfile $PIDFILE "$NUMACTL $MONGOD -f $CONFIG --fork --pidfilepath $PIDFILE"
RETVAL=$?
[ $RETVAL -eq 0 ] && touch $LOCKFILE
echo
return $RETVAL
}
stop() {
echo -n "Stopping MongoDB: "
killproc -p $PIDFILE -d 30 $MONGOD
RETVAL=$?
[ $RETVAL -eq 0 ] && rm -f $LOCKFILE $PIDFILE
echo
return $RETVAL
}
status() {
status -p $PIDFILE $MONGOD
}
case "$1" in
start) start ;;
stop) stop ;;
restart) stop; start ;;
status) status ;;
*) echo "Usage: $0 {start|stop|restart|status}"; exit 1 ;;
esac
exit $RETVAL
# 1. 關閉 Transparent Huge Pages (THP) - 必須!
echo never > /sys/kernel/mm/transparent_hugepage/enabled
echo never > /sys/kernel/mm/transparent_hugepage/defrag
# 加入 /etc/rc.local 永久生效
# 2. 設定 ulimit (開啟檔案數、進程數)
cat >> /etc/security/limits.conf <> /etc/sysctl.conf <
chmod +x /etc/init.d/mongod
chkconfig --add mongod
chkconfig mongod on
service mongod start
# 驗證連線
mongo --eval "db.runCommand({connectionStatus:1})"
# 檢查日誌
tail -f /var/log/mongodb/mongod.log
# 在 primary 節點
rs.initiate({
_id: "rs0",
members: [
{_id: 0, host: "mongo1:27017"},
{_id: 1, host: "mongo2:27017"},
{_id: 2, host: "mongo3:27017", arbiterOnly: true}
]
})
mongodump --host localhost --port 27017 --out /backup/$(date +%F)mongorestore --host localhost --port 27017 /backup/2024-01-15mongostat, mongotop, db.serverStatus()db.collection.explain().find({...})MongoDB 部署易上手,但生產環境必須處理:THP 關閉、ulimit 調大、NUMA 交錯分配、Replica Set 高可用、備份策略、監控告警。配置檔與啟動腳本納入版控,配合 Ansible 實現一鍵部署,才是成熟運維姿態。