Nosql Mongodb之旅(25)—MongoDB Replica Sets增加节点

MongoDB Replica Sets 不仅提供高可用性的解决方案,它也同时提供负载均衡的解决方案,增减Replica Sets 节点在实际应用中非常普遍,例如当应用的读压力暴增时,3 台节点的环境已不能满足需求,那么就需要增加一些节点将压力平均分配一下。

    增加节点

    两种方式:一是通过oplog增加节点,二是通过数据库快照和oplog来增加节点

    通过oplog增加节点

    1、配置并启动新节点,启用28013这个端口给新的节点

[plain]  view plain copy
  1. root@localhost ~]# mkdir -p /data/data/r3  
  2. [root@localhost ~]# echo "this is rs1 super secret key" > /data/key/r3  
  3. [root@localhost ~]# chmod 600 /data/key/r3  
  4. [root@localhost ~]# /Apps/mongo/bin/mongod --replSet rs1 --keyFile /data/key/r3 --fork --port  
  5. 28013 --dbpath /data/data/r3 --logpath=/data/log/r3.log --logappend  
  6. all output going to: /data/log/r3.log  
  7. forked process: 10553  
  8. [root@localhost ~]#  
    2、添加此新节点到现有的Replica Sets
[plain]  view plain copy
  1. rs1:PRIMARY> rs.add("localhost:28013")  
  2. { "ok" : 1 }  
    3、查看Replica Sets,我们可以清晰的看到内部是如何添加28013这个新节点的

    (1)进行初始化

[plain]  view plain copy
  1. rs1: PRIMARY > rs.status()  
  2. {  
  3. "set" : "rs1",  
  4. "date" : ISODate("2012-05-31T12:17:44Z"),  
  5. "myState" : 1,  
  6. "members" : [  
  7. ……  
  8. {  
  9. "_id" : 3,  
  10. "name" : "localhost:28013",  
  11. "health" : 0,  
  12. "state" : 6,  
  13. "stateStr" : "(not reachable/healthy)",  
  14. "uptime" : 0,  
  15. "optime" : {  
  16. "t" : 0,  
  17. "i" : 0  
  18. },  
  19. "optimeDate" : ISODate("1970-01-01T00:00:00Z"),  
  20. "lastHeartbeat" : ISODate("2012-05-31T12:17:43Z"),  
  21. "errmsg" : "still initializing"  
  22. }  
  23. ],  
  24. "ok" : 1  
  25. }  
    (2)进行数据同步
[plain]  view plain copy
  1. rs1:PRIMARY> rs.status()  
  2. {  
  3. "set" : "rs1",  
  4. "date" : ISODate("2012-05-31T12:18:07Z"),  
  5. "myState" : 1,  
  6. "members" : [  
  7. ……  
  8. {  
  9. "_id" : 3,  
  10. "name" : "localhost:28013",  
  11. "health" : 1,  
  12. "state" : 3,  
  13. "stateStr" : "RECOVERING",  
  14. "uptime" : 16,  
  15. "optime" : {  
  16. "t" : 0,  
  17. "i" : 0  
  18. },  
  19. "optimeDate" : ISODate("1970-01-01T00:00:00Z"),  
  20. "lastHeartbeat" : ISODate("2012-05-31T12:18:05Z"),  
  21. "errmsg" : "initial sync need a member to be primary or secondary  
  22. to do our initial sync"  
  23. }  
  24. ],  
  25. "ok" : 1  
  26. }  
    (3)初始化同步完成
[plain]  view plain copy
  1. rs1:PRIMARY> rs.status()  
  2. {  
  3. "set" : "rs1",  
  4. "date" : ISODate("2012-05-31T12:18:08Z"),  
  5. "myState" : 1,  
  6. "members" : [  
  7. ……  
  8. {  
  9. "_id" : 3,  
  10. "name" : "localhost:28013",  
  11. "health" : 1,  
  12. "state" : 3,  
  13. "stateStr" : "RECOVERING",  
  14. "uptime" : 17,  
  15. "optime" : {  
  16. "t" : 1338466661000,  
  17. "i" : 1  
  18. },  
  19. "optimeDate" : ISODate("2012-05-31T12:17:41Z"),  
  20. "lastHeartbeat" : ISODate("2012-05-31T12:18:07Z"),  
  21. "errmsg" : "initial sync done"  
  22. }  
  23. ],  
  24. "ok" : 1  
  25. }  
    (4)节点添加完成,状态正常
[plain]  view plain copy
  1. rs1:PRIMARY> rs.status()  
  2. {  
  3. "set" : "rs1",  
  4. "date" : ISODate("2012-05-31T12:18:10Z"),  
  5. "myState" : 1,  
  6. "members" : [  
  7. ……  
  8. {  
  9. "_id" : 3,  
  10. "name" : "localhost:28013",  
  11. "health" : 1,  
  12. "state" : 2,  
  13. "stateStr" : "SECONDARY",  
  14. "uptime" : 19,  
  15. "optime" : {  
  16. "t" : 1338466661000,  
  17. "i" : 1  
  18. },  
  19. "optimeDate" : ISODate("2012-05-31T12:17:41Z"),  
  20. "lastHeartbeat" : ISODate("2012-05-31T12:18:09Z")  
  21. }  
  22. ],  
  23. "ok" : 1  
  24. }  
    4、验证数据已经同步过来
[plain]  view plain copy
  1. [root@localhost data]# /Apps/mongo/bin/mongo -port 28013  
  2. MongoDB shell version: 1.8.1  
  3. connecting to: 127.0.0.1:28013/test  
  4. rs1:SECONDARY> rs.slaveOk()  
  5. rs1:SECONDARY> db.c1.find()  
  6. { "_id" : ObjectId("4fc760d2383ede1dce14ef86"), "age" : 10 }  
  7. rs1:SECONDARY>  
    通过数据库快照和oplog增加节点

    通过oplog 直接进行增加节点操作简单且无需人工干预过多,但oplog 是capped collection,采用循环的方式进行日志处理,所以采用oplog 的方式进行增加节点,有可能导致数据的不一致,因为日志中存储的信息有可能已经刷新过了。不过没关系,我们可以通过数据库快照(--fastsync)和oplog 结合的方式来增加节点,这种方式的操作流程是,先取某一个复制集成员的物理文件来做为初始化数据,然后剩余的部分用oplog 日志来追,最终达到数据一致性。

    (1)取某一个复制集成员的物理文件来作为初始化数据

[plain]  view plain copy
  1. [root@localhost ~]# scp -r /data/data/r3 /data/data/r4  
  2. [root@localhost ~]# echo "this is rs1 super secret key" > /data/key/r4  
  3. [root@localhost ~]# chmod 600 /data/key/r4  
    (2)在取完物理文件后,在c1集中插入一条新文档,用于最后验证此更新也同步了
[plain]  view plain copy
  1. rs1:PRIMARY> db.c1.find()  
  2. { "_id" : ObjectId("4fc760d2383ede1dce14ef86"), "age" : 10 }  
  3. rs1:PRIMARY> db.c1.insert({age:20})  
  4. rs1:PRIMARY> db.c1.find()  
  5. { "_id" : ObjectId("4fc760d2383ede1dce14ef86"), "age" : 10 }  
  6. { "_id" : ObjectId("4fc7748f479e007bde6644ef"), "age" : 20 }  
  7. rs1:PRIMARY>  
     (3)启用28014这个端口给新的节点
[plain]  view plain copy
  1. /Apps/mongo/bin/mongod --replSet rs1 --keyFile /data/key/r4 --fork --port 28014 --dbpath  
  2. /data/data/r4 --logpath=/data/log/r4.log --logappend --fastsync  
     (4)添加28014节点
[plain]  view plain copy
  1. rs1:PRIMARY> rs.add("localhost:28014")  
  2. { "ok" : 1 }  
     (5)验证数据已经同步过来
[plain]  view plain copy
  1. [root@localhost data]# /Apps/mongo/bin/mongo -port 28014  
  2. MongoDB shell version: 1.8.1  
  3. connecting to: 127.0.0.1:28014/test  
  4. rs1:SECONDARY> rs.slaveOk()  
  5. rs1:SECONDARY> db.c1.find()  
  6. { "_id" : ObjectId("4fc760d2383ede1dce14ef86"), "age" : 10 }  
  7. { "_id" : ObjectId("4fc7748f479e007bde6644ef"), "age" : 20 }  
  8. rs1:SECONDARY

你可能感兴趣的:(mongodb,数据库,NoSQL,nosql数据库)