什么是mognodb副本集官网上这么描述
为什么需要副本集
副本集复制原理参考这个博客MongoDB 副本集的原理、搭建、应用 当Primary节点完成数据操作后,Secondary会做出一系列的动作保证数据的同步: 副本集的同步和主从同步一样,都是异步同步的过程,不同的是副本集有个自动故障转移的功能。其原理是:slave端从primary端获取日志,然后在自己身上完全顺序的执行日志所记录的各种操作(该日志是不记录查询操作的),这个日志就是local数据 库中的oplog.rs表,默认在64位机器上这个表是比较大的,占磁盘大小的5%,oplog.rs的大小可以在启动参数中设 定:–oplogSize 1000,单位是M。 注意:在副本集的环境中,要是所有的Secondary都宕机了,只剩下Primary。最后Primary会变成Secondary,不能提供服务。 基于docker搭建最简单的副本集基本思路是这个以下所有文件的项目地址在这里 配置docker环境这里省略,我当前的环境如下:
编写 |
version: '2' services: mongo1: image: awarecloud.com.cn/mongodb:latest container_name: "mongo1" ports: - "30001:27017" volumes: - /opt/replset/mongo1:/data/db command: mongod --replSet yw_replset restart: "always" networks: mongo_replset: ipv4_address: 162.16.1.10 mongo2: image: awarecloud.com.cn/mongodb:latest container_name: "mongo2" ports: - "30002:27017" volumes: - /opt/replset/mongo2:/data/db command: mongod --replSet yw_replset restart: "always" networks: mongo_replset: ipv4_address: 162.16.1.11 mongo3: image: awarecloud.com.cn/mongodb:latest container_name: "mongo3" ports: - "30003:27017" volumes: - /opt/replset/mongo3:/data/db command: mongod --replSet yw_replset restart: "always" networks: mongo_replset: ipv4_address: 162.16.1.12 #mongo-repl: # image: replset-mongo-config # container_name: mongo-repl # links: # - mongo1:mongo1 # - mongo2:mongo2 # - mongo3:mongo3 # networks: # mongo_replset: # ipv4_address: 162.16.1.13 networks: mongo_replset: driver: bridge driver_opts: com.docker.network.enable_ipv6: "false" ipam: driver: default config: - subnet: 162.16.1.0/24 gateway: 162.16.1.1 |
执行命令docker-compose up -d
,复本集群就搭建完成了,连接mongo1,插入数据,在mongo2中查询,就可以看到了,默认SECONDARY
不支持查询操作,需要执行命令rs.setSlaveOk()
,然后执行查询,就没问题了
replset.sh
执行 sh replset.sh 初始化副本集相关信息
查看副本集信息
mongo --host 192.168.10.158 --port 30003
rs.status()
副本节点不支持查询操作, db.getMongo().setSlaveOk() 当前session有效
查看复制的情况
db.printSlaveReplicationInfo()
注意
上面有几个点比较关键
slaveOk: true
,这样才能从SECONDARY
节点取数据readPreference: secondary
,设定只能从SECONDARY
节点取数据readPreference: nearest
,实现负载均衡docker stop mongo1
关掉主节点,你会发现mongo2,或者是mongo3就会自动变成主节点,docker start mongo1
,重新启动mongo1,发现它会变为SECONDARY
节点,并自动同步这down掉期间写入的数据readPreference参数解释
primary
默认参数,只从主节点上进行读取操作;primaryPreferred
大部分从主节点上读取数据,只有主节点不可用时从secondary节点读取数据。secondary
只从secondary节点上进行读取操作,存在的问题是secondary节点的数据会比primary节点数据“旧”。secondaryPreferred
优先从secondary节点进行读取操作,secondary节点不可用时从主节点读取数据;nearest
不管是主节点、secondary节点,从网络延迟最低的节点上读取数据。
|