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 --collection
或:mongodump --db --collection  --port 27017

如果需要恢复数据:
mongorestore dump/

一、部署config server replica set:
启动第一个mongod作为config server replica set中的一员(假设ip为 192.168.0.11):
mongod --config 

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()

至此,大功告成!

取消分片:
参考: https://jira.mongodb.org/browse/SERVER-9845

参考:
https://docs.mongodb.org/manual/tutorial/convert-replica-set-to-replicated-shard-cluster/


你可能感兴趣的:(mongodb,shard,cluster,MongoDB)