随着业务的发展,原来一个standalone的mongod可能需要转化为shard cluster,以便更多的机器可以加进来,解决存储空间不足和运行某些统计时内存不足的问题。(原创文章,转发请注明来自
Clement-Xu的博客)
router (一个或多个mongos) --> config server (大于等于3个的奇数个mongod)
↓↓↓
data server(mongod1, mongod2...任意多个)
连接到该config server:
rs.add("192.168.0.12:27001")
sh.addShard( "192.168.0.31:27027" )
或:db.userOpLog.stats()
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
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.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" )
五、选择某个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.printShardingStatus()
至此,大功告成!
取消分片:
参考: