Nosql Mongodb之旅(24)—MongoDB Replica Sets

一、读写分离

    从库能进行查询,这样可以分担主库的大量的查询请求。

    1、先向主库中插入一条测试数据

[plain]  view plain copy
  1. [root@localhost bin]# ./mongo --port 28010  
  2. MongoDB shell version: 1.8.1  
  3. connecting to: 127.0.0.1:28010/test  
  4. rs1:PRIMARY> db.c1.insert({age:30})  
  5. db.c2rs1:PRIMARY> db.c1.find()  
  6. { "_id" : ObjectId("4fc77f421137ea4fdb653b4a"), "age" : 30 }  
    2、在从库中进行查询等操作
[plain]  view plain copy
  1. [root@localhost bin]# ./mongo --port 28011  
  2. MongoDB shell version: 1.8.1  
  3. connecting to: 127.0.0.1:28011/test  
  4. rs1:SECONDARY> show collections  
  5. Thu May 31 22:27:17 uncaught exception: error: { "$err" : "not master and slaveok=false",  
  6. "code" : 13435 }  
  7. rs1:SECONDARY>  
    查询报错,说明是个从库且不能执行查询的操作

    3、让从库可以读,分担主库的压力  

[plain]  view plain copy
  1. rs1:SECONDARY> db.getMongo().setSlaveOk()  
  2. not master and slaveok=false  
  3. rs1:SECONDARY> show collections  
  4. c1  
  5. system.indexes  
  6. rs1:SECONDARY> db.c1.find()  
  7. { "_id" : ObjectId("4fc77f421137ea4fdb653b4a"), "age" : 30 }  
  8. rs1:SECONDARY>  
    我们做到了。

    二、故障转移

   复制集比传统的Master-Slave 有改进的地方就是他可以进行故障的自动转移,如果我们停掉复制集中的一个成员,那么剩余成员会再自动选举出一个成员,做为主库,例如:我们将28010 这个主库停掉,然后再看一下复制集的状态 

    测试:

    1、kill 28010端口的MongoDB

[plain]  view plain copy
  1. [root@localhost bin]# ps aux|grep mongod  
  2. root 6706 1.6 6.9 463304 6168 Sl 21:49 0:26  
  3. /Apps/mongo/bin/mongod --replSet rs1 --keyFile /data/key/r0 --fork --port 28010  
  4. root 6733 0.4 6.7 430528 6044 ? Sl 21:50 0:06  
  5. /Apps/mongo/bin/mongod --replSet rs1 --keyFile /data/key/r1 --fork --port 28011  
  6. root 6747 0.4 4.7 431548 4260 ? Sl 21:50 0:06  
  7. /Apps/mongo/bin/mongod --replSet rs1 --keyFile /data/key/r2 --fork --port 28012  
  8. root 7019 0.0 0.7 5064 684 pts/2 S+ 22:16 0:00 grep mongod  
  9. [root@localhost bin]# kill -9 6706  
    2、再查看复制集状态
[plain]  view plain copy
  1. [root@localhost bin]# ./mongo --port 28011  
  2. MongoDB shell version: 1.8.1  
  3. connecting to: 127.0.0.1:28011/test  
  4. rs1:SECONDARY> rs.status()  
  5. {  
  6. "set" : "rs1",  
  7. "date" : ISODate("2012-05-31T14:17:03Z"),  
  8. "myState" : 2,  
  9. "members" : [  
  10. {  
  11. "_id" : 0,  
  12. "name" : "localhost:28010",  
  13. "health" : 0,  
  14. "state" : 1,  
  15. "stateStr" : "(not reachable/healthy)",  
  16. "uptime" : 0,  
  17. "optime" : {  
  18. "t" : 1338472279000,  
  19. "i" : 1  
  20. },  
  21. "optimeDate" : ISODate("2012-05-31T13:51:19Z"),  
  22. "lastHeartbeat" : ISODate("2012-05-31T14:16:42Z"),  
  23. "errmsg" : "socket exception"  
  24. },  
  25. {  
  26. "_id" : 1,  
  27. "name" : "localhost:28011",  
  28. "health" : 1,  
  29. "state" : 2,  
  30. "stateStr" : "SECONDARY",  
  31. "optime" : {  
  32. "t" : 1338472279000,  
  33. "i" : 1  
  34. },  
  35. "optimeDate" : ISODate("2012-05-31T13:51:19Z"),  
  36. "self" : true  
  37. },  
  38. {  
  39. "_id" : 2,  
  40. "name" : "localhost:28012",  
  41. "health" : 1,  
  42. "state" : 1,  
  43. "stateStr" : "PRIMARY",  
  44. "uptime" : 1528,  
  45. "optime" : {  
  46. "t" : 1338472279000,  
  47. "i" : 1  
  48. },  
  49. "optimeDate" : ISODate("2012-05-31T13:51:19Z"),  
  50. "lastHeartbeat" : ISODate("2012-05-31T14:17:02Z")  
  51. }  
  52. ],  
  53. "ok" : 1  
  54. }  
  55. rs1:SECONDARY>     
[plain]  view plain copy
  1. "stateStr" : "(not reachable/healthy)",  
    可以看到28010 这个端口的MongoDB 出现了异常,而系统自动选举了28012 这个端口为主,所以这样的故障处理机制,能将系统的稳定性大大提高。

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