mongoDB3.4主从复制实现(第一种情况亲测)

来源:互联网 发布:淘宝模特余露工作室 编辑:程序博客网 时间:2024/06/16 03:13

第一种:

  •     开启两个mongodb进程,模拟两台机器;
  •     一个为master主服务器,另一个为slave从服务器;
  •     主服务器down机后,从服务器不会成为主服务器。
[python] view plain copy
  1. #在当前目录下创建mongodb的数据文件  
  2. zheng@zheng:~$ cd ./mongodbTest/  
  3. mkdir ./t1/db  
  4. mkdir ./t2/db  
  5. mkdir ./t1/log  
  6. mkdir ./t2/log  
  7. touch ./t1/log/mongodb.log  
  8. touch ./t2/log/mongodb.log  
  9.   
  10. zheng@zheng:~/mongodbTest$ tree  
  11. .  
  12. ├── t1  
  13. │   ├── db  
  14. │   └── log  
  15. │       └── mongodb.log  
  16. └── t2  
  17.     ├── db  
  18.     └── log  
  19.         └── mongodb.log  
  20.   
  21. #设置主服务器,并启动服务  
  22. mongod --dbpath ./t1/db --logpath ./t1/log/mongodb.log  --port 50001 --logappend --fork --master  
  23.   
  24. #设置从服务器,并启动服务。--source ip:port,设置其主服务器  
  25. mongod --dbpath ./t2/db --logpath ./t2/log/mongodb.log  --port 50002 --logappend --fork --slave --source 127.0.0.1:50001  
  26.   
  27. #进入主数据库  
  28. mongo --port 50001  
  29.   
  30. #在主数据库插入数据  
  31. > use stu  
  32. switched to db stu  
  33. for(i=1;i<1000;i++){  
  34.     db.s.insert({name:'hi'+1}  
  35. )}  
  36. WriteResult({ "nInserted" : 1 })  
  37. > db.s.find().count()  
  38. 999  
  39.   
  40. #进入从数据库  
  41. mongo --port 50002  
  42.   
  43. #在从数据库查询  
  44. > show dbs  
  45. 2017-09-14T16:54:56.790+0800 E QUERY    [main] Error: listDatabases failed:{  
  46.     "ok" : 0,  
  47.     "errmsg" : "not master and slaveOk=false",  
  48.     "code" : 13435,  
  49.     "codeName" : "NotMasterNoSlaveOk"  
  50. } :  
  51. #从数据库无法查看数据库,使用rs.slaveOk()  
  52. > rs.slaveOk()  
  53. > show dbs  
  54. admin  0.000GB  
  55. local  0.000GB  
  56. stu    0.000GB  
  57. > use stu  
  58. switched to db stu  
  59. > show collections  
  60. s  
  61. > db.s.find().count()  
  62. 999  
  63. #从数据库无法插入数据  
  64. > db.stu.insert({name:'hello'})  
  65. WriteResult({ "writeError" : { "code" : 10107"errmsg" : "not master" } })  

第二种:副本集

  •     主服务器down机后,从服务器自动切换。
[python] view plain copy
  1. #在当前目录下创建mongodb的数据文件  
  2. zheng@zheng:~$ cd ./mongodbTest/  
  3. zheng@zheng:~/mongodbTest$ tree  
  4. .  
  5. ├── t1  
  6. │   ├── db  
  7. │   └── log  
  8. │       └── mongodb.log  
  9. ├── t2  
  10. │   ├── db  
  11. │   └── log  
  12. │       └── mongodb.log  
  13. └── t3  
  14.     ├── db  
  15.     └── log  
  16.         └── mongodb.log  
  17.   
  18. #启动三个mongodb进程,--replSet name:设置三个mongodb在同一个副本下  
  19. mongod --bind_ip 192.168.14.12 --port 50001 --dbpath ./t1/db --logpath ./t1/log/mongodb.log --logappend --fork --replSet zheng  
  20. mongod --bind_ip 192.168.14.12 --port 50002 --dbpath ./t2/db --logpath ./t2/log/mongodb.log --logappend --fork --replSet zheng  
  21. mongod --bind_ip 192.168.14.12 --port 50003 --dbpath ./t3/db --logpath ./t3/log/mongodb.log --logappend --fork --replSet zheng  
  22.   
  23. #连接主服务器,此处设置192.168.14.12:50001为主服务器  
  24. mongo --host 192.168.14.12 --port 50001  
  25.   
  26. #初始化,哪个服务器先初始化就是主服务器  
  27. rs.initiate()  
  28.   
  29. #初始化后,提示符变为zheng:SECONDARY>   
  30. > rs.initiate()  
  31. {  
  32.     "info2" : "no configuration specified. Using a default configuration for the set",  
  33.     "me" : "zheng:50001",  
  34.     "ok" : 1  
  35. }  
  36. zheng:SECONDARY>   
  37.   
  38. #查看当前状态  
  39. rs.status()  

[python] view plain copy
  1. #提示符变为  
  2. zheng:PRIMARY>  
  3.   
  4. #添加副本集  
  5. rs.add('192.168.14.12:50002')  
  6. rs.add('192.168.14.12:50003')  
[python] view plain copy
  1. #副本集添加成功后,当前状态如图  


[python] view plain copy
  1. #向主服务器中插入数据  
  2. zheng:PRIMARY> db  
  3. test  
  4. zheng:PRIMARY> for(i=0;i<=10;i++){db.t.insert({name:'name'+i})}  
  5. WriteResult({ "nInserted" : 1 })  
  6. zheng:PRIMARY> db.t.find().count()  
  7. 11  
  8.   
  9.   
  10. #启动从服务器  
  11. mongo --host 192.168.14.12 --port 50002  
  12. mongo --host 192.168.14.12 --port 50003  
  13.   
  14. #查看数据  
  15. zheng:SECONDARY> rs.slaveOk()  
  16. zheng:SECONDARY> db.t.find()  
  17. "_id" : ObjectId("59ba7f2060170e82e7b65e89"), "name" : "name0" }  
  18. "_id" : ObjectId("59ba7f2060170e82e7b65e8a"), "name" : "name1" }  
  19. "_id" : ObjectId("59ba7f2060170e82e7b65e8b"), "name" : "name2" }  
  20. "_id" : ObjectId("59ba7f2060170e82e7b65e8d"), "name" : "name4" }  
  21. "_id" : ObjectId("59ba7f2060170e82e7b65e8c"), "name" : "name3" }  
  22. "_id" : ObjectId("59ba7f2060170e82e7b65e8e"), "name" : "name5" }  
  23. "_id" : ObjectId("59ba7f2060170e82e7b65e8f"), "name" : "name6" }  
  24. "_id" : ObjectId("59ba7f2060170e82e7b65e90"), "name" : "name7" }  
  25. "_id" : ObjectId("59ba7f2060170e82e7b65e91"), "name" : "name8" }  
  26. "_id" : ObjectId("59ba7f2060170e82e7b65e92"), "name" : "name9" }  
  27. "_id" : ObjectId("59ba7f2060170e82e7b65e93"), "name" : "name10"}  
  28.   
  29. #删除从服务器  
  30. rs.remove('192.168.14.12:50002')  

#注意
关闭主服务器后,再重新启动,会发现原来的从服务器变为了从服务器,新启动的服务器(原来的从服务器)变为了从服务器


第三种:

  • 可设置优先级,优先级最高的就先为主服务器;
  • 主服务器down机后,优先级高的为新的主服务器。


[python] view plain copy
  1. #启动三个mongodb进程,--replSet name:设置三个mongodb在同一个副本下  
  2. 和上面一样......  
  3.   
  4. #启动mongo服务器  
  5. mongo --host 192.168.14.12 --port 50001  
  6.   
  7. #设置主从服务器  
  8. use admin  
  9. db.runCommand({"replSetInitiate":{"_id":"zheng","members":[{"_id":1,"host":"192.168.14.12:50001","priority":3},{"_id":2,"host":"192.168.14.12:50002","priority":2},{"_id":3,"host":"192.168.14.12:50003","priority":1}]}})  
  10.   
  11. #查看当前状态  
  12. zheng:OTHER> rs.status()  
  13. {  
  14.     "set" : "zheng",  
  15.     "date" : ISODate("2017-09-14T13:43:58.663Z"),  
  16.     "myState" : 1,  
  17.     "term" : NumberLong(1),  
  18.     "heartbeatIntervalMillis" : NumberLong(2000),  
  19.     "optimes" : {  
  20.         "lastCommittedOpTime" : {  
  21.             "ts" : Timestamp(15053966362),  
  22.             "t" : NumberLong(1)  
  23.         },  
  24.         "appliedOpTime" : {  
  25.             "ts" : Timestamp(15053966362),  
  26.             "t" : NumberLong(1)  
  27.         },  
  28.         "durableOpTime" : {  
  29.             "ts" : Timestamp(15053966362),  
  30.             "t" : NumberLong(1)  
  31.         }  
  32.     },  
  33.     "members" : [  
  34.         {  
  35.             "_id" : 1,  
  36.             "name" : "192.168.14.12:50001",  
  37.             "health" : 1,  
  38.             "state" : 1,  
  39.             "stateStr" : "PRIMARY",  
  40.             "uptime" : 347,  
  41.             "optime" : {  
  42.                 "ts" : Timestamp(15053966362),  
  43.                 "t" : NumberLong(1)  
  44.             },  
  45.             "optimeDate" : ISODate("2017-09-14T13:43:56Z"),  
  46.             "infoMessage" : "could not find member to sync from",  
  47.             "electionTime" : Timestamp(15053966361),  
  48.             "electionDate" : ISODate("2017-09-14T13:43:56Z"),  
  49.             "configVersion" : 1,  
  50.             "self" : true  
  51.         },  
  52.         {  
  53.             "_id" : 2,  
  54.             "name" : "192.168.14.12:50002",  
  55.             "health" : 1,  
  56.             "state" : 2,  
  57.             "stateStr" : "SECONDARY",  
  58.             "uptime" : 12,  
  59.             "optime" : {  
  60.                 "ts" : Timestamp(15053966362),  
  61.                 "t" : NumberLong(1)  
  62.             },  
  63.             "optimeDurable" : {  
  64.                 "ts" : Timestamp(15053966362),  
  65.                 "t" : NumberLong(1)  
  66.             },  
  67.             "optimeDate" : ISODate("2017-09-14T13:43:56Z"),  
  68.             "optimeDurableDate" : ISODate("2017-09-14T13:43:56Z"),  
  69.             "lastHeartbeat" : ISODate("2017-09-14T13:43:58.317Z"),  
  70.             "lastHeartbeatRecv" : ISODate("2017-09-14T13:43:58.153Z"),  
  71.             "pingMs" : NumberLong(0),  
  72.             "syncingTo" : "192.168.14.12:50001",  
  73.             "configVersion" : 1  
  74.         },  
  75.         {  
  76.             "_id" : 3,  
  77.             "name" : "192.168.14.12:50003",  
  78.             "health" : 1,  
  79.             "state" : 2,  
  80.             "stateStr" : "SECONDARY",  
  81.             "uptime" : 12,  
  82.             "optime" : {  
  83.                 "ts" : Timestamp(15053966362),  
  84.                 "t" : NumberLong(1)  
  85.             },  
  86.             "optimeDurable" : {  
  87.                 "ts" : Timestamp(15053966362),  
  88.                 "t" : NumberLong(1)  
  89.             },  
  90.             "optimeDate" : ISODate("2017-09-14T13:43:56Z"),  
  91.             "optimeDurableDate" : ISODate("2017-09-14T13:43:56Z"),  
  92.             "lastHeartbeat" : ISODate("2017-09-14T13:43:58.317Z"),  
  93.             "lastHeartbeatRecv" : ISODate("2017-09-14T13:43:58.152Z"),  
  94.             "pingMs" : NumberLong(0),  
  95.             "syncingTo" : "192.168.14.12:50001",  
  96.             "configVersion" : 1  
  97.         }  
  98.     ],  
  99.     "ok" : 1  


来源:http://blog.csdn.net/zheng_lan_fang/article/details/77986007

原创粉丝点击