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
}
相關文章
相關標籤/搜索