隨着業務的發展,原來一個standalone的mongod可能需要轉化爲shard cluster,以便更多的機器可以加進來,解決存儲空間不足和運行某些統計時內存不足的問題。(原創文章,轉發請註明來自
Clement-Xu的博客)
一個shard cluster需要三種角色:router (mongos)、config server (mongod)、data server(mongod)。基本的拓撲結構如下:
router (一個或多個mongos) --> config server (大於等於3個的奇數個mongod)
↓↓↓
data server(mongod1, mongod2...任意多個)
具體轉化步驟如下(假設正在運行中的standalone mongo的IP爲:192.168.0.8,端口爲缺省的:27017):
第零步、備份數據!
ssh <目標服務器>
cd
/opt/backup/mongo
備份到當前目錄的dump文件夾下面:
mongodump --db <dbName> --collection <collectionName>
或:mongodump --db
<dbName> --collection <collectionName> --port 27017
如果需要恢復數據:
mongorestore dump/
一、部署config server replica set:
啓動第一個mongod作爲config server replica set中的一員(假設ip爲192.168.0.11):
mongod --config <config_file>
cd /opt
mkdir mongodb
cd mongodb
mkdir configsvr1
cd configsvr1
mkdir db (數據存儲路徑)
創建配置文件:
vi mongod.conf
systemLog:
destination: file
path: "/opt/mongodb/configsvr1/mongod.log"
logAppend: true
storage:
dbPath: "/opt/mongodb/configsvr1/db"
journal:
enabled: true
processManagement:
fork: true
pidFilePath: "/opt/mongodb/configsvr1/mongod.pid"
net:
port: 27001
setParameter:
enableLocalhostAuthBypass: false
sharding:
clusterRole: configsvr
replication:
replSetName: configReplSet
啓動第一個config server:
mongod --config /opt/mongodb/configsvr1/mongod.conf
連接到該config server:
mongo --host 192.168.0.11 --port 27001
初始化replica set運行:
rs.initiate(
{
_id: "configReplSet",
configsvr: true,
members: [
{ _id : 0, host : "192.168.0.11:27001" }
]
}
)
修改開機啓動腳本:
vi /etc/init.d/boot.local
/usr/bin/sleep 10
/usr/bin/mongod --config /opt/mongodb/configsvr1/mongod.conf
添加其他成員:
rs.add("192.168.0.12:27001")
rs.add("192.168.0.13:27001")
rs.status()
注:如果是後期添加,則需要修改mongos的配置文件,並重啓。
二、部署mongos(服務器ip爲:192.168.0.8,端口爲:27017,跟正在運行的standalone mongo相同,以便無縫接替):
cd /opt/mongodb/mongos1
創建配置文件(port設爲27017,以接替正在運行的那個standalone mongod):
vi mongod.conf
systemLog:
destination: file
path: "/opt/mongodb/mongos1/mongod.log"
logAppend: true
processManagement:
fork: true
pidFilePath: "/opt/mongodb/mongos1/mongod.pid"
net:
port: 27017
setParameter:
enableLocalhostAuthBypass: false
sharding:
autoSplit: true
configDB: configReplSet/192.168.0.11:27001
(configDB有多個的話用逗號分開,比如:configDB: configReplSet/192.168.0.11:27001,192.168.0.12:27001)
修改開機啓動腳本:
vi /etc/init.d/boot.local
/usr/bin/sleep 10
mongos --config /opt/mongodb/mongos1/mongod.conf
修改正在運行的standalone mongod配置文件,然後重啓:
vi /etc/mongod.conf
修改port爲27027
service mongod stop
service mongod start
啓動mongos:
mongos --config /opt/mongodb/mongos1/mongod.conf
三、加入第一個shard(就是那個正在運行的mongod)到cluster中:
連接到mongos:
mongo 192.168.0.8:27017/admin
把standalone mongod加入到cluster中
sh.addShard( "192.168.0.8:27027" )
四、加入其它shard(mongod,假設ip爲:192.168.0.21、31……,端口統一爲:27027):
把一個mongod(standalone)作爲一個shard加入到cluster中:
安裝(略);
修改端口:
vi /etc/mongod.conf
修改port爲27027
啓動:
service mongod start
service mongod status
註冊開機自動啓動:
chkconfig mongod on
1、連接到mongos:
mongo 192.168.0.8:27017/admin
2、加入:
sh.addShard( "192.168.0.21:27027" )
sh.addShard( "192.168.0.31:27027" )
五、選擇某個collection來分片
注:缺省的分片機制是Ranged Sharding。
1、連接到mongos:
mongo 192.168.0.8:27017/admin
2、shard該collection所在的database:
sh.enableSharding("myLog")
3、選擇一個shard key(最好能均勻分佈並且可以連續獲取,比如time),併爲它創建索引:
use myLog
創建索引:
db.userOpLog.createIndex({"method" :
1, "ctime" : 1}, {backgroud: true})
db.userOpLog.getIndexes()
對一個collection進行分片:
sh.shardCollection( "myLog.userOpLog", {"method" :
1, "ctime" : 1} )
如果成功,返回:{"ok":1}
5、查看balancer是不是在運行:
或:db.userOpLog.stats()
或:db.printShardingStatus()
至此,大功告成!
取消分片:
參考: