Mongodb sharding转换一个副本集为分片集群

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
}


你可能感兴趣的:(Mongodb sharding转换一个副本集为分片集群)