Standalone mongod轉化爲shard cluster

隨着業務的發展,原來一個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是不是在運行:
use myLog
sh.status()
或:db.userOpLog.stats()
或:db.printShardingStatus()

至此,大功告成!

取消分片:

參考:


發佈了201 篇原創文章 · 獲贊 397 · 訪問量 204萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章