第一种:

  • 开启两个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. zheng@zheng:~/mongodbTest$ tree
  10. .
  11. ├── t1
  12. │   ├── db
  13. │   └── log
  14. │       └── mongodb.log
  15. └── t2
  16. ├── db
  17. └── log
  18. └── mongodb.log
  19. #设置主服务器,并启动服务
  20. mongod --dbpath ./t1/db --logpath ./t1/log/mongodb.log  --port 50001 --logappend --fork --master
  21. #设置从服务器,并启动服务。--source ip:port,设置其主服务器
  22. mongod --dbpath ./t2/db --logpath ./t2/log/mongodb.log  --port 50002 --logappend --fork --slave --source 127.0.0.1:50001
  23. #进入主数据库
  24. mongo --port 50001
  25. #在主数据库插入数据
  26. > use stu
  27. switched to db stu
  28. > for(i=1;i<1000;i++){
  29. db.s.insert({name:'hi'+1}
  30. )}
  31. WriteResult({ "nInserted" : 1 })
  32. > db.s.find().count()
  33. 999
  34. #进入从数据库
  35. mongo --port 50002
  36. #在从数据库查询
  37. > show dbs
  38. 2017-09-14T16:54:56.790+0800 E QUERY    [main] Error: listDatabases failed:{
  39. "ok" : 0,
  40. "errmsg" : "not master and slaveOk=false",
  41. "code" : 13435,
  42. "codeName" : "NotMasterNoSlaveOk"
  43. } :
  44. #从数据库无法查看数据库,使用rs.slaveOk()
  45. > rs.slaveOk()
  46. > show dbs
  47. admin  0.000GB
  48. local  0.000GB
  49. stu    0.000GB
  50. > use stu
  51. switched to db stu
  52. > show collections
  53. s
  54. > db.s.find().count()
  55. 999
  56. #从数据库无法插入数据
  57. > db.stu.insert({name:'hello'})
  58. 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. #启动三个mongodb进程,--replSet name:设置三个mongodb在同一个副本下
  18. mongod --bind_ip 192.168.14.12 --port 50001 --dbpath ./t1/db --logpath ./t1/log/mongodb.log --logappend --fork --replSet zheng
  19. mongod --bind_ip 192.168.14.12 --port 50002 --dbpath ./t2/db --logpath ./t2/log/mongodb.log --logappend --fork --replSet zheng
  20. mongod --bind_ip 192.168.14.12 --port 50003 --dbpath ./t3/db --logpath ./t3/log/mongodb.log --logappend --fork --replSet zheng
  21. #连接主服务器,此处设置192.168.14.12:50001为主服务器
  22. mongo --host 192.168.14.12 --port 50001
  23. #初始化,哪个服务器先初始化就是主服务器
  24. rs.initiate()
  25. #初始化后,提示符变为zheng:SECONDARY>
  26. > rs.initiate()
  27. {
  28. "info2" : "no configuration specified. Using a default configuration for the set",
  29. "me" : "zheng:50001",
  30. "ok" : 1
  31. }
  32. zheng:SECONDARY>
  33. #查看当前状态
  34. rs.status()

[python] view plain copy
  1. #提示符变为
  2. zheng:PRIMARY>
  3. #添加副本集
  4. rs.add('192.168.14.12:50002')
  5. 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. mongo --host 192.168.14.12 --port 50002
  10. mongo --host 192.168.14.12 --port 50003
  11. #查看数据
  12. zheng:SECONDARY> rs.slaveOk()
  13. zheng:SECONDARY> db.t.find()
  14. { "_id" : ObjectId("59ba7f2060170e82e7b65e89"), "name" : "name0" }
  15. { "_id" : ObjectId("59ba7f2060170e82e7b65e8a"), "name" : "name1" }
  16. { "_id" : ObjectId("59ba7f2060170e82e7b65e8b"), "name" : "name2" }
  17. { "_id" : ObjectId("59ba7f2060170e82e7b65e8d"), "name" : "name4" }
  18. { "_id" : ObjectId("59ba7f2060170e82e7b65e8c"), "name" : "name3" }
  19. { "_id" : ObjectId("59ba7f2060170e82e7b65e8e"), "name" : "name5" }
  20. { "_id" : ObjectId("59ba7f2060170e82e7b65e8f"), "name" : "name6" }
  21. { "_id" : ObjectId("59ba7f2060170e82e7b65e90"), "name" : "name7" }
  22. { "_id" : ObjectId("59ba7f2060170e82e7b65e91"), "name" : "name8" }
  23. { "_id" : ObjectId("59ba7f2060170e82e7b65e92"), "name" : "name9" }
  24. { "_id" : ObjectId("59ba7f2060170e82e7b65e93"), "name" : "name10"}
  25. #删除从服务器
  26. rs.remove('192.168.14.12:50002')

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

第三种:

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

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

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

  1. 电视android已停止运行是什么意思,智能电视提示应用停止运行,三种方法亲测有效!...

    原标题:智能电视提示应用停止运行,三种方法亲测有效! 智能电视使用时间一长,或者是使用不当总会出现一些问题,当电视机页面出现"某软件"已经停止运行提示的时候,是什么原因导致的?自己 ...

  2. 智能电视app怎么测试软件,智能电视如何通过手机电脑安装第三方软件,两种操作方法亲测可用...

    如今在许多年轻家庭中,智能电视或网络机顶盒已经成为必备的家居用品.智能电视能安装第三方软件,拓展使用所有TV应用软件,弥补了电视系统自带应用有限的缺憾.而关于电视安装软件的方法上,多数是通过U盘安装, ...

  3. java怎么判断字符串是否为空的几种方法(亲测)

    StringUtils 第一步使用if(StringUtils.isBlank(a))判断字符串a是否为空,为空执行if语句内打印语句,使用StringUtils,需要添加commons-lang-2 ...

  4. 将Pandas中的DataFrame类型转换成Numpy中array类型的三种方法(亲测)

    在用pandas包和numpy包对数据进行分析和计算时,经常用到DataFrame和array类型的数据.在对DataFrame类型的数据进行处理时,需要将其转换成array类型,是以下列出了三种转换 ...

  5. 前端使用微信sdk上传图片的坑,及万千种方法比较实用的一种,亲测有效

    vue 公众端使用微信sdk上传图片大坑 第一个坑 第二个坑 第一个坑 使用微信sdk拿到的图片并没有base64的前缀 所以我们需要自己加 iSrc = 'data:image/jpeg;base6 ...

  6. 电视android已停止运行,智能电视提示应用停止运行 三种方法亲测有效

    智能电视使用时间一长,或者是使用不当总会出现一些问题,当电视机页面出现"某软件"已经停止运行提示的时候,是什么原因导致的?自己该怎么解决这个问题?今天当贝市场小编就来和大家说一说! ...

  7. Win10添加开机自动运行软件三种方法(亲测可用)

    Win10管理开机启动项的方法相信大家已经非常熟悉,msconfig命令各系统都通用,那么很多用户发觉Win10和Win7 XP等系统不同,没有启动文件夹,那么我们怎么添加开机启动项呢?如晨软件或程序 ...

  8. 车载媒体服务器停止运行,智能电视提示应用停止运行 三种方法亲测有效

    智能电视使用时间一长,或者是使用不当总会出现一些问题,当电视机页面出现"某软件"已经停止运行提示的时候,是什么原因导致的?自己该怎么解决这个问题?今天当贝市场小编就来和大家说一说! ...

  9. 路由传参的几种方式 亲测有效!!!!

    传参方式可划分为params 传参 和query传参,而params传参可以分为在url地址栏当中显示参数和不显示参数俩种方式 1.query 传参(显示参数)也可分为声明式和编程式 两种方式 声明式 ...

最新文章

  1. easyui datalist 动态绑定数据_一文看懂动态链接
  2. 一种基于openflow的虚拟化层软件flowvisor的API测试
  3. HDU1576 A/B 费马小定理
  4. 代码:CSS——reset.css
  5. android Android-PullToRefresh 下拉刷新
  6. 答读者问(6):有关IT培训和毕业之前的迷茫等问题
  7. php字符型和数字型的注入,Sql注入的分类:数字型+字符型
  8. HTTPS实战之单向验证和双向验证
  9. mysql 多个命令行,5.8.2.1在Windows命令行中启动多个MySQL实例
  10. java中foreach怎么访问_JAVA中的foreach怎么用
  11. Reproxy:边缘服务器反向代理工具
  12. html页面缩小图片缩小,如何缩小html页面中的图片大小?
  13. 斯蒂文斯理工学院计算机专业,斯蒂文斯理工学院的计算机专业如何?
  14. 课设——八皇后问题(N皇后解决)
  15. MDN和IMSI码详细解释
  16. CH55x使用Arduino编程记录(三)Could not get xxx consecutive bytes in internal RAM for area OSEG
  17. linux下oracle11G DG搭建(三):围绕备库搭建操作
  18. python自动化测试 namp端口扫描
  19. 命令行模拟post请求
  20. 【蓝桥杯省赛真题8】Scratch踢足球 少儿编程scratch蓝桥杯省赛真题讲解

热门文章

  1. linux高级编程有作用吗,Linux 高级编程
  2. Oracle导入到不同的角色,oracle 不同版本之间的导入导出
  3. ES的多种搜索机制:query string search,query DSL,query filter,full-text search,phrase search,highlight search
  4. 16_Android生命周期再介绍,通过androidconfigChanges属性让界面旋转时不改变状态中保留的值
  5. 窗口分析函数_4_计算累加值
  6. nc65语义模型设计_文本匹配方法系列––多维度语义交互匹配模型
  7. 使用malloc创建头结点的坑
  8. Nc105-二分查找-II
  9. Android回调的简单理解
  10. 天猫上线“商家售后服务评价”功能,消费者体验将纳入商家考核指标