mongodb集群创建副本

副本集: 
与主从区别在于:1、没有特定的主数据库 2、如果哪个主数据库宕机了,集群中就会推选出一个从属数据库作为主数据库顶上 
这就具备了自动故障恢复功能。 

搭建副本集的环境如下 
mongo集群: 
mongos 192.168.12.107:27021 
config 192.168.12.107:27018 
shard0000 192.168.12.104:27017 
shard0001 192.168.12.104:27019 
shard0002 192.168.12.104:27023 
对testdb数据库里面的usr表以name为key进行了分片 
现在想给shard0000 192.168.12.104:27017搭建副本 192.168.12.104:27030   仲裁 192.168.12.104:27033,并添加到分片中去。 
mongos> db.printShardingStatus() 
--- Sharding Status --- 
  sharding version: { 
"_id" : 1, 
"version" : 3, 
"minCompatibleVersion" : 3, 
"currentVersion" : 4, 
"clusterId" : ObjectId("541a47a9124d847f09e99204") 

  shards: 
{  "_id" : "shard0000",  "host" : "192.168.12.104:27017" } 
{  "_id" : "shard0001",  "host" : "192.168.12.104:27019" } 
{  "_id" : "shard0002",  "host" : "192.168.12.104:27023" } 
  databases: 
{  "_id" : "admin",  "partitioned" : false,  "primary" : "config" } 
{  "_id" : "testdb",  "partitioned" : true,  "primary" : "shard0000" } 
testdb.usr 
shard key: { "name" : 1 } 
chunks: 
shard0000 5 
shard0001 4 
shard0002 5 
{ "name" : { "$minKey" : 1 } } -->> { "name" : "ava0" } on : shard0000 Timestamp(6, 0) 
{ "name" : "ava0" } -->> { "name" : "bobo0" } on : shard0001 Timestamp(3, 1) 
{ "name" : "bobo0" } -->> { "name" : "mengtian57493" } on : shard0001 Timestamp(4, 0) 
{ "name" : "mengtian57493" } -->> { "name" : "师傅10885" } on : shard0001 Timestamp(7, 0) 
{ "name" : "师傅10885" } -->> { "name" : "师傅18160" } on : shard0000 Timestamp(8, 0) 
{ "name" : "师傅18160" } -->> { "name" : "师傅23331" } on : shard0001 Timestamp(9, 0) 
{ "name" : "师傅23331" } -->> { "name" : "师傅337444" } on : shard0000 Timestamp(10, 0) 
{ "name" : "师傅337444" } -->> { "name" : "师傅47982" } on : shard0002 Timestamp(10, 1) 
{ "name" : "师傅47982" } -->> { "name" : "师傅583953" } on : shard0002 Timestamp(8, 2) 
{ "name" : "师傅583953" } -->> { "name" : "师傅688087" } on : shard0002 Timestamp(9, 2) 
{ "name" : "师傅688087" } -->> { "name" : "师傅792944" } on : shard0002 Timestamp(9, 4) 
{ "name" : "师傅792944" } -->> { "name" : "张荣达16836" } on : shard0002 Timestamp(9, 5) 
{ "name" : "张荣达16836" } -->> { "name" : "张荣达9999" } on : shard0000 Timestamp(5, 1) 
{ "name" : "张荣达9999" } -->> { "name" : { "$maxKey" : 1 } } on : shard0000 Timestamp(3, 3) 

1、新建目录,并启动副本中的两个mongodb 
[root@testvip1 ~]# ps -ef|grep mongo 
root      3399 18112  0 15:11 pts/0    00:00:02 mongod --dbpath=/mongo_zc --port 27033 --replSet fubentina/192.168.12.104:27017     --仲裁mongo 
root      4547     1  0 Sep24 ?        00:03:49 mongod --dbpath=/mongo3 --port 27023 --fork --logpath=/mongo3/log3/log3.txt --rest     --起rest是监控,也可以不起 
root      4846     1  0 Sep24 ?        00:03:34 mongod --dbpath=/mongo2 --port 27019 --fork --logpath=/mongo2/log2/log2.txt 
root      5259     1  0 15:16 ?        00:00:01 mongod --dbpath=/mongo1 --port 27017 --fork --logpath=/mongo1/log1/log1.txt --replSet fubentina/192.168.12.104:27030   --以新的方式启动27017 
root      5489  3464  0 15:21 pts/2    00:00:00 grep mongo 
root     18446     1  0 Sep24 ?        00:09:04 mongod --dbpath=/mongo1_fuben --port 27030 --fork --logpath=/mongo1_fuben/logfuben.txt --replSet fubentina/192.168.12.104:27017  --启动副本27030 

2、开启副本配置(进入副本中任意一个admin) 
[root@testvip1 mongo3]# mongo 192.168.12.104:27017/admin 
MongoDB shell version: 2.4.6 
connecting to: 192.168.12.104:27017/admin 
> db.runCommand({"replSetInitiate":{"_id":"fubentina","members":[{"_id":1,"host":"192.168.12.104:27017"},{"_id":2,"host":"192.168.12.104:27030"}]}}) 

"info" : "Config now saved locally.  Should come online in about a minute.", 
"ok" : 1 

3、配置仲裁服务器 
指定fubentina中的任意一个服务器端口 
root@testvip1 /]# mongod --dbpath=/mongo_zc --port 27033 --replSet fubentina/192.168.12.104:27017 

4、就发现shard1已经变成了下面这样 
[root@testvip1 mongo3]# mongo 192.168.12.104:27017/admin 
MongoDB shell version: 2.4.6 
connecting to: 192.168.12.104:27017/admin 
fubentina:PRIMARY> 

5、添加仲裁节点 
fubentina:PRIMARY> rs.addArb("192.168.12.104:27033") 
{ "ok" : 1 } 

6、使用rs.status()查看集群中的服务器状态。 
fubentina:PRIMARY> rs.status() 

"set" : "fubentina", 
"date" : ISODate("2014-09-24T09:22:38Z"), 
"myState" : 1, 
"members" : [ 

"_id" : 1, 
"name" : "192.168.12.104:27017", 
"health" : 1, 
"state" : 1, 
"stateStr" : "PRIMARY",      --主 
"uptime" : 413, 
"optime" : Timestamp(1411550517, 1), 
"optimeDate" : ISODate("2014-09-24T09:21:57Z"), 
"self" : true 
}, 

"_id" : 2, 
"name" : "192.168.12.104:27030", 
"health" : 1, 
"state" : 2, 
"stateStr" : "SECONDARY",    --从 
"uptime" : 373, 
"optime" : Timestamp(1411550517, 1), 
"optimeDate" : ISODate("2014-09-24T09:21:57Z"), 
"lastHeartbeat" : ISODate("2014-09-24T09:22:37Z"), 
"lastHeartbeatRecv" : ISODate("2014-09-24T09:22:37Z"), 
"pingMs" : 0, 
"syncingTo" : "192.168.12.104:27017" 
}, 

"_id" : 3, 
"name" : "192.168.12.104:27033", 
"health" : 1, 
"state" : 7, 
"stateStr" : "ARBITER",     --仲裁 
"uptime" : 41, 
"lastHeartbeat" : ISODate("2014-09-24T09:22:37Z"), 
"lastHeartbeatRecv" : ISODate("2014-09-24T09:22:37Z"), 
"pingMs" : 0 

], 
"ok" : 1 

如果某一个挂掉了或者没起来,就会发现stateStr 显示成:"stateStr" : "(not reachable/healthy)", 

7、副本创建成功,下一步就是解决分片的问题,我们需要先删除分片shard0000,让数据移动到其他分片 
mongos> db.runCommand({"removeshard":"192.168.12.104:27017"}) 

"msg" : "draining ongoing", 
"state" : "ongoing", 
"remaining" : { 
"chunks" : NumberLong(0),  ---显示的是数据移动的剩余量,为0表示数据已经全部移走了 
"dbs" : NumberLong(2)     --这里需要注意,要将两个数据库的primary也移一下 
}, 
"note" : "you need to drop or movePrimary these databases",  --看这里的提示 
"dbsToMove" : [ 
"test", 
"testdb" 
], 
"ok" : 1 

mongos> use admin 
switched to db admin 
mongos> db.runCommand({moveprimary:"testdb",to:"shard0001"})  --将主移动到另一个分片上 
{ "primary " : "shard0001:192.168.12.104:27019", "ok" : 1 } 

mongos> db.runCommand({moveprimary:"test",to:"shard0001"}) 
{ "primary " : "shard0001:192.168.12.104:27019", "ok" : 1 } 

mongos> db.runCommand({removeshard:"192.168.12.104:27017"})   --这样就可以成功移除 

"msg" : "removeshard completed successfully", 
"state" : "completed", 
"shard" : "shard0000", 
"ok" : 1 

Do not run the movePrimary until you have finished draining the shard 
也就是说,一定要等到分片数据迁移完了,再运行movePrimary命令!!! 
而且这句命令不像removeshard是异步的,这个movePrimary命令会等到将所有非分片数据都移到其他服务器后,才响应,所以时间有可能会比较长,主要还是看这个服务器上,非分片数据有多少。 
另外,movePrimary执行完后,还记得将db.runCommand({removeshard:"shardx"})再运行一遍,直到看到如下结果{ msg: "remove shard completed successfully" , stage: "completed", host: "mongodb0", ok : 1 } 
到此为止,迁移才真正完成,可以放心地关闭mongod。 

8、删除原192.168.12.104:27017里面的testdb库 
mongos> db.runCommand({addshard:"fubentina/192.168.12.104:27017,192.168.12.104:27030,192.168.12.104:27033"}) 

"ok" : 0, 
"errmsg" : "can't add shard fubentina/192.168.12.104:27017,192.168.12.104:27030,192.168.12.104:27033 because a local database 'testdb' exists in another shard0000:192.168.12.104:27017" 
} ---添加副本的时候,因为检测到12.104:27017上面存在testdb这个同名数据库,因此无法添加成功。 

connecting to: 192.168.12.104:27017/admin 
fubentina:PRIMARY> show dbs 
local 1.078125GB 
testdb 0.453125GB 
fubentina:PRIMARY> use testdb 
switched to db testdb 
fubentina:PRIMARY> db.usr.drop(); 
true 
fubentina:PRIMARY> db.dropDatabase(); 
{ "dropped" : "testdb", "ok" : 1 } 

9、添加副本集到分片 
mongos> db.runCommand({addshard:"192.168.12.104:27017"});   --直接添加副本中的一个是不行的,要一起添加 

"ok" : 0, 
"errmsg" : "host is part of set: fubentina use replica set url format <setname>/<server1>,<server2>,...." 

添加副本集 
mongos> db.runCommand({addshard:"fubentina/192.168.12.104:27017,192.168.12.104:27030,192.168.12.104:27033"}) --最后一个是仲裁 
{ "shardAdded" : "fubentina", "ok" : 1 } 

10、查看分片信息 
mongos> db.printShardingStatus() 
--- Sharding Status --- 
  sharding version: { 
"_id" : 1, 
"version" : 3, 
"minCompatibleVersion" : 3, 
"currentVersion" : 4, 
"clusterId" : ObjectId("541a47a9124d847f09e99204") 

  shards: 
{  "_id" : "fubentina",  "host" : "fubentina/192.168.12.104:27017,192.168.12.104:27030" }   ---显示的是副本集 
{  "_id" : "shard0001",  "host" : "192.168.12.104:27019" } 
{  "_id" : "shard0002",  "host" : "192.168.12.104:27023" } 
  databases: 
{  "_id" : "admin",  "partitioned" : false,  "primary" : "config" } 
{  "_id" : "testdb",  "partitioned" : true,  "primary" : "shard0001" } 
testdb.usr 
shard key: { "name" : 1 } 
chunks: 
fubentina 4 
shard0001 5 
shard0002 5 
{ "name" : { "$minKey" : 1 } } -->> { "name" : "ava0" } on : fubentina Timestamp(16, 0)   --已经有数据被分配到这个副本 
{ "name" : "ava0" } -->> { "name" : "bobo0" } on : fubentina Timestamp(18, 0) 
{ "name" : "bobo0" } -->> { "name" : "mengtian57493" } on : shard0001 Timestamp(18, 1) 
{ "name" : "mengtian57493" } -->> { "name" : "师傅10885" } on : shard0001 Timestamp(7, 0) 
{ "name" : "师傅10885" } -->> { "name" : "师傅18160" } on : shard0001 Timestamp(12, 0) 
{ "name" : "师傅18160" } -->> { "name" : "师傅23331" } on : shard0001 Timestamp(9, 0) 
{ "name" : "师傅23331" } -->> { "name" : "师傅337444" } on : fubentina Timestamp(17, 0) 
{ "name" : "师傅337444" } -->> { "name" : "师傅47982" } on : fubentina Timestamp(19, 0) 
{ "name" : "师傅47982" } -->> { "name" : "师傅583953" } on : shard0002 Timestamp(19, 1) 
{ "name" : "师傅583953" } -->> { "name" : "师傅688087" } on : shard0002 Timestamp(9, 2) 
{ "name" : "师傅688087" } -->> { "name" : "师傅792944" } on : shard0002 Timestamp(9, 4) 
{ "name" : "师傅792944" } -->> { "name" : "张荣达16836" } on : shard0002 Timestamp(9, 5) 
{ "name" : "张荣达16836" } -->> { "name" : "张荣达9999" } on : shard0001 Timestamp(14, 0) 
{ "name" : "张荣达9999" } -->> { "name" : { "$maxKey" : 1 } } on : shard0002 Timestamp(15, 0) 
{  "_id" : "test",  "partitioned" : false,  "primary" : "shard0001" } 
{  "_id" : "usr",  "partitioned" : false,  "primary" : "shard0001" } 

11、查看 
连接到副本中的一个点 
[root@testvip1 ~]# mongo 192.168.12.104:27017/admin 
MongoDB shell version: 2.4.6 
connecting to: 192.168.12.104:27017/admin 
fubentina:PRIMARY> show dbs 
local 1.078125GB 
testdb 0.453125GB 
fubentina:PRIMARY> use testdb 
switched to db testdb 
fubentina:PRIMARY> db.usr.count()   --可以查到数据 
283898 

[root@testvip1 ~]# mongo 192.168.12.104:27030/admin 
MongoDB shell version: 2.4.6 
connecting to: 192.168.12.104:27030/admin 
fubentina:SECONDARY> show dbs 
local 1.078125GB 
testdb 0.453125GB 
fubentina:SECONDARY> use testdb 
switched to db testdb 
fubentina:SECONDARY> db.usr.count() 
Thu Sep 25 15:01:33.879 count failed: { "note" : "from execCommand", "ok" : 0, "errmsg" : "not master" } at src/mongo/shell/query.js:180  --现在27030是副本,所以查看不了数据 

副本集终于添加成功 

12、进行测试 
将27017给kill掉 
kill 4353 
[root@testvip1 ~]# mongo 192.168.12.104:27017/admin 
MongoDB shell version: 2.4.6 
connecting to: 192.168.12.104:27017/admin 
fubentina:PRIMARY> rs.status() 
Thu Sep 25 15:11:49.785 DBClientCursor::init call() failed 
Thu Sep 25 15:11:49.788 Error: error doing query: failed at src/mongo/shell/query.js:78 
Thu Sep 25 15:11:49.789 trying reconnect to 192.168.12.104:27017 
Thu Sep 25 15:11:49.789 reconnect 192.168.12.104:27017 failed couldn't connect to server 192.168.12.104:27017  --不能连接 

[root@viptest2 ~]# mongo 192.168.12.107:27021/admin 
MongoDB shell version: 2.4.6 
connecting to: 192.168.12.107:27021/admin 
mongos> use testdb 
switched to db testdb 
mongos> db.usr.find({"name":"ava100"})        ---能正常查到副本集的数据 
{ "_id" : ObjectId("541bd1573351616d81bb07e7"), "name" : "ava100", "address" : "yichangdong", "age" : 50 } 

直接连到27030上去看 
[root@testvip1 ~]# mongo 192.168.12.104:27030/admin 
MongoDB shell version: 2.4.6 
connecting to: 192.168.12.104:27030/admin 
fubentina:PRIMARY> show dbs 
local 1.078125GB 
testdb 0.453125GB 
fubentina:PRIMARY> use testdb 
switched to db testdb 
fubentina:PRIMARY> db.usr.count() 
283898 
fubentina:PRIMARY> db.usr.find({"name":"ava100"}) 
{ "_id" : ObjectId("541bd1573351616d81bb07e7"), "name" : "ava100", "address" : "yichangdong", "age" : 50 } 

13、将27017起来,去看下rs.status() 
mongod --dbpath=/mongo1 --port 27017 --fork --logpath=/mongo1/log1/log1.txt --replSet fubentina/192.168.12.104:27030 
[root@testvip1 ~]# mongo 192.168.12.104:27017/admin 
MongoDB shell version: 2.4.6 
connecting to: 192.168.12.104:27017/admin 
fubentina:SECONDARY> rs.status() 

"set" : "fubentina", 
"date" : ISODate("2014-09-25T07:58:41Z"), 
"myState" : 2, 
"syncingTo" : "192.168.12.104:27030", 
"members" : [ 

"_id" : 1, 
"name" : "192.168.12.104:27017", 
"health" : 1, 
"state" : 2, 
"stateStr" : "SECONDARY",    --启动后它变成了副本 
"uptime" : 2551, 
"optime" : Timestamp(1411628295, 2057), 
"optimeDate" : ISODate("2014-09-25T06:58:15Z"), 
"self" : true 
}, 

"_id" : 2, 
"name" : "192.168.12.104:27030", 
"health" : 1, 
"state" : 1, 
"stateStr" : "PRIMARY",    --它变成了主 
"uptime" : 2551, 
"optime" : Timestamp(1411628295, 2057), 
"optimeDate" : ISODate("2014-09-25T06:58:15Z"), 
"lastHeartbeat" : ISODate("2014-09-25T07:58:41Z"), 
"lastHeartbeatRecv" : ISODate("2014-09-25T07:58:39Z"), 
"pingMs" : 0 
}, 

"_id" : 3, 
"name" : "192.168.12.104:27033", 
"health" : 1, 
"state" : 7, 
"stateStr" : "ARBITER",    -它依然是仲裁 
"uptime" : 2549, 
"lastHeartbeat" : ISODate("2014-09-25T07:58:41Z"), 
"lastHeartbeatRecv" : ISODate("2014-09-25T07:58:40Z"), 
"pingMs" : 0 

], 
"ok" : 1 

验证ok 

时间: 2024-09-17 21:06:51

mongodb集群创建副本的相关文章

搭建mongodb集群(副本集+分片)

搭建mongodb集群(副本集+分片) 转载自:http://blog.csdn.net/bluejoe2000/article/details/41323051 完整的搭建mongodb集群(副本集+分片)的例子... 准备四台机器,分别是bluejoe1,bluejoe2,bluejoe3,以及bluejoe0 副本集及分片策略确定如下:   将创建3个副本集,命名为shard1,shard2,shard3: 以上3个副本集作为3个分片: 每个副本集包含3个副本(主.辅1.辅2): 副本分开

mongodb集群搭建 副本集内部机制原理

副本集故障转移,主节点是如何选举的?能否手动干涉下架某一台主节点. 官方说副本集数量最好是奇数,为什么? mongodb副本集是如何同步的?如果同步不及时会出现什么情况?会不会出现不一致性? mongodb的故障转移会不会无故自动发生?什么条件会触发?频繁触发可能会带来系统负载加重? Bully算法 mongodb副本集故障转移功能得益于它的选举机制.选举机制采用了Bully算法,可以很方便从分布式节点中选出主节点.一个分布式集群架构中一般都有一个所谓的主节点,可以有很多用途,比如缓存机器节点元

搭建高可用的MongoDB集群(上):MongoDB的配置与副本集

传统的关系数据库具有不错的性能及稳定性,同时,久经历史考验,许多优秀的数据库沉淀了下来,比如MySQL.然而随着数据体积的爆发性增长,数据类型的增多,许多传统关系数据库扩展难的特点也爆发了出来,NoSQL数据库也应运而生.然而区别于以往的使用方法,许多NoSQL都有着自己的限制,从而也导致了入门难的问题.这里我们为大家分享上海创行科技技术总监严澜的博文--如何搭建高效的MongoDB集群. 以下为原文 在大数据的时代,传统的关系型数据库要能更高的服务必须要解决高并发读写.海量数据高效存储.高可扩

高可用的MongoDB集群

1.序言 MongoDB 是一个可扩展的高性能,开源,模式自由,面向文档的数据库. 它使用 C++编写.MongoDB 包含一下特点: l  面向集合的存储:适合存储对象及JSON形式的数据. l  动态查询:Mongo 支持丰富的查询方式,查询指令使用 JSON 形式的标记,可轻易查询文档中内嵌的对象及数组. l  完整的索引支持:包括文档内嵌对象及数组.Mongo 的查询优化器会分析查询表达式,并生成一个高效的查询计划. l  查询监视:Mongo包含一个监控工具用于分析数据库操作性

手把手教你用Docker部署一个MongoDB集群

本文讲的是手把手教你用Docker部署一个MongoDB集群,[编者的话]MongoDB是一个介于关系数据库和非关系数据库之间的产品,是非关系数据库当中最像关系数据库的.支持类似于面向对象的查询语言,几乎可以实现类似关系数据库单表查询的绝大部分功能,而且还支持对数据建立索引.本文介绍了如何使用Docker搭建MongoDB集群. 本文我会向大家介绍如何使用Docker部署一个MongoDB集群,具体如下: 2.6.5版本的MongoDB 有3个节点的副本集(Replica set) 身份验证 持

Docker搭建MongoDB集群解细步骤教程

本文我会向大家介绍如何使用Docker部署一个MongoDB集群,具体如下:     2.6.5版本的MongoDB     有3个节点的副本集(Replica set)     身份验证     持久化数据到本地文件系统 首先要准备三个运行的Docker服务器,这意味着你要准备一个安装了Docker的本地Vagrant Box虚拟机(系统可以使用CoreOS)或者使用AWS或者其它的你喜欢的方式. Step1 你要拿到3台Docker服务器的IP地址,并且将下面给出的IP地址配置到所有的服务器

搭建高可用MongoDB集群(分片)

MongoDB基础请参考:http://blog.51cto.com/kaliarch/2044423 MongoDB(replica set)请参考:http://blog.51cto.com/kaliarch/2044618 一.概述 1.1 背景 为解决mongodb在replica set每个从节点上面的数据库均是对数据库的全量拷贝,从节点压力在高并发大数据量的场景下存在很大挑战,同时考虑到后期mongodb集群的在数据压力巨大时的扩展性,应对海量数据引出了分片机制. 1.2 分片概念

MongoDB集群和实战详解

1.概述 最近有同学和网友私信我,问我MongoDB方面的问题;这里我整理一篇博客来赘述下MongoDB供大家学习参考,博客的目录内容如下: 基本操作 CRUD MapReduce 本篇文章是基于MongoDB集群(Sharding+Replica Sets)上演示的,故操作的内容都是集群层面的,所以有些命令和单独的使用MongoDB库有异样. 2.基本操作 常用的 Shell 命令如下所示: db.help()    # 数据库帮助  db.collections.help()    # 集合

高可用的MongoDB集群-实战篇

1.概述 最近有同学和网友私信我,问我MongoDB方面的问题:这里我整理一篇博客来赘述下MongoDB供大家学习参考,博客的目录内容如下: 基本操作 CRUD MapReduce 本篇文章是基于MongoDB集群(Sharding+Replica Sets)上演示的,故操作的内容都是集群层面的,所以有些命令和单独的使用MongoDB库有异样.具体集群搭建可以参考我写的<高可用的MongoDB集群>. 2.基本操作 常用的 Shell 命令如下所示: db.help() # 数据库帮助 db.