搭建mongodb集群(副本集+分片)
2015-05-09 21:59
477 查看
完整的搭建mongodb集群(副本集+分片)的例子。。。
准备四台机器,分别是bluejoe1,bluejoe2,bluejoe3,以及bluejoe0
副本集及分片策略确定如下:
将创建3个副本集,命名为shard1,shard2,shard3;
以上3个副本集作为3个分片;
每个副本集包含3个副本(主、辅1、辅2);
副本分开存储,即shard1存在bluejoe1、bluejoe2、bluejoe3上各一份。。。以此类推
将创建3个配置库实例,一台机器一个
bluejoe0上配置一个mongos(mongos一般可以配置在应用端)
画了一个图:
具体操作步骤如下:
在bluejoe1上下载mongdb安装包;
解压至/usr/local/mongdb(注意改名);
创建data/brick1,brick2,brick3目录,启动3个mongod实例,注意它们分别是shard1,shard2和shard3:
[html] view
plaincopyprint?
/usr/local/mongodb/bin/mongod --dbpath /usr/local/mongodb/data/brick1 --port 10001 --replSet shard1 --logpath=/usr/local/mongodb/log/brick1.log
/usr/local/mongodb/bin/mongod --dbpath /usr/local/mongodb/data/brick2 --port 10002 --replSet shard2 --logpath=/usr/local/mongodb/log/brick2.log
/usr/local/mongodb/bin/mongod --dbpath /usr/local/mongodb/data/brick3 --port 10003 --replSet shard3 --logpath=/usr/local/mongodb/log/brick3.log
使用scp命令,将mongodb目录复制至bluejoe2和bluejoe3机器,并按照第3步启动每台机器上的3个实例;
初始化副本:
[html] view
plaincopyprint?
mongo bluejoe1:10001
>use admin
>db.runCommand(
{
"replSetInitiate":
{
"_id":"shard1",
"members":
[
{
"_id":1,
"host":"bluejoe1:10001"
},
{
"_id":2,
"host":"bluejoe2:10003"
},
{
"_id":3,
"host":"bluejoe3:10002"
}
]
}
})
mongo bluejoe2:10001
>use admin
>db.runCommand(
{
"replSetInitiate":
{
"_id":"shard2",
"members":
[
{
"_id":1,
"host":"bluejoe2:10001"
},
{
"_id":2,
"host":"bluejoe1:10002"
},
{
"_id":3,
"host":"bluejoe3:10003"
}
]
}
})
mongo bluejoe3:10001
>use admin
>db.runCommand(
{
"replSetInitiate":
{
"_id":"shard3",
"members":
[
{
"_id":1,
"host":"bluejoe3:10001"
},
{
"_id":2,
"host":"bluejoe2:10002"
},
{
"_id":3,
"host":"bluejoe1:10003"
}
]
}
})
观察副本集的实时复制特性
连接上bluejoe1:10001,看到shard1:PRIMARY>的字样,说明它是shard1的主节点
创建一张新表,创建几条测试记录
连接上bluejoe3:10002,看到shard1:SECONDARY>的字样,说明它是shard1的辅助节点
注意此时无法查询前面新增的记录,会报错not master and slaveOk=false
回到bluejoe1:10001,设置slaveOk
[html] view
plaincopyprint?
db.getMongo().setSlaveOk()
再回到bluejoe3:10002,即可看到主节点写入的记录
观察副本集的故障转移特性
杀掉bluejoe1:10001的进程
再次连接上bluejoe3:10002,看到shard1:PRIMARY>的字样,说明它已经变成shard1的主节点
如果这时再启动bluejoe1:10001,则发现它已经变成shard1:SECONDARY>
创建data/configdb,启动配置库实例:
[html] view
plaincopyprint?
/usr/local/mongodb/bin/mongod --dbpath /usr/local/mongodb/data/configdb --port 20000 --logpath=/usr/local/mongodb/log/configdb.log
到现在为止应该有12个mongd实例,其中3个为配置库实例,剩下的属于3个副本集;
接下来管理分片,在bluejoe0上启动mongs:
[html] view
plaincopyprint?
/usr/local/mongodb/bin/mongos --port 30000 --configdb bluejoe1:20000,bluejoe2:20000,bluejoe3:20000
连接上mongos,配置分片信息:
[html] view
plaincopyprint?
mongos> use admin
switched to db admin
db.runCommand({"addShard":"shard1/bluejoe1:10001"})
db.runCommand({"addShard":"shard2/bluejoe2:10001"})
db.runCommand({"addShard":"shard3/bluejoe3:10001"})
查看分片情况:
[html] view
plaincopyprint?
mongos> db.runCommand({listshards:1})
{
"shards" : [
{
"_id" : "shard1",
"host" : "shard1/bluejoe1:10001,bluejoe2:10003,bluejoe3:10002"
},
{
"_id" : "shard2",
"host" : "shard2/bluejoe1:10002,bluejoe2:10001,bluejoe3:10003"
},
{
"_id" : "shard3",
"host" : "shard3/bluejoe1:10003,bluejoe2:10002,bluejoe3:10001"
}
],
"ok" : 1
}
可以看出,尽管注册的时候只是提供了副本集的主节点,但mongos已知晓了各辅助节点;
对某个库开启分片功能:
[html] view
plaincopyprint?
mongos> db.runCommand({"enablesharding":"test"})
{ "ok" : 1 }
mongos> db.runCommand({"shardcollection":"test.person","key":{_id:'hashed'}})
{ "collectionsharded" : "test.person", "ok" : 1 }
插入测试数据:
[html] view
plaincopyprint?
mongos> for(var i=0;i<10;i++){db.person.insert({name:"bluejoe"+i});}
WriteResult({ "nInserted" : 1 })
查看数据分片存储情况:
[html] view
plaincopyprint?
[root@hadoop0 ~]# mongo bluejoe3:10002
MongoDB shell version: 2.6.5
connecting to: bluejoe3:10002/test
shard1:PRIMARY> db.person.find()
{ "_id" : ObjectId("546ff1013a0d0ec68b42a914"), "name" : "bluejoe0" }
{ "_id" : ObjectId("546ff1013a0d0ec68b42a915"), "name" : "bluejoe1" }
{ "_id" : ObjectId("546ff1013a0d0ec68b42a91a"), "name" : "bluejoe6" }
{ "_id" : ObjectId("546ff1013a0d0ec68b42a91b"), "name" : "bluejoe7" }
{ "_id" : ObjectId("546ff1013a0d0ec68b42a91c"), "name" : "bluejoe8" }
shard1:PRIMARY> exit
bye
[root@hadoop0 ~]# mongo bluejoe2:10001
MongoDB shell version: 2.6.5
connecting to: bluejoe2:10001/test
shard2:PRIMARY> db.person.find()
{ "_id" : ObjectId("546ff1013a0d0ec68b42a918"), "name" : "bluejoe4" }
shard2:PRIMARY> exit
bye
[root@hadoop0 ~]# mongo bluejoe3:10001
MongoDB shell version: 2.6.5
connecting to: bluejoe3:10001/test
shard3:PRIMARY> db.person.find()
{ "_id" : ObjectId("546ff1013a0d0ec68b42a916"), "name" : "bluejoe2" }
{ "_id" : ObjectId("546ff1013a0d0ec68b42a917"), "name" : "bluejoe3" }
{ "_id" : ObjectId("546ff1013a0d0ec68b42a919"), "name" : "bluejoe5" }
{ "_id" : ObjectId("546ff1013a0d0ec68b42a91d"), "name" : "bluejoe9" }
shard3:PRIMARY>
准备四台机器,分别是bluejoe1,bluejoe2,bluejoe3,以及bluejoe0
副本集及分片策略确定如下:
将创建3个副本集,命名为shard1,shard2,shard3;
以上3个副本集作为3个分片;
每个副本集包含3个副本(主、辅1、辅2);
副本分开存储,即shard1存在bluejoe1、bluejoe2、bluejoe3上各一份。。。以此类推
将创建3个配置库实例,一台机器一个
bluejoe0上配置一个mongos(mongos一般可以配置在应用端)
画了一个图:
具体操作步骤如下:
在bluejoe1上下载mongdb安装包;
解压至/usr/local/mongdb(注意改名);
创建data/brick1,brick2,brick3目录,启动3个mongod实例,注意它们分别是shard1,shard2和shard3:
[html] view
plaincopyprint?
/usr/local/mongodb/bin/mongod --dbpath /usr/local/mongodb/data/brick1 --port 10001 --replSet shard1 --logpath=/usr/local/mongodb/log/brick1.log
/usr/local/mongodb/bin/mongod --dbpath /usr/local/mongodb/data/brick2 --port 10002 --replSet shard2 --logpath=/usr/local/mongodb/log/brick2.log
/usr/local/mongodb/bin/mongod --dbpath /usr/local/mongodb/data/brick3 --port 10003 --replSet shard3 --logpath=/usr/local/mongodb/log/brick3.log
使用scp命令,将mongodb目录复制至bluejoe2和bluejoe3机器,并按照第3步启动每台机器上的3个实例;
初始化副本:
[html] view
plaincopyprint?
mongo bluejoe1:10001
>use admin
>db.runCommand(
{
"replSetInitiate":
{
"_id":"shard1",
"members":
[
{
"_id":1,
"host":"bluejoe1:10001"
},
{
"_id":2,
"host":"bluejoe2:10003"
},
{
"_id":3,
"host":"bluejoe3:10002"
}
]
}
})
mongo bluejoe2:10001
>use admin
>db.runCommand(
{
"replSetInitiate":
{
"_id":"shard2",
"members":
[
{
"_id":1,
"host":"bluejoe2:10001"
},
{
"_id":2,
"host":"bluejoe1:10002"
},
{
"_id":3,
"host":"bluejoe3:10003"
}
]
}
})
mongo bluejoe3:10001
>use admin
>db.runCommand(
{
"replSetInitiate":
{
"_id":"shard3",
"members":
[
{
"_id":1,
"host":"bluejoe3:10001"
},
{
"_id":2,
"host":"bluejoe2:10002"
},
{
"_id":3,
"host":"bluejoe1:10003"
}
]
}
})
观察副本集的实时复制特性
连接上bluejoe1:10001,看到shard1:PRIMARY>的字样,说明它是shard1的主节点
创建一张新表,创建几条测试记录
连接上bluejoe3:10002,看到shard1:SECONDARY>的字样,说明它是shard1的辅助节点
注意此时无法查询前面新增的记录,会报错not master and slaveOk=false
回到bluejoe1:10001,设置slaveOk
[html] view
plaincopyprint?
db.getMongo().setSlaveOk()
再回到bluejoe3:10002,即可看到主节点写入的记录
观察副本集的故障转移特性
杀掉bluejoe1:10001的进程
再次连接上bluejoe3:10002,看到shard1:PRIMARY>的字样,说明它已经变成shard1的主节点
如果这时再启动bluejoe1:10001,则发现它已经变成shard1:SECONDARY>
创建data/configdb,启动配置库实例:
[html] view
plaincopyprint?
/usr/local/mongodb/bin/mongod --dbpath /usr/local/mongodb/data/configdb --port 20000 --logpath=/usr/local/mongodb/log/configdb.log
到现在为止应该有12个mongd实例,其中3个为配置库实例,剩下的属于3个副本集;
接下来管理分片,在bluejoe0上启动mongs:
[html] view
plaincopyprint?
/usr/local/mongodb/bin/mongos --port 30000 --configdb bluejoe1:20000,bluejoe2:20000,bluejoe3:20000
连接上mongos,配置分片信息:
[html] view
plaincopyprint?
mongos> use admin
switched to db admin
db.runCommand({"addShard":"shard1/bluejoe1:10001"})
db.runCommand({"addShard":"shard2/bluejoe2:10001"})
db.runCommand({"addShard":"shard3/bluejoe3:10001"})
查看分片情况:
[html] view
plaincopyprint?
mongos> db.runCommand({listshards:1})
{
"shards" : [
{
"_id" : "shard1",
"host" : "shard1/bluejoe1:10001,bluejoe2:10003,bluejoe3:10002"
},
{
"_id" : "shard2",
"host" : "shard2/bluejoe1:10002,bluejoe2:10001,bluejoe3:10003"
},
{
"_id" : "shard3",
"host" : "shard3/bluejoe1:10003,bluejoe2:10002,bluejoe3:10001"
}
],
"ok" : 1
}
可以看出,尽管注册的时候只是提供了副本集的主节点,但mongos已知晓了各辅助节点;
对某个库开启分片功能:
[html] view
plaincopyprint?
mongos> db.runCommand({"enablesharding":"test"})
{ "ok" : 1 }
mongos> db.runCommand({"shardcollection":"test.person","key":{_id:'hashed'}})
{ "collectionsharded" : "test.person", "ok" : 1 }
插入测试数据:
[html] view
plaincopyprint?
mongos> for(var i=0;i<10;i++){db.person.insert({name:"bluejoe"+i});}
WriteResult({ "nInserted" : 1 })
查看数据分片存储情况:
[html] view
plaincopyprint?
[root@hadoop0 ~]# mongo bluejoe3:10002
MongoDB shell version: 2.6.5
connecting to: bluejoe3:10002/test
shard1:PRIMARY> db.person.find()
{ "_id" : ObjectId("546ff1013a0d0ec68b42a914"), "name" : "bluejoe0" }
{ "_id" : ObjectId("546ff1013a0d0ec68b42a915"), "name" : "bluejoe1" }
{ "_id" : ObjectId("546ff1013a0d0ec68b42a91a"), "name" : "bluejoe6" }
{ "_id" : ObjectId("546ff1013a0d0ec68b42a91b"), "name" : "bluejoe7" }
{ "_id" : ObjectId("546ff1013a0d0ec68b42a91c"), "name" : "bluejoe8" }
shard1:PRIMARY> exit
bye
[root@hadoop0 ~]# mongo bluejoe2:10001
MongoDB shell version: 2.6.5
connecting to: bluejoe2:10001/test
shard2:PRIMARY> db.person.find()
{ "_id" : ObjectId("546ff1013a0d0ec68b42a918"), "name" : "bluejoe4" }
shard2:PRIMARY> exit
bye
[root@hadoop0 ~]# mongo bluejoe3:10001
MongoDB shell version: 2.6.5
connecting to: bluejoe3:10001/test
shard3:PRIMARY> db.person.find()
{ "_id" : ObjectId("546ff1013a0d0ec68b42a916"), "name" : "bluejoe2" }
{ "_id" : ObjectId("546ff1013a0d0ec68b42a917"), "name" : "bluejoe3" }
{ "_id" : ObjectId("546ff1013a0d0ec68b42a919"), "name" : "bluejoe5" }
{ "_id" : ObjectId("546ff1013a0d0ec68b42a91d"), "name" : "bluejoe9" }
shard3:PRIMARY>
相关文章推荐
- 搭建mongodb集群(副本集+分片)
- 搭建mongodb集群(副本集+分片)
- 搭建高可用mongodb集群(二)—— 副本集
- 【转】搭建高可用mongodb集群(三)—— 深入副本集内部机制
- 搭建高可用mongodb集群(二)—— 副本集
- 搭建高可用mongodb集群(三)—— 深入副本集内部机制
- 搭建高可用mongodb集群(二)—— 副本
- 基于linux的mongodb3.2副本集+分片集群搭建
- MongoDB 3.0 常见集群的搭建(主从复制,副本集,分片....)
- MongoDB 集群搭建(主从复制、副本及)(五)
- mongodb 集群搭建 分片+副本集
- 搭建高可用MongoDB集群 副本
- MongoDB 3.0 常见集群的搭建(主从复制,副本集,分片....)
- 搭建高可用mongodb集群(二)—— 副本集
- [转]搭建高可用mongodb集群(二)—— 副本集
- 搭建高可用mongodb集群(二)—— 副本集
- 搭建高可用mongodb集群(三)—— 深入副本集内部机制