经验首页 前端设计 程序设计 Java相关 移动开发 数据库/运维 软件/图像 大数据/云计算 其他经验
当前位置:技术经验 » 数据库/运维 » MongoDB » 查看文章
MongoDB 复制(副本集)学习笔记
来源:jb51  时间:2019/10/24 14:22:06  对本文有异议

本文实例讲述了MongoDB 复制(副本集)。分享给大家供大家参考,具体如下:

replication set复制集,
复制集,多台服务器维护相同的数据副本,提高服务器的可用性。
MongoDB复制是将数据同步在多个服务器的过程。
复制提供了数据的冗余备份,并在多个服务器上存储数据副本,提高了数据的可用性, 并可以保证数据的安全性。
复制还允许您从硬件故障和服务中断中恢复数据。

设置过程:

(1)创建示例

假设创建三台,创建三个实例目录和日志目录:
mkdir /home/m17 /home/m18 /home/m19 /home/mlog
启动三个示例,端口分别为27017、27018、27019。

  1. ./mongod --dbpath=/home/m17 --logpath=/home/mlog/m17.log --fork --port=27017 --replSet=rs2 --smallfiles
  2. ./mongod --dbpath=/home/m18 --logpath=/home/mlog/m18.log --fork --port=27018 --replSet=rs2 --smallfiles
  3. ./mongod --dbpath=/home/m19 --logpath=/home/mlog/m19.log --fork --port=27019 --replSet=rs2 --smallfiles
  4.  

说明:

参数--replSet设置一样,才能属于同一个复制集
参数--smallfiles可以节省空间,提高速度。

然后使用ps aux | grep mongo可以查看到启动起来的三个端口。

(2)配置

使用客户端连接mongo进行配置:

  1. [test@localhost bin]$ ./mongo
  2.  

要管理配置,所以切换到admin上:

  1. >use admin
  2.  

(配置是json格式)

  1. var rsconf = {
  2. _id:'rs2',
  3. members:[
  4. {"_id":0,host:'192.168.8.172:27017'},
  5. {_id:1,host:'192.168.8.172:27018'},
  6. {_id:2,host:'192.168.8.172:27019'}
  7. ]
  8. }
  9.  

如果没有配置ip,使用127.0.0.1

  1. var rsconf = {
  2. _id:'rs2',
  3. members:[
  4. {_id:0,host:'127.0.0.1:27017'},
  5. {_id:1,host:'127.0.0.1:27018'},
  6. {_id:2,host:'127.0.0.1:27019'}
  7. ]
  8. }
  9.  

执行后,使用 printjson(rsconf)查看刚才的配置。

然后执行初始化:

  1. >rs.initiate(rsconf);
  2. > rs.initiate(rsconf);
  3. {
  4. "ok" : 1,
  5. "operationTime" : Timestamp(1539933041, 1),
  6. "$clusterTime" : {
  7. "clusterTime" : Timestamp(1539933041, 1),
  8. "signature" : {
  9. "hash" : BinData(0,"AAAAAAAAAAAAAAAAAAAAAAAAAAA="),
  10. "keyId" : NumberLong(0)
  11. }
  12. }
  13. }
  14. rs2:SECONDARY>
  15.  

查看节点:

  1. rs.status()
  2.  

删除节点:

  1. rs.remove('127.0.0.1:27019')
  2.  

添加节点:

  1. rs.add('127.0.0.1:27019')
  2.  

切换节点:

默认是在27017端口,即rs2:PRIMARY>状态,
退出mongo客户端命令模式,
切换到另一个端口:

  1. [test@localhost bin]$ ./mongo --port=27018
  2.  

即切换到rs2:SECONDARY>状态。

测试:

在主服务上,创建库和集合,

  1. rs2:PRIMARY> use student
  2. switched to db student
  3. rs2:PRIMARY> db.user.insert({uid:1,name:'zhang san'})
  4. WriteResult({ "nInserted" : 1 })
  5. rs2:PRIMARY> db.user.find();
  6. { "_id" : ObjectId("5bc9889f85a0986431fd2499"), "uid" : 1, "name" : "zhang san" }
  7.  

去从服务上查看

show dbs

然后看到有错误,具体错误信息是:

...
"errmsg" : "not master and slaveOk=false",
...

是因为slave默认不允许读写:

  1. >rs.slaveOk();
  2.  

然后就可以看到主服务器创建的库和集合了。

同理27019也需要执行这个命令才能自动同步和读写。

当主服务器27017停掉的时候,
第二个27018就自动变成主服务器master状态。
但是27019需要再次执行rs.slaveOk()才能自动同步读写。

shell脚本:

  1. #!/bin/bash
  2. IP=127.0.0.1
  3. NA=rs2
  4. sudo mkdir -p /home/m17 /home/m18 /home/m19 /home/mlog
  5. sudo chmod -R 777 /home/m17 /home/m18 /home/m19 /home/mlog
  6. ./mongod --dbpath=/home/m17 --logpath=/home/mlog/m17.log --fork --port=27017 --replSet=${NA} --smallfiles
  7. ./mongod --dbpath=/home/m18 --logpath=/home/mlog/m18.log --fork --port=27018 --replSet=${NA} --smallfiles
  8. ./mongod --dbpath=/home/m19 --logpath=/home/mlog/m19.log --fork --port=27019 --replSet=${NA} --smallfiles
  9. ./mongo <<EOF
  10. use admin
  11. var rsconf = {
  12. _id:'rs2',
  13. members:[
  14. {_id:0,host:'${IP}:27017'},
  15. {_id:1,host:'${IP}:27018'},
  16. {_id:2,host:'${IP}:27019'}
  17. ]
  18. }
  19. rs.initiate(rsconf)
  20.  

希望本文所述对大家MongoDB数据库程序设计有所帮助。

 友情链接:直通硅谷  点职佳  北美留学生论坛

本站QQ群:前端 618073944 | Java 606181507 | Python 626812652 | C/C++ 612253063 | 微信 634508462 | 苹果 692586424 | C#/.net 182808419 | PHP 305140648 | 运维 608723728

W3xue 的所有内容仅供测试,对任何法律问题及风险不承担任何责任。通过使用本站内容随之而来的风险与本站无关。
关于我们  |  意见建议  |  捐助我们  |  报错有奖  |  广告合作、友情链接(目前9元/月)请联系QQ:27243702 沸活量
皖ICP备17017327号-2 皖公网安备34020702000426号