1. 部署一个测试副本集 创建第一个副本集实例,名称为firstset: 1.1 创建副本集并且插入数据如下: /data/example/firstset1 /data/example/firstset2 /data/example/firstset3 创建目录: mkdir -p /data/example/firstset1 /data/example/firstset2 /data/example/firstset3 1.2 在其他终端启动三个mongodb实例,如下: mongod --dbpath /data/example/firstset1 --port 10001 --replSet firstset --oplogSize 700 --rest --fork --logpath /data/example/firstset1/firstset1.log --logappend --nojournal --directoryperdb mongod --dbpath /data/example/firstset2 --port 10002 --replSet firstset --oplogSize 700 --rest --fork --logpath /data/example/firstset2/firstset2.log --logappend --nojournal --directoryperdb mongod --dbpath /data/example/firstset3 --port 10003 --replSet firstset --oplogSize 700 --rest --fork --logpath /data/example/firstset3/firstset3.log --logappend --nojournal --directoryperdb --oplog选项强制每个mongodb实例操作日志为700M,不使用该参数则默认为分区空间的5%,限制oplog的大小,可以使每个实例启动的快一点。 1.3 连接一个mongodb实例的shell mongo mongo01:10001/admin 如果是运行在生产环境下,或者不同主机名或IP的机器上,需要修改mongo01为指定名称。 1.4 在mongo shell上初始化副本集 var config = { "_id" : "firstset", "members" : [ {"_id" : 0, "host" : "mongo01:10001"}, {"_id" : 1, "host" : "mongo01:10002"}, {"_id" : 2, "host" : "mongo01:10003"}, ] } rs.initiate(config); { "info" : "Config now saved locally. Should come online in about a minute.", "ok" : 1 } 或 db.runCommand( {"replSetInitiate" : {"_id" : "firstset", "members" : [ {"_id" : 0, "host" : "mongo01:10001"}, {"_id" : 1, "host" : "mongo01:10002"}, {"_id" : 2, "host" : "mongo01:10003"} ] } } ) 1.5 在mongo shell中创建并插入数据: use mydb switched to db mydb animal = ["dog", "tiger", "cat", "lion", "elephant", "bird", "horse", "pig", "rabbit", "cow", "dragon", "snake"]; for(var i=0; i<100000; i++){ name = animal[Math.floor(Math.random()*animal.length)]; user_id = i; boolean = [true, false][Math.floor(Math.random()*2)]; added_at = new Date(); number = Math.floor(Math.random()*10001); db.test_collection.save({"name":name, "user_id":user_id, "boolean": boolean, "added_at":added_at, "number":number }); } 上面的操作会向集合test_collection插入100万条数据,根据系统不同,可能会花费几分钟的时间。 脚本会加入如下格式的文档: 2. 部署一个分片设施 创建三个配置服务器来保存集群的元数据。 对于开发或者测试环境下,一个配置服务器足够了,在生产环境下,需要三天配置服务器,因为它们只需要占用很少的资源来保存元数据。 2.1 创建配置服务器的数据文件保存目录: /data/example/config1 /data/example/config2 /data/example/config3 创建目录: mkdir -p /data/example/config1 /data/example/config2 /data/example/config3 2.2 在另外的终端下,启动配置服务器: mongod --configsvr --dbpath /data/example/config1 --port 20001 --fork --logpath /data/example/config1/config1.log --logappend mongod --configsvr --dbpath /data/example/config2 --port 20002 --fork --logpath /data/example/config2/config2.log --logappend mongod --configsvr --dbpath /data/example/config3 --port 20003 --fork --logpath /data/example/config3/config3.log --logappend 2.3 在另外的终端下,启动mongos实例: mongos --configdb mongo01:20001,mongo01:20002,mongo01:20003 --port 27017 --chunkSize 1 --fork --logpath /data/example/mongos.log --logappend 如果使用的是以前创建的表或者测试环境下,可以使用最小的chunksize(1M),默认chunksize为64M意味着在mongodb自动分片启动前,集群必须拥有64MB的数据文件。 在生产环境下是不能使用很小的分片大小的。 configdb选项指定了配置服务器。mongos实例运行在默认的mongodb27017端口。 2.4 可以在mongos添加第一个分片,在新的终端执行以下命令: 2.4.1 连接mongos实例 mongo mongo01:27017/admin 2.4.2 使用addShard命令添加第一个分片 db.runCommand( { addShard : "firstset/mongo01:10001,mongo01:10002,mongo01:10003" } ) 2.4.3 出现以下信息,表示成功: { "shardAdded" : "firstset", "ok" : 1 } 3. 部署另一个测试副本集 创建另外一个副本集实例,名称为secondset: 3.1 创建副本集并且插入数据如下: /data/example/secondset1 /data/example/secondset2 /data/example/secondset3 创建目录: mkdir -p /data/example/secondset1 /data/example/secondset2 /data/example/secondset3 3.2 在其他终端启动三个mongodb实例,如下: mongod --dbpath /data/example/secondset1 --port 30001 --replSet secondset --oplogSize 700 --rest --fork --logpath /data/example/secondset1/secondset1.log --logappend --nojournal --directoryperdb mongod --dbpath /data/example/secondset2 --port 30002 --replSet secondset --oplogSize 700 --rest --fork --logpath /data/example/secondset2/secondset2.log --logappend --nojournal --directoryperdb mongod --dbpath /data/example/secondset3 --port 30003 --replSet secondset --oplogSize 700 --rest --fork --logpath /data/example/secondset3/secondset3.log --logappend --nojournal --directoryperdb 3.3 连接一个mongodb实例的shell mongo mongo01:20001/admin 3.4 在mongo shell上初始化副本集 db.runCommand( {"replSetInitiate" : {"_id" : "secondset", "members" : [ {"_id" : 0, "host" : "mongo01:30001"}, {"_id" : 1, "host" : "mongo01:30002"}, {"_id" : 2, "host" : "mongo01:30003"} ] } } ) 3.5 将该副本集加入分片集群 db.runCommand( { addShard : "secondset/mongo01:30001,mongo01:30002,mongo01:30003" } ) 返回成功信息: { "shardAdded" : "firstset", "ok" : 1 } 3.6 通过运行listShards命令证实分片都添加成功。如下: db.runCommand({listShards:1}) { "shards" : [ { "_id" : "firstset", "host" : "firstset/mongo01:10001,mongo01:10002,mongo01:10003" }, { "_id" : "secondset", "host" : "secondset/mongo01:30001,mongo01:30002,mongo01:30003" } ], "ok" : 1 }