一个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() 至此,大功告成! 取消分片: 参考: https://jira.mongodb.org/browse/SERVER-9845 参考: https://docs.mongodb.org/manual/tutorial/convert-replica-set-to-replicated-shard-cluster/